TCP数据流稳定性--TCP分片,重组及乱序
http://www.cnblogs.com/derekchen/archive/2009/07/15/1524415.html
1、IP分片的情况。IP软件包有一个[分片]和[重组]模块,一个IP数据报在传输中可以被ip软件包的[分片]模块分片,在目的接收端B的IP软件包 的[重组]模块重新组合。接收端B的IP软件包如果收到乱序的IP报文,是不会把这个包交付到高层TCP协议的,直到收到同一个IP报文的全部分片。所 以,如果发送端的FIN被分片,接收端B在收到完整的此IP数据报之前,TCP模块不会收到这个包的任何分片。
2、发送端A发送了一个FIN,这仅代表发送端A想终止传输,并不代表另一端B想终止。这就是说,终止双向链接需要4次握手断开(也有3次握手断开,类似 3次握手链接),比如,发送端A向发送端B发一个查询请求,发送端A已经没有更多的数据要发送了,因此可以发送FIN请求一端断开,也称为半断开,然后, 另一端B则需要时间处理请求,再把查询结果返回给A,最后B发送FIN。
1)首先是A发送FIN,然后收到来自B的对这个FIN的确认,此时,发送端A将不能发送任何数据包,但可以接受B发来的数据包(这是非常常见的传输模式,客户端发完,终止链接)。
2)发送端B仍旧可以继续发送数据包,直到高层没有更多的数据,发送端B发送FIN,A收到后发送对这个FIN的确认。此时,双方都不能再传输任何数据了。
3、TCP协议规定,对于收到的乱序报文并不丢弃,而是缓存下来(这样做是为了减少更多的重传),立即发送希望接受的报文确认。例如:发送端A发送了以下几个包:第一个:1001-1100,第二个1101-1200,第三个FIN包(序列号是1201,一个虚字节)。
1)第二个包在传输的过程中丢失了,接收端收到第三个包后并不丢弃,而是缓存下来,然后,立即发送一个ACK,确认号是1101(这样做的目的是不必等到发送端A的第二个包超时后重传,发送端A收到3个同样的ACK后立即重传,这是快速重传的概念)。
2)当发送端A收到3个确认号都是1101或者第二个包的超时计时器到时间后,立即重新发送第二个包(之所以可以重传,是因为TCP协议在接收端和发送端都各自建立了两个发送、接收缓存)。
3)这样,当接收端B收到来自A的第二个包后,缓存中的数据都是按序的了。
4)对于按序包,接收端B对序列号的最后一个字节+1,也就是发送确认号是1202的ACK包。
5)发送端A收到确认号是1202后,便不能再发送任何数据了。
TCP 的传输机构有多个定时器。当一个包发送时,重发定时器开始计数;当收到确认信号后,重发定时器停止计数。如果超过设定时间段还没有收到确认信号,就 重发该包。一个比较棘手的问题是如何设置该时间段。如果太长,当网络传输错误增加时将导致不必要的等待时间;如果太短,就会产生过多的重复包从而降低网络 的反应时间。现代TCP协议根据实际情况对重发定时器进行动态设定。
不 管重发过程执行得多么有效,很少的丢失包就能严重地降低TCP连接的流量。每个未收到的包或包的片段只会在重发定时器超时的时候才会丢失。在数据重发 时,接收过程一直在递送这些重发的数据,这样就使总体的数据传输陷于停顿,直到丢失的数据被取代为止。这些重发过程导致基于TCP的连接有时处于不稳定状 态。
IP丢包:
1。接受方:在以太网上,服务端有可能响应不过来(大量客户端有读写需求),服务端访问密集,丢弃包在所难免
2。 发送方:大量客户端同时请求服务器发送数据,并且通告窗口很大,那么服务器会很快的把分组送到网卡上,考虑一种比较极端的情况,网络中还有大量流量占用带宽,致使 服务器不能迅速将数据发送出去,而网卡可以缓存的分组数是有一定限制的,那么肯定会有数据在未发送前就被丢弃了!而接收方对这种情况毫无所知,不会更改通 告窗口的大小,即流量控制不会起作用
3。网络传输
http://bbs.chinaunix.net/thread-4151013-1-1.html
大家好, 最近在看一些tcp/ip重组方面的东西,有一些问题一直是想不明白?
1、tcp重组和ip重组的区别?? 我的理解是ip重组是重组ip碎片,将ip碎片组成一个包。tcp重组是将乱序包排序,不知道这样理解是不是对的?
对
2、ip碎片包是不是都包含tcp的头部? 重组的时候是要把这些头部都偏移掉吗?
不是,在IP层看来,TCP的负载以及TCP头都是IP层的负载,IP层不会去做解释,直接按大小切片。
3、我用socket程序发一个5000字节的数据,用抓包软件抓数据包看了下,在数据包的ip层头部没有看到设置分片标识和偏移量这两个值,搞不明白这是怎么回事?
因为在TCP层已经根据协商的MSS对数据进行切分,MSS在协商时已经考虑了MTU,因此传递给IP层的数据包不需要再进行切分。
如果想看到IP层切分的效果,最简单的方式是PING命令,同时通过参数指定数据包的大小大于MTU,就可以看到了。你也可以自己写个UDP的程序去发送大于MTU的数据包。
第三个问题,tcp建立链接的时候协商mss,mss的大小考虑了MTU的大小,也就是说mss是小于MTU的,是不是对于tcp的应用来说,ip层是不会进行分片的,tcp层在组装的时候已经依据mss的大小对应用层数据进行了切割??
是的,TCP不会网IP层发送大于MTU的报文,这个之前chinauxix有讨论。
TCP数据流稳定性--TCP分片,重组及乱序的更多相关文章
- TCP协议下大数据传输IOCP乱序问题
毕业后稀里糊涂的闭门造车了两年,自己的独立博客也写了两年,各种乱七八糟,最近准备把自己博客废了,现在来看了下这两年写的对我来说略微有点意义的文章只此一篇,转载过来以作留念. 写的很肤浅且凌乱,请见谅. ...
- 计算机网络知识(TCP连接,TCP/UDP区别,HTTP与HTTPS,Socket原理等等)
1.网络七层协议包含,物理层.数据链路层.网络层(ip协议).传输层(TCP传输控制协议.UDP用户数据报协议).会话层.表示层.应用层(http协议).是一个提供的概念架构协议. 2.TCP/IP协 ...
- Wireshark理解TCP乱序重组和HTTP解析渲染
TCP数据传输过程 TCP乱序重组原理 HTTP解析渲染 TCP乱序重组 TCP具有乱序重组的功能.(1)TCP具有缓冲区(2)TCP报文具有序列号所以,对于你说的问题,一种常见的处理方式是:TCP会 ...
- 基于libnids的TCP数据流的还原(多线程实现) .
我们知道,libnids本身可以实现TCP数据流的重组,但是如果一个TCP流数据量比较大的时候,就会分成好多个TCP报文段,这些报文段在网络中的传播可能是乱序的,利用libnids可以帮助我们按顺序接 ...
- 【网络协议】TCP分段与IP分片
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/30109789 我们在学习TCP/IP ...
- 【转】TCP分段与IP分片
原文: :https://www.jianshu.com/p/f9a5b07d99a2 -------------------------------------------------------- ...
- Wireshark抓包实例分析TCP重复ACK与乱序
转载请在文首保留原文出处: EMC 中文支持论坛https://community.emc.com/go/chinese 介绍 TCP 的一大常见问题在于重复 ACK 与快速重传.这一现象的发生也是由 ...
- TCP/IP之TCP交互数据流、成块数据流
建立在TCP协议上的网络协议有telnet,ssh,ftp,http等等.这些协议根据数据吞吐量来分成两大类: (1)交互数据类型,例如telnet,ssh,这种类型的协议在大多数情况下只是做小流量的 ...
- 略解TCP乱序和丢包
在使用基于TCP实现的各种组件的时候,我们经常会处理数据包.这数据包说来奇怪,从来不会丢失,也不会乱序,只会产生粘包.底层的机制是如何实现的呢?进来我们就来用简洁易懂的文字描述清楚. 在TCP数据包设 ...
随机推荐
- struts 2.0部署
环境:linux centos 64位. 1)下载JDK6.0,具体文件名是:jdk-6u45-linux-x64.bin 安装:chmod 755 jdk*.bin ./jdk....bin 设置环 ...
- 系统性能调优CPU与内存
CPU相关术语 处理器:插到系统插槽或者处理器版上的物理芯片,以核或者硬件线程的方式包含了一块或者多块CPU. 核:一颗多核处理器上的一个独立CPU实例.核的使用时处理器扩展的一种方式,有称为芯片级多 ...
- [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Java用native2ascii命令做unicode编码转换
背景:在做Java开发的时候,常常会出现一些乱码,或者无法正确识别或读取的文件,比如常见的validator验证用的消息资源(properties)文件就需要进行Unicode重新编码.原因是java ...
- JDBC工作模块
jdbc-->java数据库连接 的简称 JDBC工作模块 加载jdbc驱动 与数据库连接 发送sql语句,得到返回结果 处理返回结果 释放资源
- bzoj4152 [AMPPZ2014]The Captain
最短路,先将x排序,然后把排序后权值相邻的点连边,再把y排序,也把权值相邻的点连边,求一遍1到n的最短路就好啦. 代码 #include<cstdio> #include<queue ...
- bzoj3489 A simple rmq problem 可持久化树套树
先预处理出两个个数组pre,next.pre[i]表示上一个与i位置数字相同的位置,若不存在则设为0:next[i]表示下一个与i位置数字相同的位置,若不存在则设为n+1.那么一个满足在区间[L,R] ...
- kafka 0.8.x producer Example(scala)
Producer 最简配置 metadata.broker.list参数指定broker地址,这里不需要填上所有的broker地址,但是如果只写一个,这个broker挂掉后就无法往topic中写入信息 ...
- paper 51:图像复原
图像退化: 图像在形成.记录.处理和传输过程中,由于成像系统.记录设备.传输介质和处理方法的不完善,导致图像质量的下降,这种现象叫做图像退化. 图像复原: 就是对退化的图像进行处理,尽可能恢复出原始 ...
- 夺命雷公狗---node.js---11之文件上传
我们在做文件上传前需要用npm来安装一个插件先, 首先打开项目所在的目录,然后按住shift键然后右键鼠标进入命令行安装formidable 然后开始编写上传的静态页面: <!DOCTYPE h ...