TCP/UDP首部信息
- TCP首部
- 第一个4字节
- 第二个4字节与第三个4字节
- 第四个4字节
- 第五个4字节
- 选项
- 最大报文段长度(MSS)选项
- 窗口扩大选项
- 时间戳选项
- 什么时候发送RST包
- UDP首部
TCP首部
TCP 首部长度为20字节,加上选项部分最大可达60字节。
第一个4字节
- 源端口,16位;发送数据的源进程端口。
- 目的端口,16位;接收数据的进程端口。
由于端口号最多为16位,因此端口号最大值为65535。
第二个4字节与第三个4字节
- 序号,32位;代表当前TCP数据段第一个字节占整个字节流的相对位置。
- 确认号,32位;代表接收端希望接收的数据序号,为上次接收到数据报的序号+1,当ACK标志位为1时才生效。
第四个4字节
- 数据偏移,4位;实际代表TCP首部长度,最大为60字节。
- 6个标志位,每个标志位1位:
- SYN,为同步标志,用于数据同步;
- ACK,为确认序号,ACK=1时确认号才有效;
- FIN,为结束序号,用于发送端提出断开连接;
- URG,为紧急序号,URG=1是紧急指针有效;
- PSH,指示接收方立即将数据提交给应用层,而不是等待缓冲区满;
- RST,重置连接。
- 窗口值,16位;窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口)。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。
第五个4字节
- 校验和,16位;用于检验数据完整性。
- 紧急指针,16位;只有当URG标识位为1时,紧急指针才有效。紧急指针的值与序号的相加值为紧急数据的最后一个字节位置。用于发送紧急数据。
选项
长度可变,最长可达40字节。当没有使用“选项”时,TCP的首部长度是20字节,加上选项部分最大可达60字节。
最大报文段长度(MSS)选项
TCP最初只规定了一种选项,即最大报文段长度MSS(Maximum Segment Szie)。MSS是每一个TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。所以MSS并不是整个TCP报文段的最大长度,而是“TCP报文段长度减去TCP首部长度。
为什么要规定一个最大报文长度MSS呢?这并不是考虑接受方的接收缓存可能存放不下TCP报文段中的数据。实际上,MSS与接收窗口值没有关系。我们知道,TCP报文段的数据部分,至少要加上40字节的首部(TCP首部20字节和IP首部20字节,这里还没有考虑首部中的可选部分)才能组装成一个IP数据报。若选择较小的MSS长度,网络的利用率就降低。设想在极端情况下,当TCP报文段只含有1字节的数据时,在IP层传输的数据报的开销至少有40字节(包括TCP报文段的首部和IP数据报的首部)。这样,对网络的利用率就不会超过1/41。到了数据链路层还要加上一些开销。但反过来,若TCP报文段非常长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片组成成原来的TCP报文段,当传输出错时还要进行重传,这些也都会使开销增大。
因此,MSS应尽可能大些,只要在IP层传输时不需要分片就行。由于IP数据报所经历的路径是动态变化的,因此在这条路径上确定的不需要的分片的MSS,如果改走另一条路径就可能需要进行分片。因此最佳的MSS是很难确定的。在连接过程中,双方都把自己能够支持的MSS写入这一字段,以后就按照这个数值传输数据,两个传送方向可以有不同的MSS值。若主机未填写这一项,则MSS的默认值是536字节长。因此,所有在互联网上的主机都应该接受的报文段长度是536+20(固定首部长度)=556字节。
窗口扩大选项
窗口扩大选项是为了扩大窗口。我们知道,TCP首部中窗口字段长度是16位,因此最大的窗口大小为64K字节。虽然这对早期的网络是足够用的,但对于包含卫星信道的网络,传播时延和宽带都很大,要获得高吞吐量需要更大的窗口大小。
窗口扩大选项占3字节,其中有一个字节表示移位值S。新的窗口值等于TCP首部中的窗口位数从16增大到(16+S)。移位值允许使用的最大值是14,相当于窗口最大值增大到2(16+14) - 1 = 2 30-1。
窗口扩大选项可以在双方初始建立TCP连接时进行协商。如果连接的某一端实现了窗口扩大,当它不再需要扩大其窗口时,可发送S=0选项,使窗口大小回到16。
时间戳选项
时间戳选项占10字节,其中最主要的字段是时间戳字段(4字节)和时间戳回送回答字段(4字节)。时间戳选项有以下两个作用:
第一、 用来计算往返时间RTT。发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段复制到时间戳回送回答字段。因此,发送方在收到确认报文后,可以准确地计算出RTT来。
第二、 用于处理TCP序号超过232的情况,这又称为防止序号绕回PAWS。我们知道,TCP报文段的序号只有32位,而每增加232个序号就会重复使用原来用过的序号。当使用高速网络时,在一次TCP连接的数据传送中序号很可能被重复使用。例如,当使用1.5Mbit/s的速度发送报文段时,序号重复要6小时以上。但若用2.5Gbit/s的速率发送报文段,则不到14秒钟序号就会重复。为了使接收方能够把新的报文段和迟到很久的报文段区分开,则可以在报文段中加上这种时间戳。
什么时候发送RST包
- 建立连接的SYN到达某端口,但是该端口上没有正在监听的服务。
- 主机收到了一个根本不存在的连接上的分节。
- 请求超时。
UDP首部
UDP首部的长度为8个字节,共包含以下四个部分,每个部分为2个字节:
- 源端口号:发送方的端口号,范围(0~65535)
- 目的端口号: 接收者的端口号,范围(0~65535)
- 长度:表示UDP报文段的长度(包括首部和数据)
- 校验和:接收方用于校验该报文段中是否存在了差错