首先说明:数据报的分段和分片确实发生,分段发生在传输层,分片发生在网络层。但是对于分段来说,这是经常发生在UDP传输层协议上的情况,对于传输层使用TCP协议的通道来说,这种事情很少发生。

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

1 以太网和802.3对数据帧的长度都有一个限制,其最大 值分别是1500和1492个字节。链路层的这个特性称作MTU。不同类型的网络大多数都有一个上限。如果IP层有一个数据要传,且数据的长度比链路层的 MTU还大,那么IP层就要进行分片(fragmentation),把数据报分成若干片,这样每一个分片都小于MTU。

2 把一份IP数据报进行分片以后,由到达目的端的IP层来进行重新组装,其目的是使分片和重新组装过程对运输层(TCP/UDP)是透明的。由于每一分片都是一个独立的包,当这些数据报的片到达目的端时有可能会失序,但是在IP首部中有足够的信息让接收端能正确组装这些数据报片。

3 尽管IP分片过程看起来透明的,但有一点让人不想使用它:即使只丢失一片数据也要重新传整个数据报。why?因为IP层本身没有超时重传机制------由更高层(比如TCP)来负责超时和重传。当来自TCP报文段的某一片丢失后,TCP在超时后会重发整个TCP报文段,该报文段对应于一份IP数据报(而不是一个分片),没有办法只重传数据报中的一个数据分片。

4 使用UDP很容易导致IP分片,TCP试图避免IP分片。 那么TCP是如何试图避免IP分片的呢?其实说白了,采用TCP协议进行数据传输是不会造成IP分片的,因为一旦TCP数据过大,超过了MSS,则在传输 层会对TCP包进行分段(如何分,见下文!),自然到了IP层的数据报肯定不会超过MTU,当然也就不用分片了。而对于UDP数据报,如果UDP组成的 IP数据报长度超过了1500,那么IP数据报显然就要进行分片,因为UDP不能像TCP一样自己进行分段。总结:UDP不会分段,就由我IP来分。TCP会分段,当然也就不用我IP来分了!

MSS(Maxitum Segment Size)最大分段大小的缩写,是TCP协议里面的一个概念

1 MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。

2 相信看到这里,还有最后一个问题:TCP是如何实现分段的呢?其实TCP无所谓分段,因为每个TCP数据报在组成前其大小就已经被MSS限制了,所以TCP数据报的长度是不可能大于MSS的,当然由它形成的IP包的长度也就不会大于MTU,自然也就不用IP分片了。

简而言之:
1) IP分片产生的原因是网络层的MTU;TCP分段产生原因是MSS。
2) IP分片由网络层完成,也在网络层进行重组;TCP分段是在传输层完成,并在传输层进行重组。 //透明性
3) 对于以太网,MSS为1460字节,而MUT往往会大于MSS。

3 故采用TCP协议进行数据传输,是不会造成IP分片的。若数据过大,只会在传输层进行数据分段,到了IP层就不用分片。所以可以看成是这种情况:传输层协议想发送一个超过了MTI的数据报,这个时候网络层就需要对其进行分片,一般UDP和ICMP会出现分片情况,但是TCP不会出现这种情况!因为TCP使用了MSS来避免分片!

4 IP分片只有第一个带有传输层或ICMP首部,其余的分片只有IP头。至于怎么重组就是到对端以后IP层的事情了。

5 若TCP报文非常长那么在IP层传输时就有可能要分解成多个短数据报片,TCP分段每个都有完整首部。

结论

1 所以我觉得是这样的,TCP的分段是针对应用层的数据来说的,比如使用TCP发送70KB的数据,这个时候就需要将70KB分成若干个MSS,到了网络层就不需要分片了。MSS的存在就避免了网络层分片的发生,

2 IP层的分片是针对传输层中使用UDP协议来说的,如果使用UDP发送数据,UDP并不知道如何分段,那么到了IP层就需要进行分片,分片的原则根据MTU,那么分UDP最大的数据负载就是1500-8=1492

TCP/UDP实验

看完了理论,让我们实践一把,看是否与以上的理论相符。

对于TCP来说,它是尽量避免分片的。假设我们这里要发送给TCP层的数据大小为2748个字节,这个大小是明显大于链路层的发送数据的大小的,在这个情况

下我们来看,对于来自TCP层的数据,IP会不会进行分片。

从第一张图看来,应用层的2748个字节在TCP层就进行了分段,分层了两个TCP段,一个1460字节,一个1288字节。那么到IP层的时候,自然就不会在进行分片了。

从第二张图片看出,在这两个TCP分段中,在序号3处,IP的头部字段(Don’ t Fragment) 被设置了,用于告诉IP层不要对该数据进行分片。

而对于MSS大小的协商,我们可以从下面这张图片看到,下面的图片是TCP CLIENT发出的第一个SYN TCP分段:

对于UDP来说,假设我们要发送的一个UDP数据包大小为1600个字节,那么在实际上通过UDP/IP分发出去的时候,会不会进行分片呢? 看如下的图片:

从上面的图片可以看出,我们发送的数据包的大小为1600字节(序号1处),在UDP层,长度为1608字节(序号2处),这里的8个字节是UDP的头部字段的长度, 到了IP层(序号3处),我们可以清楚的看到IP对UDP数据包进行了分片,一个大小为1480字节,一个为128字节。

TCP层的分段和IP层的分片之间的关系 MTU和MSS之间的关系相关推荐

  1. TCP/IP具体解释--TCP的分段和IP的分片

    写在前面: 分组能够发生在运输层和网络层.运输层中的TCP会分段,网络层中的IP会分片.IP层的分片很多其它的是为运输层的UDP服务的,因为TCP自己会避免IP的分片,所以使用TCP传输在IP层都不会 ...

  2. 71张图详解IP 地址、IP 路由、分片和重组、三层转发、ARP、ICMP

    目录 有小伙伴问:为什么没有配置 IP 地址就无法上网?IP 协议又是啥? 这要从 TCP/IP 协议说起,互联网使用的是 TCP/IP 协议,其中 IP 协议又是最重要的协议之一.IP 协议是基于  ...

  3. 【最全面的】71张图详解IP 地址、IP 路由、分片和重组、三层转发、ARP、ICMP

    转发自: Original Fox 网络技术平台 目录 有小伙伴问:为什么没有配置 IP 地址就无法上网?IP 协议又是啥? 这要从 TCP/IP 协议说起,互联网使用的是 TCP/IP 协议,其中 ...

  4. 会动的图解 | 既然IP层会分片,为什么TCP层也还要分段?

    什么是TCP分段和IP分片 我们知道网络就像一根管子,而管子吧,就会有粗细. 一个数据包想从管子的一端到另一端,得过这个管子.(废话) 但数据包的量有大有小,想过管子,数据包不能大于这根管子的粗细. ...

  5. 动图图解!既然IP层会分片,为什么TCP层也还要分段?

    文章持续更新,可以微信搜一搜「golang小白成长记」第一时间阅读,回复[教程]获golang免费视频教程.本文已经收录在GitHub https://github.com/xiaobaiTech/g ...

  6. 一个3200位长的tcp报文传到ip层_运输层

    进程之间的通信 运输层的两个主要协议 运输层的主要功能 运输层的端口 TCP的端口 UDP的主要特点 TCP主要特点 套接字 可靠通信的实现 停止等待协议 信道利用率 连续ARQ协议 TCP可靠通信的 ...

  7. Linux 网卡驱动学习(六)(应用层、tcp 层、ip 层、设备层和驱动层作用解析)

    本文将介绍网络连接建立的过程.收发包流程,以及其中应用层.tcp层.ip层.设备层和驱动层各层发挥的作用. 1.应用层 对于使用socket进行网络连接的服务器端程序,我们会先调用socket函数创建 ...

  8. TCP/IP 协议族 简介(应用层,传输层,网络层,链路层)

    互联网协议(Internet Protocol Suite [swi:t])是一个 网络通信模型,以及一整个网络传输协议家族,为互联网的基础通信架构.它常被通称为TCP/IP 协议族(TCP/IP P ...

  9. Internet协议栈 TCP/IP模型 、以太网封装以及解封装过程、物理层、链路层、网络层、传输层、应用层的作用 OSI七层模型

    目录 TCP/IP参考模型 以太网数据封装以及解封装过程: 各层次的传输数据单元 ​编辑 物理层: 发送端: 接收端: 作用: 链路层: 作用: 网络层: 作用: 传输层: 8个比特(bit)=1个字 ...

  10. Tcp头部字段,与ip层关系,与udp区别,使用场景,Tcp状态

    udp和tcp区别?为什么快,分清楚目的和手段 tcp是传输控制协议,是面向连接的协议,发送数据前需要先在发送方和接收方之间建立连接,tcp提供可靠的服务,传输的数据无差错.不重复.不丢失.且按序到达 ...

最新文章

  1. Tomcat服务器server.xml详解
  2. Java入门之HelloWorld
  3. LARS 最小角回归算法简介
  4. maven工程拆分与聚合的思想
  5. CV新赛事:密集场景行人检测
  6. python读hadoop_python读取hdfs并返回dataframe教程
  7. php sql慢查询,一个用户SQL慢查询分析,原因及优化_MySQL
  8. 中小企业怎样转型做跨境电商独立站?
  9. 使用echarts3实现散点地图
  10. python类的继承代码_python--类的继承
  11. 106572050018总是发彩信?实用办法关闭彩信提醒
  12. three.js 入门指南(敷衍一下)
  13. java中怎么引用圆周率_Java简单计算圆周率完整示例
  14. 关于wish平台收款方式的比较,哪个更好?
  15. 发改委印发三年行动计划 智能机器人有望成为下一片蓝海
  16. redis源码注释二:简单字符串sds.c sds.h
  17. 拓嘉启远:拼多多虚拟产品相关分享
  18. 查漏补缺:Java10之后,var成为关键字了吗
  19. 在线文本删除空行工具
  20. 自学车载以太网笔记(2)

热门文章

  1. 飞冰:Iceworks 自定义模板支持布局定制(v2.3.0 版本)
  2. 基于Spring MVC的Excel文件上传
  3. YII composer全局安装
  4. 关于Eclipse(MyEclipse)中一次性批量导入多个项目Project.
  5. ECSHOP首页调用指定分类推荐商品/热卖商品/新品商品
  6. Hibernate反射DAO模式
  7. \sbin\nginx:cannot execute binary file
  8. Cisco6500的NAT配置方法
  9. 6.高性能MySQL --- 查询性能优化(2)
  10. 53. 使 Ajax 可缓存(14)