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 分片 科普相关推荐

  1. 网络数据包最大长度 MTU 分片

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

  2. Linux内核网络数据包发送(三)——IP协议层分析

    Linux内核网络数据包发送(三)--IP协议层分析 1. 前言 2. `ip_send_skb` 3. `ip_local_out` and `__ip_local_out` 3.1 netfilt ...

  3. Linux内核网络数据包发送(二)——UDP协议层分析

    Linux内核网络数据包发送(二)--UDP协议层分析 1. 前言 2. `udp_sendmsg` 2.1 UDP corking 2.2 获取目的 IP 地址和端口 2.3 Socket 发送:b ...

  4. 流量Ⅰ--一文了解pcap网络数据包的结构?

    一文了解pcap网络数据包如何分析 0x00 基础知识 1.OSI七层模型每层的作用 2.TCP/IP 结构及具有五层协议的结构体系 0x01 数据是如何在各层次间传输的 1.数据帧的封装 2.数据格 ...

  5. Packet Chasing:通过缓存侧信道监视网络数据包

    摘要 本文介绍了一种对网络的攻击–Packet Chasing,这种攻击不需要访问网络,无论接收数据包的进程的特权级别如何,都能发挥作用.一个间谍进程可以很容易地探测和发现网络驱动程序使用的每个缓冲区 ...

  6. 【转载】网络数据包分析 网卡Offload

    对于网络安全来说,网络传输数据包的捕获和分析是个基础工作,绿盟科技研究员在日常工作中,经常会捕获到一些大小远大于MTU值的数据包,经过分析这些大包的特性,发现和网卡的offload特性有关,本文对网卡 ...

  7. 网络数据包分析 网卡Offload

    对于网络安全来说,网络传输数据包的捕获和分析是个基础工作,科技研究员在日常工作中,经常会捕获到一些大小远大于MTU值的数据包,经过分析这些大包的特性,发现和网卡的offload特性有关,本文对网卡Of ...

  8. linux接收网络数据并存存储,linux网络数据包数据结构 Socket Buffer

    Linux网络核心数据结构是套接字缓存(socket buffer),简称skb.它代表一个要发送或处理的报文,并贯穿于整个协议栈.1.套接字缓存skb由两部分组成:(1)报文数据:它保存了实际在网络 ...

  9. 搬砖:网络数据包解析

    Itsad 网络数据包解析 TCP/IP协议数据包,一般由应用层.传输层.网络层.数据链路层封装而成. 四层协议各自的作用: 数据链路层实现了网卡接口的驱动程序. 网络层实现了数据包的选路和转发. 传 ...

最新文章

  1. Java基类共同属性设置_java – 你有一个Hibernate实体的基类吗?
  2. 公有云和私有云,哪种是大势所趋?
  3. docker pull下载镜像时的报错及其解决方法
  4. Boost::context模块fiber的stack测试程序
  5. DELL6224交换机基本配置命令明细
  6. 刷题总结——瞭望塔(bzoj1038)
  7. python实现简单算法
  8. WinEdt 打开***.bib文件时 error reading
  9. 机器学习训练数据集图片标注工具推荐
  10. 一款GaN HEMT内匹配功率放大器设计过程详解
  11. python eof是什么_EOF错误python
  12. CSS外边距塌陷问题,吊打面试官
  13. Linux命令学习总结
  14. Vs2005中操作WORD
  15. Leetcode-1737-满足三条件之一需改变的最少字符数
  16. 三年黑盒测试工程师对嵌入式软件测试的理解
  17. 智能汽车时代,“BATH”的跨界姿势与逻辑
  18. 【图像分割】基于计算机视觉实现胸部CT肺质提取附matlab代码
  19. 先锋M.2 NVMe 2280 SSD 256GB固态硬盘 测速
  20. 一加手机怎么root权限_一加手机3 root教程 一加3获取root权限的方法

热门文章

  1. Handlebars 介绍
  2. 《 Python List列表全实例详解系列(五)》——修改元素(修改单个、修改一组)
  3. 0xc000007b应用程序无法正常启动解决方案(亲测有效)
  4. python 设置excel单元格式,Python xlwt设置excel单元格字体及格式
  5. 相较国外代码托管平台 gitlab,咱们中国自己的代码托管平台有哪些优势?
  6. 【电气安全】关于医疗专用隔离电源系统在医院配电系统中的应用
  7. 如何快速在两个服务器之间传送大文件
  8. 向windows服务器传输大文件时提示未知错误解决方法
  9. 第一个C语言项目——图书管理系统
  10. 【图像加密】DNA混沌系统图像加密【含Matlab源码 1190期】