5.8.2 TCP报文段首部格式
TCP报文段首部格式在很大程度上体现了TCP协议的功能
一、数据封装过程
如图
应用层报文传送到传输层之后,加上TCP报文段的首部构成了TCP数据传送单位,我们称之为TCP报文段。在发送时TCP报文段是作为IP数据报的数据部分,加上IP数据报的首部之后成为IP数据报,在IP数据报首部中协议字段值如果赋值为6就表示该IP数据报携带的数据是TCP的数据(5.2.3 IP数据报(一)IP数据报的格式)。
在接收时,IP数据报将其IP首部去除后交付给传输层,从而得到TCP报文段,再去掉TCP报文段首部根据相应的端口交付给应用层的应用进程。
二、TCP报文格式
TCP报文段由TCP首部和TCP数据两部分,TCP首部的前二十个字节是固定的,其后面是根据需要所增加的选项,如图所示。
-
前两个字段是源端口和目的端口,各占16个比特位,各两个字节,我们知道端口是传输层与应用层的服务接口。这其中五元组信息包括<源IP地址、源端口、目的IP地址、目的端口、传输协议>TCP可以唯一的标识一个TCP连接。
-
第二个字段是序号站32个比特位4字节,我们知道TCP是无结构的,面向字节流的,因此TCP传送的报文可以看为连续的字节流,TCP报文段中数据部分的每一个字节都进行编号,这个字段指明的是本报文段中所发送的数据部分的第一个字节的序号。
-
第三个字段是与第二个字段配对使用的,确认号,占32比特位4字节,这个字段指出的是期望收到的下一个报文段中首部的序号的值,这里需要注意的是确认号字段具有累积的效果。即如果确认号为M,就表明序号M-1为止的所有数据都已经正确的收到了。
-
第四个字段是数据偏移占4个比特位,它指出了TCP报文段中的首部长度,是以4字节为单位的。这个字段与我们学习的IP数据报首部的首部长度字段的含义是非常类似的。(5.2.3 IP数据报(一)IP数据报的格式),如果TCP报文段首部只有固定部分的话,这个值应该是5。
-
第五个字段是保留部分占6个比特位。
-
第六个字段是标志位,标志位是用于区分不同类型的TCP报文,每一个标志位只占用一个比特,一共六个标志位,相应的该位非零即一,当该标志位是1的时候,标识相应的标志位是有效的。
-
第一个标志位是URG,也就是urgent(紧急的),这个标志位表明本报文段中包含紧急数据,所以如果报文段中包含紧急数据时URG标志位为1,当然这个标志位上的取值还应该与首部后的紧急指针字段是联合在一起使用的。对于紧急指针的值如果有效的话,它表示的是在紧急数据之后的TCP的第一个字节的偏移值,所以这里我们就得出紧急数据的总长度。
-
第二个标志位是ACK,也就是Acknowledgement即是确认字符,这个标志位表明确认号字段有效,这里需要注意的是ACK如果置1的话,它并不消耗掉序号,ACK如果为零的话表示数据段不包含确认信息,此时表示第三个字段的确认号字段无效,当ACK标志位置1时,此时说明TCP需要查看首部中确认号字段是有效的。
-
第三个标志位PSH,即PUSH,它表明TCP应该尽快的将此报文段交付给应用程序,当PSH置1的时候,表明本数据段在接收方得到之后就应该直接送给应用程序,不必要等到缓存满了之后再进行发送。
-
第四个标志位**RST,即Reset,**它表明TCP连接出现严重错误,必须释放连接,然后再重新建立连接。
-
第五个标志位SYN,即同步序列编号(SynchronizeSequenceNumbers),它是在连接建立时用来同步序号。这里需要注意的是SYN是需要消耗掉一个序号的,如果这个标志位置1的话是需要消耗掉序号的。
这里如果SYN=1,而ACK=0,在TCP里就表示它是一个连接请求。
如果SYN=1且ACK=1,就表明是同意建立连接的标志。
-
第六个标志位FIN,它是用来释放一个连接,这里需要注意的是FIN置位时也是需要消耗掉一个序号的,所以当FIN=1表示发送端已经完成了发送任务,用来释放连接,表明发送方已经没有数据发送了。
-
-
第七个字段是窗口,这个字段表明当前允许发送方发送的数据量,它是以一个字节为单位的。在TCP中使用的是大小可变的滑动窗口机制进行流量控制,这里需要注意的是窗口指的是发送本报文段算起接收方目前允许发送方所发送的数据量(字节量),是接收方对发送方的流量控制,以保证接收方来得及接收数据。
-
第八个字段是校验和,校验和字段用来检查的范围包括TCP首部、TCP的数据,TCP的伪首部。这与UDP差错控制是一样的(5.7.2 UDP协议格式(一)——UDP差错控制)。当然这其中TCP的伪首部和UDP的伪首部不一样的地方在于TCP的伪首部协议字段值是6,其他都完全一样。
-
第九个字段是紧急指针,前面我们强调,只有在URG=1的情况下紧急指针位才有效,它表明的是本报文段中紧急数据的字节数。
-
最后额字段是选项字段,长度在0到40个字节之间是可变的,当然我们注意的是必须填充为4字节的整数倍,最常用的选项字段是在TCP中的最大报文段长度MSS,MSS最大报文段长度是TCP报文段中数据字段的最大长度。所以我们得出MSS的值=TCP报文段长度-TCP首部长度。