IP分片和TCP分段

MTU和MSS的概念

MTU

最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。
例如:以太网MTU值为1500字节,802.3的MTU值为1492字节。

MSS

最大分段长度(Maximum Segment Size)是TCP协议头部的一个选项,MSS是指TCP报文能够携带的最大数据长度,单位为字节。

MTU与IP分片

不论何种协议的链路层,都会对网络分组的长度有一个限制,因此提出了MTU的概念。如以太网的的MTU值为1500字节,若IP层(网络层)的报文长度大于MTU值时,IP报文就会被分片成小于或等于MTU值的报文。IP头部也对IP报文分片做了支持,如下图:

IP分片和TCP分段_第1张图片

由IP包的总长度为16位(2字节)字段可知IP报文的最大长度为65535字节。其中16位的标识(表明)3位标志位( 0、DF、MF)中DF(Don’t Fragment)和MF(More Fragment) 以及13位的片偏移来IP报文的分片和重组。

IP分片实例

// 在cmd 下ping 网关10.103.240.1
// ping 命令: -l表示数据长度 -n ping次数 -f设置DF标志表示不能分片
ping 10.103.240.1 -l 5000 -n 1

IP分片和TCP分段_第2张图片

IP分片重组

由上图可知,每个分片都包含off=xxx,ID=4858信息,接收方依据这两个值,把ID相同的分片按照off值(偏移量)进行重组的。

下图所示的最后一个分片,即第2716号包,它包含了一个More fragment = 0的Flag,表示最后一个分片,因此接收方可以开始重组。

IP分片和TCP分段_第3张图片

而其他的分片比如第2715号包包含一个More fragment = 1的Flag,如下图所示,因此接收方知道后续还有更多的分片,所以先缓存着不重组。IP分片导致的网络攻击方式就是持续发送More fragment为1的包,导致接收方一直缓存分片,从而耗尽内存。

IP分片和TCP分段_第4张图片

IP分组的缺点

  • IP分组可以导致网络攻击,如上所述。

  • 这种IP层的分片效率是很差的,因为必须所有分片都到达才能重组成一个包,其中任何一个分片丢失了,都必须重发所有分片。所以,TCP层会试图避免IP层执行数据报分片。

MSS与TCP分片

TCP可以避免被发送方分片,它主动把数据分成小段再交给网络层。最大的分段大小(MSS)相当于MTU刨去IP头和TCP头之后的代销,所以一个MSS恰好装进MTU中。

             ______________MTU_______________           
             |                              |
---------------------------------------------
| MAC头14字节 | IP头20字节 | TCP头20字节 | 数据 |
---------------------------------------------
                                      |      |
                                      ---MSS--

注:建议使用wireshark查看。有时TCP头不只20字节,可能包含一些TCP options,使MSS值减小,以真实情况为准。

TCP在建立连接时进行三次握手,前两个握手包中双方互相声明自己的MSS,客户端声明MSS=8960,服务器端声明了MSS=1460。三次握手之后,客户端的MTU值比服务器端大,如果发送一个9000字节的包过去可能被分片或丢弃。因此客户端会把自己的MSS也降到1460字节。

注:UDP没有MSS的概念,其数据包全部交给网络层,所以可能被分片。分片和重组都会影响性能。如果某种应用环境忽略质量,追求传输速度,那么UDP就是一个选择。语音传输符合这种情况,它在乎的不是音质而是延迟。

参考

1 Maximum segment size
2 高性能网络编程2—-TCP消息的发送
3 WireShark网络分析的艺术

你可能感兴趣的:(网络编程)