博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网络协议中的MTU和MSS
阅读量:4286 次
发布时间:2019-05-27

本文共 1412 字,大约阅读时间需要 4 分钟。

介绍了MTU和MSS的概念及计算方法,并列举两个MTU相关导致丢包的例子。

 

MTU: Maxitum Transmission Unit 最大传输单元

MSS: Maxitum Segment Size 最大分段大小

1. MTU是什么

MTU,Maxitum Transmission Unit 最大传输单元,是某层网络中不分包的情况下可传输的最大单元大小,通俗点理解就是某层网络一包数据负载的最大值。我们说MTU一般都是说链路层的,典型的以太网MTU为1500字节。

 

2. MTU的大小

根据链路层MTU的大小可以逐层推断出各层协议的最大负载。以Ethernet+IP+TCP为例,典型的协议头大小及负载大小如下图所示:

 

1) 以太网Ethernet

按照规定,以太网帧大小必需在64-1518Byte之间。 除去以太网帧的帧头14Byte和帧尾4Byte,那么Ethernet可承载的数据最大为1500Byte。这个值我们就把它称之为MTU。
2) IP
以太网MTU为1500Byte,除去IP包头数据20Byte,那么IP包可承载的数据最大为1480Byte。
3) TCP
IP层负载最大1480Byte,除去TCP包头数据20Byte,那么TCP包可承载的数据最大为1460Byte(注意:TCP包头数据典型是20Byte,如果加上一些可选项,可达到32Byte,那么TCP包可承载的数据最大值就变为1448Byte)。
 

3. MSS

MSS,Maxitum Segment Size 最大分段大小,是TCP协议里面的一个概念,它的含义跟MTU类似。MSS就是一个TCP包能够传输的最大数据大小,这个大小就是TCP包负载的大小。为了达到最佳的传输效能,在TCP三次握手阶段,双方都会在各自的SYN帧携带各自的MSS值。

 

4. MSS的大小

MSS这个值在实现的时候往往会用链路层的MTU值减去IP包头大小和TCP包头大小计算得到,所以Ethernet+IP+TCP网络下,MSS的典型值为1460Byte。

 

5. 丢包

MTU或MSS设置不当会导致数据丢包的情况。

例子1:

        如果IP数据包的DF(Donot Fragment)flag被设置,不允许IP分片,并且整个IP包大小为1500字节。如果遇到中间某些路由器的MTU小于1500Byte时,路由器会丢弃这包数据,并且返回一个错误信息给发送者。这样就会造成丢包的情况。不过幸运的是大部分网络链路MTU都是1500或者大于1500Byte。

例子2:

        如果某天,在原有的协议之上封装了其他协议(如VPN、IPSec等),这样会导致协议层次的增加以及协议开销的增加,结果就是导致TCP层可用的实际负载减少。如果此时还是按照原来MSS的典型值1460Byte进行组包,最终会导致链路层的负载超过MTU 1500Byte的限制。如下图所示:

在原来协议的基础上,增加了LDP和VPN,导致协议头的开销多了8Byte。此时,Ethernet的MTU还是1500Byte,但TCP的实际可用负载会减少为1500-4-4-20-20=1452Byte,如果还是按照旧的MSS 1460Byte来进行分片处理,会导致一个以太网帧达到14+4+4+1500+4=1526Byte,大于以太网帧的最大值1518Byte。这样在传输时,某些路由器就会丢弃这个包,最终导致丢包。

 

转载地址:http://kkpgi.baihongyu.com/

你可能感兴趣的文章
Angular管道操作符(|)
查看>>
Angular模板引用变量(#var)
查看>>
Angular 内置结构型指令
查看>>
Angular 内置属性型指令
查看>>
cookie 跨域访问整理
查看>>
Angular中的模板和表达式简介
查看>>
Angular 绑定语法简介
查看>>
Ionic创建项目失败:[ERROR] Network connectivity error occurred, are you offline?
查看>>
Visual Studio Code v1.19发布
查看>>
Cordova 卸载
查看>>
NPM 设置代理
查看>>
nrm切换npm源利器
查看>>
curl工具使用简介
查看>>
C# 使用curl工具 上传图片到微信服务器示例
查看>>
C# Newtonsoft.Json JObject合并对象整理
查看>>
C# 调用微信公众号接口生成带参数二维码、下载、合并
查看>>
C# 调用微信公众号接口发送客服消息示例
查看>>
C# 调用微信公众号接口获取会员信息示例
查看>>
mysql-5.7.xx-winx64服务无法启动解决方案
查看>>
mysql5.7下面windows平台大小写敏感处理
查看>>