文档章节

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

呵大官人
 呵大官人
发布于 2015/07/22 23:20
字数 974
阅读 425
收藏 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

© 著作权归作者所有

共有 人打赏支持
呵大官人

呵大官人

粉丝 118
博文 17
码字总数 15799
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

74.expect脚本同步文件以及指定host同步文件 构建分发系统文件和命令

20.31 expect脚本同步文件: 在expect脚本中去实现在一台机器上把文件同步到另外一台机器上去。核心命令用的是rsync ~1.自动同步文件 #!/usr/bin/expect set passwd "123456" spawn rsync -a...

王鑫linux
18分钟前
0
0
TypeScript项目引用(project references)

转发 TypeScript项目引用(project references) TypeScript新特性之项目引用(project references) 项目引用是TypeScript 3.0中的一项新功能,允许您将TypeScript程序构建为更小的部分。 通过这...

durban
22分钟前
0
0
爬虫入门

导读 网络爬虫(Web crawler),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,它们被广泛用于互联网搜索引擎或其他类似网站,可以自动采集所有其能够访问到的页面内容,以获取...

问题终结者
22分钟前
0
0
ppwjs之bootstrap文字排版:无序列表项不换行

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
29分钟前
0
0
SpringBoot 学习一

本文将从以下几个方面介绍: 前言 HelloWorld 读取配置文件 例子(CURD) 前言 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架...

tsmyk0715
29分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部