1、数据链路层对数据帧的长度都有一个限制,也就是链路层所能承受的最大数据长度,这个值
称为最大传输单元,即MTU。以以太网为例,这个值通常是1500字节。

2、对于IP数据包来讲,也有一个长度,在IP包头中,以16位来描述IP包的长度,也就是说,
一个IP包,最长可能是65535字节。

3、结合以上两个概念,第一个重要的结论就出来了,如果IP包的大小,起过了MTU值,那么就需要
分片,也就是把一个IP包分为多个,这个概念非常容易理解,一个载重5T的卡车,要拉10T的货,它
当然就得分几次来拉了。

4、IP分片是很多资料常讲的内容,但是我倒是觉得分不分片其实不重要,重要的是另一个东西。一个
数据包穿过一个大的网络,它其间会穿过多个网络,每个网络的MTU值是不同的。我们可以设想,如果
接受/发送端都是以太网,它们的MTU都是1500,我们假设发送的时候,数据包会以1500来封装,然而,
不幸的是,传输中有一段X.25网,它的MTU是576,这会发生什么呢?我想,这个才是我们所关心的。
当然,结论是显而易见的,这个数据包会被再次分片,咱开始用火车拉,到了半路,不通火车,只通汽车,
那一车货会被分为很多车……仅此而已,更重要的是,这种情况下,如果IP包被设置了“不允许分片标志”,那
会发生些什么呢?对,数据包将被丢弃,然事收到一份ICMP不可达差错,告诉你,需要分片!
这个网络中最小的MTU值,被称为路径MTU,我们应该有一种有效的手段,来发现这个值,最笨的方法或许是先
用traceroute查看所有节点,然后一个个ping……

5、到了传输层,也会有一个最大值的限制,当然,对于只管发,其它都不管的UDP来说,不再我们讨论之列。这里
说的是TCP协议。说到大小,或许会让人想到TCP著名的滑动窗口的窗口大小,它跟收发两端的缓存有关,这里讨论
的是传输的最大数据包大小,所以,它也不在讨论之列。
TCP的选项字段中,有一个最大报文段长度(MSS),表示了TCP传往另一端的最大数据的长度,当一个连接立时,连接
的双方都要通告各自的MSS,也就是说,它说是与TCP的SYN标志在一起的。当然,对于传输来讲,总是希望MSS越大越好,
现在超载这么严重,谁家不希望多拉点货……但是,MSS总是有个限制的,也就是MTU-IP头长度-TCP头长度,对于以太网来讲
它通常是1500-20-20=1460,虽然总是希望它能很大(如1460),但是大多数BSD实现,它都是512的倍数,如1024……

6、回到分片上来,例如,在Win2000下执行如下命令:
ping 192.168.0.1 -l 1473

按刚才的说法,1473+20(ip头)+8(icmp头)=1501,则好大于1500,它会被分片,但是,我们关心的是:

这个数据包会被怎么样分法?
可以猜想,第一个包是
以太头+IP头+ICMP头+1427的数据;
那第二个分片包呢?
它可以是:
以太头+IP头+ICMP头+1个字节的数据
或者是:
以太头+IP头+1个字节的数据
也就是省去ICMP头的封装,当然,IP头是不可以省的,否则怎么传输了……

事实上,TCP/IP协议采用的是后一种封装方式,这样,一次可以节约8个字节的空间。IP包头中,用了三个标志来描述一个分片包:
1、分片标志:如果一个包被分片了,被置于1,最后一个分片除外;——这样,对于接收端来讲,可以根据这个标志位做为重组的重
要依据之一;
2、分片偏移标志:光有一个标志位说明“自己是不是分片包”是不够的,偏移标志位说明了自己这个分片拉于原始数据报的什么位置,
很明显,这两个标志一结合,就很容易重组分片包了。
3、不允许分片标志:如果数据包强行设置了这个标志,那么在应该分片的时候,…… err,刚才已经说过了

网络数据包最大长度 MTU 分片 转发https://blog.csdn.net/singular2611/article/details/52513406的更多相关文章

  1. myeclipse通过数据表生成jpa或hibernate实体---https://blog.csdn.net/partner4java/article/details/8560289

    myeclipse通过数据表生成jpa或hibernate实体-----https://blog.csdn.net/partner4java/article/details/8560289

  2. 关于springmvc 返回json数据null字段的显示问题-转https://blog.csdn.net/qq_23911069/article/details/62063450

    最近做项目(ssm框架)的时候,发现从后台返回的json(fastjson)数据对应不上实体类,从数据库查询的数据,如果对应的实体类的字段没有信息的话,json数据里面就不显示,这不是我想要的结果,准 ...

  3. mongodb丢失数据的原因剖析 - 迎风飘来的专栏 - CSDN博客 https://blog.csdn.net/yibing548/article/details/50844310

    mongodb丢失数据的原因剖析 - 迎风飘来的专栏 - CSDN博客 https://blog.csdn.net/yibing548/article/details/50844310

  4. https://blog.csdn.net/zhi_sheng/article/details/78910082----mybatis写当天 当月的数据 时间段数据

    https://blog.csdn.net/zhi_sheng/article/details/78910082---- mybatis写当天 当月的数据 时间段数据

  5. 记一次压测问题定位:connection reset by peer,TCP三次握手后服务端发送RST_网络_c359719435的专栏-CSDN博客 https://blog.csdn.net/c359719435/article/details/80300433

    记一次压测问题定位:connection reset by peer,TCP三次握手后服务端发送RST_网络_c359719435的专栏-CSDN博客 https://blog.csdn.net/c3 ...

  6. Socket的用法——NIO包下SocketChannel的用法 ———————————————— 版权声明:本文为CSDN博主「茶_小哥」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/ycgslh/article/details/79604074

    服务端代码实现如下,其中包括一个静态内部类Handler来作为处理器,处理不同的操作.注意在遍历选择键集合时,没处理完一个操作,要将该请求在集合中移除./*模拟服务端-nio-Socket实现*/pu ...

  7. Ubuntu 16.04 安装 JDK 及 Eclipse 详细步骤(转发:https://blog.csdn.net/bluish_white/article/details/56509446)

    2017.3.1更新 修正了一些命令,现在按照文章步骤配置不会出现问题了. JDK 安装及配置 参考来源:http://www.linuxidc.com/Linux/2017-02/140908.ht ...

  8. java定时器的使用(Timer)(转发:https://blog.csdn.net/ecjtuxuan/article/details/2093757)

    1.在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等. 对于这样的操作最方便.高效的实现方式就是使用java.util.Timer工具类. private java.util.Tim ...

  9. 向txt文件中写入内容(覆盖重写与在末尾续写+FileOutputStream与FileWriter)(转发:https://blog.csdn.net/bestcxx/article/details/51381460)

    !!!! 读取txt文件中的内容 import java.io.BufferedReader; import java.io.File; import java.io.FileReader; /** ...

随机推荐

  1. Java 空字符串和 字符串为null的区别

    之前一直没有搞清楚 字符串为空和字符串为null的区别,今天写代码一直出现NullPointerException异常,我一直没有搞清楚,后来发现我是这样写的 String s = null; s = ...

  2. 编译Android系统源码和内核源码

    [日期:2016-01-11] 来源:Linux社区  作者:jiangwei [字体:大 中 小]     把我之前编译Android系统源码和内核源码的过程记录一下,因为这个过程真的是受益匪浅,看 ...

  3. 树状数据删除(TP5)

    应用场景:类似上图中树状菜单,选中一级菜单 点击上方删除按钮 所有子菜单删除 以下是代码截图(代码基于 TP5)

  4. 数学&计算机工程常用希腊字母表及其发音

  5. VIP视频下载终结器

    youtube-dl: Youtube-dl是谷歌github上的一个开源项目,它是一款轻量级的命令行 下载实用工具,阿刚曾在乐软博客里文章<不仅仅是youtube,youtube-dl在线视频 ...

  6. jmeter 函数学习

    https://jmeter.apache.org/usermanual/functions.html#__threadNum

  7. 常用命令--mount

    mount -o remount,rw / mount 命令 [-t 文件系统] [-L 卷标名] [-o 特殊选项] 设备文件名 挂载点 -l   查询系统中已经挂载的设备,-l 会显示卷标 -a ...

  8. __init__ 和__new__的区别

    __init__和__new__的区别 __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值. __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例, ...

  9. Mysq sql语句教程

    mysql管理命令  show  databases;  显示服务器上当前所有的数据库  use  数据库名称;  进入指定的数据库  show  tables;  显示当前数据库中所有的数据表  d ...

  10. 分布式-技术专区-Redis分布式锁实现-第二步

    再上次篇章中汇集了相关的分布式锁的概念进行控制,接下来我们采用的是注解声明式开发服务方案,进行声明式开发代替编程式开发方案.  1.利用aop实现分布式锁2.只用在方法上加个注解,同时加上了重试机制 ...