博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP/UDP 报最大长度
阅读量:2496 次
发布时间:2019-05-11

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

传输层:

对于UDP协议来说,整个包的最大长度为65535,其中包头长度是65535-20=65515;

对于TCP协议来说,整个包的最大长度是由最大传输大小(MSS,Maxitum Segment Size)决定,MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。 通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。

IP层:

对于IP协议来说, IP包的大小由MTU决定 。 MTU值越大,封包就越大,理论上可增加传送速率,但MTU值又不能设得太大,因为封包太大,传送时出现错误的机会大增。

一般默认的设置如下:

PPPoE连接的最高MTU值是1492

以太网网(Ethernet)的最高MTU值则是1500

Internet上,默认的MTU大小是576字节。

实际UDP的包长度不要超过MTU值,一般不建议超过1K。

MSS 是是 传输层 概念, 在建立TCP连接过程, 双方的SYN 报文中定义的 , 通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。

后面的数据传输都是按照确定的MSS进行传输。 MSS会根据物理接口的MTU计算得出 (MSS=MTU-IP头长度-TCP头长度)

MTU (max transfer unit) 是是 数据链路层 中的概念,需要在 网卡中设置 的,如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就需要进行分片(fragmentation),把数据报分成若干片,这样每一片都小于MTU。

当在同一个网络上的两台主机互相进行通信时,该网络的MTU是非常重要的。但是如果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的MTU。重要的不是两台主机所在网络的MTU的值,重要的是两台通信主机路径中的最小MTU。它被称作 路径MTU 。

判断路径MTU方法

============================

如果某个程序需要判断到达目的端的路途中最小MTU(路径MTU)

发生ICMP不可达差错的另一种情况是, 当路由器收到一份需要分片的数据报,而在IP首部又设置了不分片(DF)的标志比特。

ping

 -c 发包次数

 -s 数据大小, 不包括 ip 和 icmp 协议头

 -M [do|dont]  将IP报头的DF位设置

# ping -c 2 -s 1472 -M do 10.178.72.18

PING 10.178.72.18 (10.178.72.18) 1472(1500) bytes of data.

1480 bytes from 10.178.72.18: icmp_seq=1 ttl=52 time=4.36 ms

1480 bytes from 10.178.72.18: icmp_seq=2 ttl=52 time=4.33 ms

# ping -c 2 -s 1473 -M do 10.178.72.18

PING 10.178.72.18 (10.178.72.18) 1473(1501) bytes of data.

From 172.25.39.106 icmp_seq=1 Frag needed and DF set mtu = 1500 )

From 172.25.39.106 icmp_seq=1 Frag needed and DF set mtu = 1500 )

所以路径MTU为1500

--------------------------------------------

对于一个以太网来说,TCP的最大报文段长度即MSS一般是1460字节(1500(MTU) - 20(IP head) - 20(TCP head) = 1460 Byte),减去12字节的TCP timestamp option,留给TCP正文数据是 1448字节 。另外,TCP流量控制采用了滑动窗口机制,发送窗口的大小要小于min(接收端通告的接收窗口大小,发送端拥塞窗口大小)。google得知Linux 2.6.39内核之前的TCP实现中,发送端初始拥塞窗口为3,单位是MSS (server机器内核版本未知,估计是2.6.39以前的)。也就是说TCP连接建立后,初始拥塞窗口限制第一次发送的数据长度要小于等于 1448 * 3 = 4344 字节,所以客户端 第一次recv 调用只收到了4344字节 数据。

你可能感兴趣的文章
静态变量和实例变量的区别
查看>>
切面的优先级
查看>>
OC--代理
查看>>
vue 路由跳转传参
查看>>
利用Aspose.word.dll 在生产的Word中插入图片到指定位置
查看>>
prim算法
查看>>
微信小程序一笔记账开发进度五
查看>>
list
查看>>
软件性能及性能测试
查看>>
ECJTU 2018 Summer Training 2
查看>>
Linux下安装Tomcat服务器
查看>>
JsonUtils
查看>>
SharePoint【整合Crystal Report水晶报表】-- 01. 如何在Sharepoint2010网站中整合Crystal Report水晶报表(显示数据 一)...
查看>>
NTT(模板)
查看>>
PHP复习第二天
查看>>
SQL高级---SQL CREATE INDEX 语句
查看>>
Swift3.0服务端开发(五) 记事本的开发(iOS端+服务端)
查看>>
JavaEE开发使用Maven管理的SpringMVC工程
查看>>
我的linux学习之路——(一)
查看>>
selenium 获取input输入框中的值的方法
查看>>