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

1,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来分了!

2,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.

故采用TCP协议进行数据传输,是不会造成IP分片的。若数据过大,只会在传输层进行数据分段,到了IP层就不用分片。

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

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

若TCP报文非常长那么在IP层传输时就有可能要分解成多个短数据报片。(计算机网络谢希仁)

TCP分段每个都有完整首部。

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

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层的分片之间的关系 & MTU和MSS之间的关系 (转载)

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

  2. 老斜两宗事-七层代理模式还是IP层VPN

    1.七层代理模式还是IP层VPN 非常多人会问,我究竟是使用代理模式呢,还是使用VPN模式,假设我想数据在中间不安全的链路上实现加密保护的话.这个问题有一个背景.那就是,你想保护你的数据,能够使用VP ...

  3. TCP/IP协议之IP层

    TCP/IP协议的结构参见下图.有应用层,运输层,网络层,链路层. 但是如果更细化的话,其实还有几层没在这上面体现出来. 1 表示层:数据格式化,代码转换,加密. 没有协议 2 会话层:解除或者建立与 ...

  4. 【网络协议】TCP分段与IP分片

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/30109789     我们在学习TCP/IP ...

  5. 【转】TCP分段与IP分片

    原文: :https://www.jianshu.com/p/f9a5b07d99a2 -------------------------------------------------------- ...

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

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

  7. IP 层收发报文简要剖析2--ip报文的输入ip_local_deliver

    ip报文根据路由结果:如果发往本地则调用ip_local_deliver处理报文:如果是转发出去,则调用ip_forward 处理报文. 一.ip报文转发到本地: /* * Deliver IP Pa ...

  8. tcp netstat用法 TIME_WAIT状态解析 MTU以及MSS

    带着问题写博客 问题1:使用netstat查看有源TCP连接的状态时,经常会看到established状态,那么还有哪些状态,这些状态是如何变化的呢? 问题2:TIME_WAIT状态存在的必要? 问题 ...

  9. 数据帧、MTU、MSS、IP分片

    1.以太网帧 在以太网链路上的数据包称作以太帧,在802.3标准里,规定了一个以太帧的数据部分(Payload)的最大长度是1500个字节(MTU),再加上14字节链路头和4字节的FCS,所以以太网帧 ...

随机推荐

  1. 一些日常工具集合(C++代码片段)

    一些日常工具集合(C++代码片段) ——工欲善其事,必先利其器 尽管不会松松松,但是至少维持一个比较小的常数还是比较好的 在此之前依然要保证算法的正确性以及代码的可写性 本文依然会持久更新,因为一次写 ...

  2. 洛谷.4008.[NOI2003]editor文本编辑器(块状链表)

    题目链接 st(n)表示sqrt(n) 为使块状链表不会退化,通常将每块的大小S维持在[st(n)/2,2st(n)]中,这样块数C也一定[st(n)/2,2st(n)]中 在此使用另一种方法(方便) ...

  3. Python图形编程探索系列-06-按钮批量生产函数

    设计任务 初步设计一个批量生产按钮的函数,根据需要的按钮数量,自动生成多少按钮. 函数设计 import tkinter as tk # 导入tkinter库 root = tk.Tk() # 建立程 ...

  4. ios真机调试错误解决:Installation of apps is prohibited by a policy on the device

    该问题的出现原因是手机中的访问权限被关闭了,打开方法如下: 设置->通用->访问限制->安装应用程序

  5. pt-query-digest简介使用

    简介        pt-query-digest 是用于分析mysql慢查询的一个工具,与mysqldumpshow工具相比,py-query_digest 工具的分析结果更具体,更完善. 有时因为 ...

  6. Java基础-多线程-③线程同步之synchronized

    使用线程同步解决多线程安全问题 上一篇 Java基础-多线程-②多线程的安全问题 中我们说到多线程可能引发的安全问题,原因在于多个线程共享了数据,且一个线程在操作(多为写操作)数据的过程中,另一个线程 ...

  7. A - K进制下的大数

    https://vjudge.net/contest/218366#problem/A 中间溢出,注意求模. #include<iostream> #include<cstdio&g ...

  8. Android中AES256加密的实现

    AES加密是我们在工作中常用到一种加密方式,并且在java中也已经实现好了其相应的接口. 但是Java自带的JDK默认最多实现128位及其以下的加密.如果使用java自带的api实现aes256将会报 ...

  9. 9.5 dubbo事件通知机制

    dubbo事件通知机制:http://dubbo.io/books/dubbo-user-book/demos/events-notify.html 一.使用方式 两个服务: DemoService: ...

  10. 微信小程序wxss的background本地图片问题

    在web 或者webapp开发中我们习惯了直接饮用本地图片做背景,例如 .aaa { background: url('img/1.png'); } 但是这种引用方式在微信小程序中是无法使用的,控制台 ...