博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

https://blog.csdn.net/yao5hed/article/details/81288072?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase

 

 

 

 

 

 

 

 

 

链路层的一个作用就是数据成帧,帧包括了head和data,而data有大小限制,就是常说的MTU,对以太网来说是1500字节。

data包括了上层的网络层head和传输层head,这两个head共占了40字节,剩下的数据大小不能超过1460字节,也就是MMS【数据净荷】

以太网MTU值为1500字节,802.3的MTU值为1492字节。

MSS

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

 

 

 

 

 

  • 分段 Segment

MSS是TCP数据包每次能够传输的最大数据分段,TCP报文段的长度大于MSS时,要进行分段传输。TCP协议在建立连接的时候通常要协商双方的MSS值,这是在三次握手的前两次实现的,两端会在首部写入MSS选项,即Option部分,最终取二者的提出的MSS的较小值,经常是1460。在wireshark中能看到:

 

 

 

也就是说TCP连接根据MSS要在传输层进行分段(Segment)与重组

 

  • 分片 Fragment

再看网络层,这一层涉及到了分片(Fragment)问题。一个IP数据报在以太网中传输,如果它的长度大于MTU,就要进行分片传输,使得每片数据报的长度小于MTU。分片传输的IP数据报不一定按序到达,但IP首部中的信息能让这些数据报片按序组装。IP数据报的分片与重组是在网络层进完成的。

这样TCP连接的特点就出现了:因为在传输层根据MSS进行了分段,使得每个数据包小于MSS,那到了链路层肯定也是小于MTU的,这样就不必在网络层进行分片了

IP分片用于UDP和ICMP等协议,因为它们不会在传输层分段

 

IP数据报分片,只有第一片带有UDP首部或ICMP首部,其余的分片只有IP头部,到了目标主机而不是下一站后根据IP头部中的信息在网络层进行重组。

TCP报文段的每个分段中都有TCP首部,到了对端后根据TCP首部的信息在传输层进行重组。

 

  • TCP的分段传输:

 

 


UDP的分片传输:

 

 

 


网络通信尽可能避免IP分片【网络层】,原因:
- 负责IP分片的主机、路由器会花费很多CPU资源处理分片,同时负责重组分片的主机、路由器需要更多的CPU资源。
- 分片中,如果某个片丢失,会造成整个IP数据报作废,需要重新传整个数据报,而IP层本身没有超时重传机制,由更高层(比如TCP)来负责超时和重传。

TCP避免IP分片的方法一个是上面说的TCP分段,另一个是路径MTU


=========

https://blog.csdn.net/renwotao2009/article/details/51488596

MTU与IP分片

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

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

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

 

 

而其他的分片比如第2715号包包含一个More fragment = 1的Flag,如下图所示,因此接收方知道后续还有更多的分片,所以先缓存着不重组

IP分片导致的网络攻击方式就是持续发送More fragment为1的包,导致接收方一直缓存分片,从而耗尽内存。

 

 

IP分片的缺点
IP分片可以导致网络攻击,如上所述。

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

  • MSS与TCP分组

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


注:建议使用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网络分析的艺术
————————————————

 

=========

TCP的MSS(Maximum Segment Size,最大报文段长度)决定的,TCP在发起连接的第一个报文的TCP头里通过MSS这个可选项告知对方本端能够接收的最大报文(当然,这个大小是TCP净荷的大小),以太网上这个值一般设置成1460,因为1460Byte净荷+20Byte TCP头+20Byte IP头 = 1500字节,正好符合链路层最大报文的要求。

 

至于收到一个报文后如何确定它是一个"TCP segment"?如果有几个报文的ACK序号都一样,并且这些报文的Sequence Number都不一样,并且后一个Sequence Number为前一个Sequence Number加上前一个报文大小再加上1的话,肯定是TCP segment了,对于没有ACK标志时,则无法判断。