-
Tcp 报文格式简介
-
tcp报文由tcp header和tcp数据组成。
-
tcp header 的最大长度为60字节,而必须要有的固定长度也就是图一的前5层的20字节,每层占有32bit,也就是32/8=4字节,5层,5*4 = 20字节,那么第六层的可选项和填充也就是Tcp Options字段最大为60-20=40字节。填充是为了使TCP首部为4字节(32bit)的整数倍。
用wireshark抓包软件可以清楚的查看到相关信息。这是一个tcp报头的详细信息,红框标出的为1000........Header Length = 32字节(8),即8*4 = 32,蓝色部分也就是header的所有数据,两行共计32字节,而在Header Length = 1111,也就是15时,15*4 = 60字节,达到Header Length的最大长度。
接着我们再看一个tcp报头信息,蓝色部分为tcp header 的所有内容,与图二比较可以看出,只要20字节,这也就是tcp header的必须要有的固定长度20字节,接着看红框标出的内容,0101.......Header Length = 20字节(5),即5*4 = 20字节。
-
Tcp Options字段
根据上文我们可以知道Tcp Options字段的最大长度为40字节。Tcp Options字段的一般数据结构如图所示:
Kind(1字节) | Length(1字节) | Info(n字节) |
Tcp报文头部选项字段(Tcp Options字段)的一般结构
选项的第一个字段kind说明选项的类型。有的TCP选项没有后面两个字段,仅包含1字节的kind字段。第二个字段length(如果有的话)指定该选项的总长度,该长度包括kind字段和length字段占据的2字节。第三个字段info(如果有的话)是选项的具体信息。常见的TCP选项有7种,详细内容请移步https://blog.csdn.net/blakegao/article/details/19419237
接着我们对tcp包进行分析,图五的tcp报文header中的Options字段共有20字节
-
第一个kind= 2,表示最大报文段长度(Max Segment Size,MSS),TCP模块通常将MSS设置为(MTU-40)字节(减掉的这40字节包括20字节的TCP头部和20字节的IP头部)。这样携带TCP报文段的IP数据报的长度就不会超过MTU(假设TCP头部和IP头部都不包含选项字段,并且这也是一般情况),从而避免本机发生IP分片。对以太网而言,MSS值是1460(1500-40)字节。而图五中最大报文长度为1320字节,这当然也是可以的。
-
kind= 4,表示支持SACK,详情移步上边链接。
-
kind = 8,代表Timestamps,即时间戳,启用Timestamp Option后,每个TCP Segment中都会带有Timestamp Option,其中包含了两个32bit的Timestamp也就是各四个字节的Timestamp Value(TSval)和Timestamp Echo Reply(TSecr)。发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段值复制到时间戳回送回答字段。因此,发送方在收到确认报文后,可以准确计算出RTT。
具体参考请https://blog.csdn.net/mary19920410/article/details/77255967 以及https://blog.csdn.net/blakegao/article/details/19419237