文档章节

为什么TCP/IP包长会大于MTU?

呵大官人
 呵大官人
发布于 2015/07/22 23:20
字数 974
阅读 502
收藏 2

前戏

当你看到这个标题第一眼到你看到这篇文章的内容期间,你心里也许会想,特么在逗我呢吧?TCP/IP包怎么可能会大于MTU?难道书上都是骗人的?确实在tcp/ip第一卷里面描述IP协议分片一节里面讲到,当IP包大于MTU时,会对包进行分片。既然会分片,那么这个包大于MTU是几个意思?且听我慢慢道来。

什么是MTU

MTU(Maximum Transmission Unit),即最大传输单元,意思是在网络通信协议里规定最大传输的字节数量,通常是1500字节(不同网络大小不一样,可使用ifconfig查看),最小是46。

起因

首先事情的起因是因为跟前端调数据,前端老吼没收到数据,我说发了,他说没收到,我说发了........双方难分胜负,唯有抓包,方能一决雌雄。说时迟那时快,抄起tcpdump就开干,然后在抓包过程中,偶尔有那么几个包居然比MTU还长,我当时就纳了闷了,说好的IP包分片呢?人与机器最基本的信任都没有了,我还打个卵的码啊。于是翻了一些资料,终于知道这个分片不是发生在IP协议上,而是在TCP协议上(其实主要还是不熟悉tcpdump,因为如果有tcp分片,seq格式就是当前seq:下一个seq,并且连续几个包的ack都一样)。包内容如下:


结果

虽然现在已经知道是tcp分片而非ip分片,但是包的大小还是超出了MTU,于是又一轮google,原来有个东西叫tso(tcp segment offload),意思是如果网卡支持tso,操作系统发送大的tcp包时,不需要消耗CPU来计算分片,而是将整个包发送到网卡,由网卡的NPU来进行分片处理,这样还能减少TCP头的传输次数(一个64K的数据包,需要45个分片,那么将多传输1760字节(40x44)的tcp头)。

查看你网卡是否支持tso,请使用如下命令:

ethtool --show-offload eth0

这时候我们来禁用一下tso,只需要执行如下命令

ethtool -K eth0 tso off

再来一轮tcpdump测试,发现数据包终于正常了,不再会大于MTU了。


其实无论服务器发送的包多大,反正最终都会被分片,可能是操作系统,可能是网卡,因此客户端收到的包都是小于MTU的。


分片

为什么ip有分片了,tcp还要再搞一个分片呢?因为ip层不保证数据成功送达,并且ip层分片可能发生在源主机,也可能在路由器上,一旦有分片丢失,将会造成整个ip包重传(其实这个重传是tcp层发起的,因为目标机器没有收到完整的ip包,也不会有ack,那么源机器在一定时间内就会发起重传,导致整个tcp包又被传了一次),因此就有了tcp分片,当一片数据丢失,只需要重传丢失的那一片即可。


结论

tcpdump抓包的数据是在包送到网卡之前的信息,所以在tcpdump里面的包大小可能会大于MTU,但是一旦数据进入网卡后的处理信息在tcpdump里面是反应不了的,因此数据包被分片这样的消息自然是没办法知道,只有在目标方才能反应出具体的分包细节。所以这次发现tcp/ip包长大于MTU其实算是个“假象”,因为在真正的链路层上传输数据时是不会大于MTU的。


参考资料

https://en.wikipedia.org/wiki/Large_segment_offload

© 著作权归作者所有

共有 人打赏支持
呵大官人

呵大官人

粉丝 122
博文 18
码字总数 16428
作品 1
浦东
高级程序员
私信 提问
加载中

评论(1)

tuber
tuber
wen性能指南上提了一句tso,学习了
Ipsec VPN + GRE隧道的MTU设置详细解析

Cisco给出的Ipsec VPN MTU设置标准是1400字节,MSS值是1360。一般平时都这样设置,但为什么这样设置呢??偶来解析下,也是对自己的总结。 以下是GRE Tunnel MTU 设置的几个例子 1. GRE隧道的...

彦天天
2017/04/02
0
0
小议TCP的MSS(最大分段)以及MTU

[背景知识] MTU: Maxitum Transmission Unit 最大传输单元 MSS: Maxitum Segment Size 最大分段大小(偶是直译,翻译的不好,不要打 俺PP) PPPoE: PPP Over Ethernet(在以太网上承载PPP协议...

moodlxs
2015/02/16
0
0
MTU等参数详解

MTU等参数详解 1. 概述 本文主要分析二层MTU,IP MTU和MSS的概念以及它们之间的关系。这三个概念对于路由器来说非常重要,常常很多网页打不开等问题都是这几个参数没配置好导致的。 2. MTU 最...

SeanWoo
02/27
0
0
网络基础 — 浅析IP/TCP协议分片

浅析IP/TCP协议分片 首先我们需要知道一个概念,MTU是链路层中的网络对数据帧的一个限制,以以太网为例,MTU为1500个字节. 一个IP数据报在以太网中传输,如果它 的长度大于该MTU值,就要进行分...

Dawn_sf
01/31
0
0
Golang实现简单tcp服务器04 -- 服务器的粘包处理

什么是粘包 一个完成的消息可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这个就是TCP的拆包和封包问题 TCP粘包和拆包产生的原因 应用程序写入数据的字节...

victoriest
2015/06/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS配置Tomcat监听80端口,虚拟主机

Tomcat更改默认端口为80 更改的配置文件是: /usr/local/tomcat/conf/server.xml [root@test-a ~]# vim /usr/local/tomcat/conf/server.xml # 找到 Connector port="8080" protocol="HTTP/1......

野雪球
今天
5
0
《稻盛和夫经营学》读后感心得体会3180字范文

《稻盛和夫经营学》读后感心得体会3180字范文: 一代日本经营之圣稻盛和夫凭借刻苦勤奋的精神以及深植于佛教的商业道德准则,成为了“佛系”企业家的代表人物。在《稻盛和夫经营学》“领导人...

原创小博客
今天
3
0
java框架学习日志-5(常见的依赖注入)

依赖注入(dependency injection) 之前提到控制反转(Inversion of Control)也叫依赖注入,它们其实是一个东西,只是看的角度不同,这章详细说一下依赖注入。 依赖——指bean对象创建依赖于...

白话
今天
4
0
红外接收器驱动开发

背景:使用系统的红外遥控软件没有反应,然后以为自己接线错误,反复测试,结果烧坏了一个红外接收器,信号主板没有问题。所以自己开发了一个红外接收器的python驱动。接线参见https://my.os...

mbzhong
今天
2
0
ActiveMQ消息传送机制以及ACK机制详解

AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的。 一. ActiveMQ消息传送机...

watermelon11
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部