TCP报文段的首部格式

TCP报文段的首部格式

TCP报文段首部的前20字节是固定的,后40字节是可选的。

TCP报文首部数据结构示意图

源端口:16位(2字节),0-65535

目的端口:16位(2字节),0-65535

序号:32位(4字节),0-2^32-1,循环使用

确认号:32位(4字节),循环使用。期望收到对方下一个报文段的第一个数据字节的序号。一般是收到的上一个报文的序号+报文长度+1

数据偏移:4位,0-15,因为选项段的长度未知(0-40字节),所以数据的起始位置是未知的,此字段表示数据起始位置相对于TCP报文段的偏移。单位是4字节(32位),所以能够表示的偏移量是0-60字节,而TCP的头部最长正好是60字节。

保留:6位,暂未使用

URG:紧急。URG=1时表明紧急指针字段有效。告诉系统此段报文是紧急书,尽快传送。TCP发送方把紧急数据插入到发送队列的最前端,尽快发送。

ACK:确认(acknowledge)。仅当ACK=1的时候确认号字段才有效。当ACK=0时确认号无效。TCP规定,在链接建立后所有传送的报文段都必须把ACK置1。

PUSH:推送。当一端的应用程序在键入一个命令后立即能够收到对方的相应时使用。接收方收到PUSH=1的报文段会尽快缴费接收应用进程,不再等待整个缓冲区填满之后再向上交付。

RST:复位。当RST=1时,表明TCP连接中出现严重差错(如主机崩溃等),必须释放连接,然后重新建立连接。

SYN:同步(synchronization)。在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。若对方同意建立连接,则应该在响应的报文段中使用SYN=1和ACK=1。

FIN:终止(FINS)。用来释放一个连接,当FIN=1时,表明此报文的发送方的数据已发送完毕,要求释放链接。

窗口:16位(2字节)。0-65535,单位字节。表示自己的接收窗口(而不是发送窗口)。窗口值告诉对方,从本报文首部中的确认号算起,我方目前允许对方发送的数量。设确认号是701,窗口字段是1000。这就表明,从701号算起,发送此报文段的一方还有接收1000个字节数据(字节序号是701~1 700)的接收缓存空间。

校验和:16位(2字节)。校验范围包括首部和数据部分,也包括TCP报文前部的12字节伪首部。

紧急指针:16位(2字节)。紧急指针仅在URG=1时候才有意义。它指出报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。即使对方窗口为0时,也会发送紧急数据。

选项:长度可变,最长可达40字节。当选项长度为0时,TCP首部长度是20字节。

TCP最初只定义了一个一种选项:最大报文长度段MSS(Max Segment Size)。MSS应该尽量大,这样TCP的传输效率更高,但又不能大于网络层的分片最大值,不然会在网络层会进行分片。若主机未填写这一项,则默认MSS是536。

后续又增加了窗口扩大选项、时间戳选项和选择确认选项。

窗口扩大选项为了扩大窗口。默认窗口选项只有16位,只能表示最大64K的窗口。对于大宽带、高延时的网络不友好。窗口扩大选项占3字节,最大允许使用值是14,因此窗口最大值为2^(16+14)-1 = 2^30-`1。

窗口扩大选项可以在双方初始建立TCP连接时进行协商。如果连接某一端实现了窗口扩大,当它不再需要扩大窗口时,可发送S=0,使其窗口大小回到16。

时间戳选项占10字节,主要有2个用途:1.计算往返时间RTT,用于处理TCP序号超过2^32的情况。防止序号绕回。

文章来源:《计算机网络》谢希仁