很多初学者在学习TCP协议是比较关注的是TCP头部中的各字段,往往会忽略TCP选项。本文将梳理下TCP选项中个字段的含义。
1、最大段大小MSS(Maxitum Segment Size)
种类号2,长度4(Bytes)
最大段大小是指TCP协议所允许的从对方接收到的最大报文段,因此这也是通信双方在数据交换过程中能够使用的最大报文段。
这个值是在建立tcp连接的三次握手中双端协商得到的。p1发送SYN包来请求建立连接,在这个包中,mss选项字段会填充自己一端能接收的mss值,典型值为1460,p2在回应的SYN+ACK包中的mss选项中也会填充自己的mss值(一般也为1460),双方会取两个mss中的较小者作为本次通信连接的mss。下面简单看下典型值1460是怎么来的。
首先介绍MTU(Maxitum Transmission Unit)最大传输单元。这个值和链路层协议(如以太网)有着密切联系。以太网EthernetII可以传输的最大数据帧是1518B,而以太网的帧头(包含目的MAC地址6B,源MAC地址6B,域2B)14个字节+帧尾的用于CRC校验的4个字节一共18B,这样算下来可供上层协议的传输数据的大小就成了1518-18=1500字节。这个值就是MTU。遗憾的是网络传输中的很多设备各自有不同的MTU,不过幸运的是他们基本都大于等于1500。
上层协议比较关心MTU的值,因为一旦它们传下来的数据包大小超过了MTU则会被链路层丢弃。所以在网络层中IP协议一般会更具需求将数据进行分片。IP字段中有个DF(Donot Fragment)字段,它被值位表明这个数据不能被分片,当这个数据包在网络传输中遇到MTU小于该包大小的时候,网络设备就会丢弃这个包,并向发送者传输一个错误信息。
上面讲了MTU的一些内容,下面看1460是怎么来的。
1500减去IP包头20减去TCP数据包头20就是1460了,就这么简单!当然在IPv6中IP包头是40字节,相应的这个值就是1440了。