TCP协议学习笔记1-TCP报头
OHY 2006-11-26
TCP称为面向连接的协议,因为进程在交换数据之前必须先彼此建立通信连接。TCP也被称为可靠的协议,因为握手、校验以及序列号和确认号等使源主机可验证数据已正确地到达目的主机。
TCP报文段由报头和可选的数据组成(也可能传输不含数据的报头,用于发送状态或控制信息)。术语“报文段”表示单个TCP报文段只是完整TCP数据传输的一部分。实际上,每次成功的数据传输至少需要2个报文段。源主机发送一个或多个包含数据的报文段,目的主机也发送一个或多个报文段确认已接收到的数据。一次确认可确认多个报文段。与此相反,每个UDP数据报都是独立的单元,不需要额外的通信。
与UDP一样,TCP使用端口号表示源和目的主机的进程。
两个进程使用TCP发送和接收数据之前,首先要通过3此握手建立进程所在的计算机之间的连接。在完成握手时,每台计算机都要确认握手中指定的端口可用于接收来自另一台计算机指定端口的通信。然后,双方都可以使用连接向对方计算机发送TCP报文段。
在通过已建立的连接接收到数据时,目的主机响应,返回数据是否已正确到达、是否可以发送更多的数据信息。如果可以,还要返回目的主机能接收新数据的数量。
要关闭连接,双方都需要发送关闭连接的请求,并且等待对方对请求的确认。
一、TCP报头
TCP报文段的报头有10个必需的字段和1个可选字段。报头至少为20字节。报头后面的数据是可选项。
1、源端口号(16位)
标识发送报文的计算机端口或进程。一个TCP报文段必须包括源端口号,使目的主机知道应该向何处发送确认报文。
2、目的端口号(16位)
标识接收报文的目的主机的端口或进程。
3、序列号(32位)
用于标识每个报文段,使目的主机可确认已收到指定报文段中的数据。当源主机用于多个报文段发送一个报文时,即使这些报文到达目的主机的顺序不一样,序列号也可以使目的主机按顺序排列它们。
在建立连接时发送的第一个报文段中,双方都提供一个初始序列号。TCP标准推荐使用以4ms间隔递增1的计数器值作为这个初始序列号的值。使用计数器可以防止连接关闭再重新连接时出现相同的序列号。
对于那些包含数据的报文段,报文段中第一个数据字节的数量就是初始序列号,其后数据字节按顺序编号。如果源主机使用同样的连接发送另一个报文段,那么这个报文段的序列号等于前一个报文段的序列号与前一个报文段中数据字节的数量之和。例如,假设源主机发送3个报文段,每个报文段有100字节的数据,且第一个报文段的序列号是1000,那么第二个报文段的序列号就是1100(1000+100),第三个报文段的序列号就是1200(1100+100)。
如果序列号增大至最大值将复位为0。
4、确认号(32位)
目的主机返回确认号,使源主机知道某个或几个报文段已被接收。如果ACK控制位被设置为1,则该字段有效。确认号等于顺序接收到的最后一个报文段的序号加1,这也是目的主机希望下次接收的报文段的序号值。返回确认号后,计算机认为已接收到小于该确认号的所有数据。
例如,序列号等于前一个报文段的序列号与前一个报文段中数据字节的数量之和。例如,假设源主机发送3个报文段,每个报文段有100字节的数据,且第一个报文段的序列号是1000,那么接收到第一个报文段后,目的主机返回含确认号1100的报头。接收到第二个报文段(其序号为1100)后,目的主机返回确认号1200。接收到第三个报文段后,目的主机返回确认号1300。
目的主机不一定在每次接收到报文段后都返回确认号。在上面的例子中,目的主机可能等到所有3个报文段都收到后,再返回一个含确认号1300的报文段,表示已接收到全部1200字节的数据。但是如果目的主机再发回确认号之前等待时间过长,源主机会认为数据没有到达目的主机,并自动重发。
上面的例子中,如果目的主机接收到了报文段号为1000的第一个报文段以及报文段号为1200的最后一个报文段,则可返回确认号1100,但是再返回确认号1300之前,应该等待报文段号为1100的中间报文段。
5、报文长度(4位)
由于TCP报头的长度随TCP选项字段内容的不同而变化,因此报头中包含一个指定报头字段的字段。该字段以32比特为单位,所以报头长度一定是32比特的整数倍,有时需要在报头末尾补0。如果报头没有TCP选项字段,则报头长度值为5,表示报头一个有160比特,即20字节。
6、保留位(6位)
全部为0。
7、控制位(6位)
URG:报文段紧急。
ACK:确认号有效。
PSH:建议计算机立即将数据交给应用程序。
RST:复位连接。
SYN:进程同步。在握手完成后SYN为1,表示TCP建立已连接。此后的所有报文段中,SYN都被置0。
FIN:源主机不再有待发送的数据。如果源主机数据发送完毕,将把该连接下要发送的最后一个报文段的报头中的FIN位置1,或将该报文段后面发送的报头中该位置1。
8、窗口(16位)
接收计算机可接收的新数据字节的数量,根据接收缓冲区可用资源的大小,其值随计算机所发送的每个报文段而变化。源主机可以利用接收到的窗口值决定下一个报文段的大小。
9、校验和(16位)
源主机和目的主机根据TCP报文段以及伪报头的内容计算校验和。在伪报头中存放着来自IP报头以及TCP报文段长度信息。与UDP一样,伪报头并不在网络中传输,并且在校验和中包含伪报头的目的是为了防止目的主机错误地接收存在路由的错误数据报。
10、紧急指针(16位)
如果URG为1,则紧急指针标志着紧急数据的结束。其值是紧急数据最后1字节的序号,表示报文段序号的偏移量。例如,如果报文段的序号是1000,前8个字节都是紧急数据,那么紧急指针就是8。紧急指针一般用途是使用户可中止进程。
11、TCP选项(0或更大)
完整的TCP报头必须是32比特的整数倍,为了达到这一要求,常在TCP选项字段的末尾补零。
12、数据部分
报头后面是可选的报文段数据部分。IP协议标准要求株距能接收最长达576字节的数据报。无其他选项的IP报头是20字节,无其他选项的TCP报头也是20字节,所以IP选项和TCP选项且含有多达536字节数据的TCP报文段无须分片就可达到目的主机。