ip头部多少字节_IP数据分片之MTU和TCP的MSS

news/2025/5/25 8:16:34

d1a06adc80524b3a7a1f2eabd247c968.png

1.IP数据分片之MTU和TCP的MSS

044b6e3c9e5d68aa6935e5e76dc68807.png

1.1最大传输单元(Maximum Transmission Unit,MTU)

数据链路层传输的帧大小是有限制的,以太网和IEEE 802.3对数据帧的长度都有一个限制,不能把一个太大的包直接塞给链路层,这个限制被称为最大传输单元(Maximum Transmission Unit,MTU)

以太网的贞最小为64字节,最大为1518字节。除去14字节头部和4字节 CRC字段,最小的有效载荷为46字节,最大的有效载荷为1500字节这个值就是MTU。就是说传输100KB的数据,至少需要发送69次以太网的贞。

不同的数据链路层的MTU也是不同的,IP协议的数据报最大为65535个字节,如果开启了巨型贞(Jumbo Frame)能达到9000个字节。这远超出了MTU的值,所以当IP数据报大于MTU的时候就需要对数据进行分片,这也是IP协议的主要功能之一。

IP首部中有个字段片偏移,在IP数据报长度大于MTU的时候对数据报进行分片,片偏移用来表示数据报在原来分组的相对位置,以8个字节为偏移单位,如下图:

676259fb13348c2aa276c66585209175.png

我们使用ping请求发送3000个字节给www.baidu.com,网卡eto的MTU为1500。使用wireshark抓包如下:

  1. 第一个包

656994294bd3c7324c86b6876d69a90d.png

ip.id = 0x00005ce1
ip.flags.mf(More fragments : Set) = 1,代表这个id的ip分组还有更多分片。
ip.frag_offset(Fragment offset:0),代表分片偏移量是0。
ip首部20个字节,1500-20=1480字节。

  1. 第二个包

2a1599562b9f49ca0c6b6da2e20a4657.png

ip.id = 0x00005ce1
ip.flags.mf(More fragments : Set) = 1,代表这个id的ip分组还有更多分片。
ip.frag_offset(Fragment offset:1480),代表分片偏移量是0。
ip首部20个字节,1500-20=1480字节。

  1. 第三个包

bbad0b5cd2ecc1f2fec9b5894ee8e79d.png

ip.id = 0x00005ce1
ip.flags.mf(More fragments : Set) = 2960,代表这是这个ip分组的最后的一个分片,可以进行重组了。
ip首部20个字节,icmp首部8字节,68-20-8=40字节。

ip.id=0x00005ce1的三个分片的载荷加起来正好是3000个字节。

1.2TCP最大报文段长度(Max Segment Size,MSS)

TCP为了避免被发送方分片,它主动把数据分成小段再交给网络层。最大的分段大小称为MSS(Maximum Segment Size),它相当于把MTU刨去IP头和TCP头之后的大小,所以一个MSS恰好能装进一个MTU中。

38eaf815bafac88e43c3437dc8b54c46.png

有时候TCP的头不止有20个字节,还有可选项会占用一定的MSS空间。这些信息我们都能通过Wireshar观察到。

61f506771c0611be2246384c0506dd07.png

以太网贞是1500字节+14字节的MAC头,TCP头一共是32个字节,可选项占了12字节。所以TCP的MSS=1500-20-20-12=1448字节。

UDP协议没有MSS的概念,传输层的数据可能一股脑的交给网络层,所以数据可能会被分片而影响性能。

在三次握手的时候接收方和发送方都会声明自己MSS,因为接收方和发送方的MTU可能是不同的,最终会以较小的MSS为准。

文章来源:https://blog.csdn.net/weixin_35273106/article/details/112088072
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-17141.html

相关文章

jenkins持续集成入门4 - MAVEN,jdk等环境配置

1 安装maven,配置MAVEN_HOME环境变量 2 全局工具配置关联JDK和Maven,Global Tool Configuration菜单,如下 3 添加Jenkins全局变量 Manage Jenkins->Configure System->Global Properties ,添加三个全局变量JAVA_HOME、M2_H…

编程漫谈(五):读书与交流

**************************************************************************** 程序员最感乐趣的时候,就是能够自由、丰富地思考,并用程序去实现自己的构思和想法,解决所面临的问题。 **************************************************…

JVM 知识点补充

文章目录 什么是 ZGC如何选择垃圾收集器Hotspot 为什么使用元空间替换了永久代什么是永久代?它和方法区有什么关系呢?什么是元空间?它和方法区有什么关系呢?为什么使用元空间替换了永久代?为什么使用元空间替换永久代?什么是 Stop The World ? 什么是 OopMap?什么是安全…

【linux高级程序设计】(第十四章)TCP高级应用 2

socket多路复用应用 int select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) 功能:轮循等待的方式,从多个文件描述符中获取状态变化后的情况 readfds :包含所有可能因状态变成可读而触发se…

git 忽略 部分文件夹_Git 系统学习笔记

公众号内发送Git获取Git官方PDF教程版本控制 版本控制是一种记录一个或若干个文件内容变化、以便将来查阅特定版本修订情况的系统。本地版本控制系统很久以前就开发了许多本地版本控制系统、大多都是采用某种简单的数据库来记录文件的历次更新差异。其中最流行的一种叫做 RCS、…

Jenkins使用docker-maven-plugin生成镜像 过程中遇到的常见问题

1 unix://localhost:80: Permission denied 权限问题Jenkins使用docker-maven-plugin进行编译时发现没有权限 - if年少有为 - 博客园

SpringMVC经典系列-13使用SpringMVC处理Ajax请求---【LinusZhu】

注意:此文章是个人原创,希望有转载须要的朋友们标明文章出处,假设各位朋友们认为写的还好,就给个赞哈,你的鼓舞是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请…

【转】 UIview需要知道的一些事情:setNeedsDisplay、setNeedsLayout

原文:http://blog.sina.com.cn/s/blog_923fdd9b0101b2b4.html 1、在Mac OS中NSWindow的父类是NSResponder,而在iOS 中UIWindow 的父类是UIVIew。程序一般只有一个窗口但是会又很多视图。 2、UIView的作用:描画和动画,视图负责对其…

规格选择_地板砖如何打蜡?地板砖规格如何选择?

有些人想要让地板砖呈现光滑的效果,于是就打算对地板砖进行打蜡,但自己之前没有打蜡过,不知道地板砖如何打蜡?家里决定装饰地板砖的时候,就需要确定它的规格,规格不同的地板砖带来效果不一样,地板砖规格如…

linux安装中文输入法

CentOS英文系统安装中文输入法,简单说说在CentOS 6.3下用yum安装中文输入法的过程。1.需要root权限,所以要用root登录 ,或su root2.yum install "Chinese Support" 3.exit4.回到桌面,system->preferences->input …