TCP报文段的首部格式
概述
TCP报文段首部的前20个字节是固定的,因此TCP首部的最小长度是20字节。
源端口和目标端口
各占2个字节,分别写入源端口号和目的端口号。
序列号
占4个字节,表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从 0 开始。
确认号
占4个字节,是期望收到对方写一个报文段的第一个数据字节的序号。若确认号=N,则表明:到序号N-1为止的所有数据都已正确收到。
数据偏移(TCP首部长度)
占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度,由于4位二进制数能够表示的最大十进制数字是15,因此数据偏移的最大值是60字节,这也是TCP首部的最大长度。
紧急URG控制位
当URG=1时,表明紧急指针字段有效。它告诉系统此报文中有紧急数据,应尽快传送,而不要按原来的排队顺序来传送。当URG置1时,发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。这时要与首部中的紧急指针字段配合使用。
确认ACK控制位
仅当ACK=1时,确认号字段才有效,TCP规定,在连接建立后的所有传送的报文段都必须要ACK置1。
推送PSH控制位
发送方TCP把PSH置1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
复位RST控制位
当RST=1时,表明TCP连接中出现了严重差错,必须释放连接,然后再重新建立运输连接。
同步SYN控制位
在连接建立时用来同步序号,当SYN=1而ACK=0时,表明这是一个连接请求报文段。对*同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。因此,SYN置为1就表示这是一个连接请求或连接接受请求。
终止FIN控制位
用来释放一个连接。当FIN=1时,表明此段报文段的发送发的数据已经发送完毕,并要求释放运输连接。
窗口
占2个字节。窗口指的是发送本报文段的接受窗口。窗口值告诉对方:从本报文段首部中的确认好算起,接收方目前允许对方发送的数据量。窗口值作为接收方法让发送方设置其发送窗口的依据。窗口字段明确指出了现在允许对方发送的数据量。窗口值是经常动态变化的。
紧急指针
占2个字节。指出本报文段中紧急数据的字节数。
选项
长度可变,最长可达40字节。当没有使用“选项”时,TCP的首部长度是20字节。
选项部分的应用:
- MSS最大报文段长度(Maxium Segment Size):指明数据字段的最大长度,数据字段的长度加上TCP首部的长度才等于整个TCP报文段的长度。MSS值指示自己期望对方发送TCP报文段时那个数据字段的长度。通信双方可以有不同的MSS值。如果未填写,默认采用536字节。MSS只出现在SYN报文中。即:MSS出现在SYN=1的报文段中。
- 窗口扩大选项(Windows Scaling):由于TCP首部的窗口大小字段长度是16位,所以其表示的最大数是65535。但是随着时延和带宽比较大的通信产生(如卫星通信),需要更大的窗口来满足性能和吞吐率,所以产生了这个窗口扩大选项。
- SACK选择确认项(Selective Acknowledgements):用来确保只重传缺少的报文段,而不是重传所有报文段。比如主机A发送报文段1、2、3,而主机B仅收到报文段1、3。那么此时就需要使用SACK选项来告诉发送方只发送丢失的数据。那么又如何指明丢失了哪些报文段呢?使用SACK需要两个功能字节。一个表示要使用SACK选项,另一个指明这个选项占用多少字节。描述丢失的报文段2,是通过描述它的左右边界报文段1、3来完成的。而这个1、3实际上是表示序列号,所以描述一个丢失的报文段需要64位即8个字节的空间。那么可以推算整个选项字段最多描述(40-2)/8=4个丢失的报文段。
- 时间戳选项(Timestamps):可以用来计算RTT(往返时间),发送方发送TCP报文时,把当前的时间值放入时间戳字段,接收方收到后发送确认报文时,把这个时间戳字段的值复制到确认报文中,当发送方收到确认报文后即可计算出RTT。也可以用来防止回绕序号PAWS,也可以说可以用来区分相同序列号的不同报文。因为序列号用32为表示,每2^32个序列号就会产生回绕,那么使用时间戳字段就很容易区分相同序列号的不同报文。
- NOP(NO-Operation):它要求选项部分中的每种选项长度必须是4字节的倍数,不足的则用NOP填充。同时也可以用来分割不同的选项字段。如窗口扩大选项和SACK之间用NOP隔开。