TCP如何保证可靠性

TCP传输控制协议 
TCP 协议是一种面向连接的,为不同主机进程间提供可靠数据传输的协议。TCP 协议假定其所使用的网络栈下层协议(如IP 协议)是非可靠的,其自身提供机制保证数据的可靠性传输。在目前的网络栈协议族中,在需要提供可靠性数据传输的应用中,TCP 协议是首选的,有时也是唯一的选择。TCP协议使用的是网络层协议(如IP协议)提供的服务。 
网络层协议主要完成对上层协议的数据的传递,但是不提供数据的可靠性传递,可靠性主要由上层协议(如TCP协议提供,但是UDP协议不提供可靠性)。
TCP实现可靠性传输的底层实现机制主要包括:1> 使用序列号对传输的数据进行编号,     2>数据超时重传,    3>数据确认应答!

网络层协议主要完成的工作是: 
(1)实现不同网络(主机)间的数据包路由传递。
(2) 在发送端(或中转站)提供数据包分片功能以使数据包大小满足 PMTU(路径MTU(最大尺寸))。
(3) 在接收端提供数据包分片重组功能
(4) 负责数据包优先级,安全性等问题。

传输层协议(主要是TCP协议)的工作: 
1> 提供多路复用。
2> 实现数据基本传输功能。
3> 建立通信通道。
4> 提供流量控制。
5> 提供数据可靠性传输保证。

数据可靠性传输包括的内容

1> 能够处理数据传输过程中被破坏问题。

2> 能够处理重复数据接收问题。

3> 能够发现数据丢失以及对此进行有效解决。

4> 能够处理接收端数据乱序到达问题。

TCP 协议可靠性数据传输实现基本原理

TCP 协议必须提供对所有这些问题的解决方案方可保证其所声称的数据可靠性传输。TCP协议规范和当前绝大多数TCP 协议实现代码均采用数据重传和数据确认应答机制来完成TCP 协议的可靠性数据传输。数据超时重传和数据应答机制的基本前提是对每个传输的字节进行编号,即我们通常所说的序列号。数据超时重传是发送端在某个数据包发送出去,在一段固定时间后如果没有收到对该数据包的确认应答,则(假定该数据包在传输过程中丢失)重新发送该数据包。而数据确认应答是指接收端在成功接收到一个有效数据包后,发送一个确认应答数据包给发送端主机,该确认应答数据包中所包含的应答序列号即指已接收到的数据中最后一个字节的序列号加1,加1 的目的在于指出此时接收端期望接收的下一个数据包中第一个字节的序列号。数据超时重传和数据确认应答以及对每个传输的字节分配序列号是TCP 协议提供可靠性数据传输的核心本质。


1)数据确认应答数据包中应答序列号的含义


应答序列号并非其表面上所显示的意义,其实际上是指接收端希望接收的下一个字节的序列号。所以接收端在成功接收到部分数据后,其发送的应答数据包中应答序列号被设置为这些数据中最后一个字节的序列号加一。所以从其含义上来说,应答序列号称为请求序列号有时更为合适。应答序列号在TCP 首部中应答序列号字段中被设置。而TCP 首部中序列号字段表示包含该TCP 首部的数据包中所包含数据的第一个字节的序列号(令为N)。如果接收端成功接收该数据包,之前又无丢失数据包,则接收端发送的应答数据包中的应答序列号应该为:N+LEN。其中LEN 为接收的数据包的数据长度。该应答序列号也是发送端将要发送的下一个数据包中第一个字节的序列号(由此亦可看出上文中将应答序列号称为请求序列号的原因所在)。


2)数据确认应答中的累积效应


TCP 协议中接收端对所接收数据的应答是累积的。累积的含义有二:


1>应答序列号是逐渐递增的,这与发送端数据编号是递增的相吻合。


2>不可进行跨越式数据应答。


所谓不可进行跨越式数据应答,可以以数据包乱序到达为例进行说明。如果由于发送端所选择传输路径的不同,较后发送的序列号较大的数据包先到达接收端,而先发送的序列号较小的数据包由于线路问题(或路由器故障)被暂时延迟在网络中,此时接收端不可对这些序列号较大的数据进行应答。如果接收端需要发送一个应答数据包,则应答序列号仍然应该设置成对序列号较小的数据包的请求(注意应答序列号指的是接收端希望接收的下一个字节的序列号,故在数据传输过程中将应答数据包称为数据请求数据包更为合适)。举例来说,如果接收端目前的应答序列号为201,表示接收端正在等待发送端发送从201 开始编号的数据,之后发送端连续发送了两个数据包,第一个数据包中数据序列号范围为201-300,第二个数据包中数据序列号范围为301-400。如果由于选择了不同的传输路径造成第二个数据包最先到达接收端,而第一个数据包在网络中延迟了一段时间,则接收端不可对第二个数据包进行应答,即不可发送应答序列号为401 的确认应答数据包,而是不断发送应答序列号为201的应答数据包直到该序列号的数据到达。我们通常所说的快速重传机制即发送端在连续接收到3 个相同序列号的应答数据包后需要立刻重传应答序列号所表示的数据。因为此时表示极有可能出现了数据包丢失的情况,如上例中第一个数据包如果丢失在网络中并且发送端重传的相同数据包由于选择相同的线路也未能到达接收端,则接收端将不断发送应答序列号为201 的应答数据包而不会将应答序列号设置为401。注意此时接收端已接收到序列号从301-400 的数据。


3)重传应答机制与序列号结合:


1> 能够处理数据在传输过程中被破坏的问题。


首先通过对所接收数据包的校验,确认该数据包中数据是否存在错误。如果有,则简单丢弃或者发送一个应答数据包重新对这些数据进行请求。发送端在等待一段时间后,则会重新发送这些数据。本质上,数据传输错误的解决是通过数据重传机制完成的。


2> 能够处理接收重复数据问题。


首先利用序列号可以发现数据重复问题。因为每个传输的数据均被赋予一个唯一的序列号,如果到达的两份数据具有重叠的序列号(如由发送端数据包重传造成),则表示出现数据重复问题,此时只须丢弃其中一份保留另一份即可。多个数据包中数据重叠的情况解决方式类似。本质上,数据重复问题的解决是通过检查序列号完成的。


3> 能够发现数据丢失以及进行有效解决。


首先必须说明,此处数据包丢失的概念是指在一段合理时间内,应该到达的数据包没有到达,而非我们平常所理解的永远不到达。所以数据包丢失与数据包乱序到达有时在判断上和软件处理上很难区分。数据丢失的判断是猜测性的,我们无法确定一个数据包一定丢失在传输过程中,大多是被延迟在网络中,即实质的问题只是数据包乱序到达。将二者区分开来的一个主要依据是在合理的时间内,由这个可能丢失的数据包所造成的序列号“空洞“是否能够被填补上。可能的数据丢失一个显然的结果是在接收端接收的数据出现序列号不连续现象。如接收端只接收到序列号从1 到100 的数据包,之后又接收到序列号从200 到300 的数据包,而且在一段合理的


时间内(由此基本排除乱序问题),序列号从101 到199 的数据一直未到达,则表示包含序列号从101 到199 的数据包在传输过程中很可能丢失(或者有极不正常的延迟)。对数据包是否丢失判断的另外一个干扰因素是发送端的重传机制,如果一个序列号较前的数据包在网络中丢失,造成序列号较后的数据包提前到达接收端,也会暂时造成序列号不连续,但由于发送端在没有接收到确认应答时,会重新发送序列号较前的那个数据包,如果此后接收端接收到一个重传的数据包,则仅仅只会在接收端造成数据包乱序到达的表象。无论实质如何,如果软件实现判断出数据包丢失,则接收端将通过不断发送对这些丢失的数据的请求数据包(也即应答数据包,见前文中对数据应答数据包和数据应答累积效应的说明)来迫使发送端重新发送这些数据。通常发送端自身会自发的重传这些未得到对方确认的数据,但由于重传机制采用指数退避算法,每次重传的间隔时间均会加倍,所以通过发送方主动重传机制恢复的时间较长,而接收端通过不断发送对这些丢失数据的请求,发送端在接收到三个这样的请求数据包后(三个请求数据包中具有同一个请求序列号–也即前文中所说的应答序列号),会立刻触发对这些数据的重新发送,这称为快速恢复或者快速重传机制。本质上,对于数据丢失问题的解决是通过数据重传机制完成的。在此过程中序列号和数据确认应答起着关键的作用。


4> 能够处理接收端数据乱序到达问题。


如果通信双方存在多条传输路径, 则有可能出现数据乱序问题,即序列号较大的数据先于序列号较小的数据到达,而发送端确实是按序列号由小到大的顺序发送的。数据乱序的本质是数据都成功到达了,但到达的顺序不尽如人意。对这个问题的解决相对比较简单,只需对这些数据进行重新排序即可。本质上,对数据乱序问题的解决是通过排序数据序列号完成的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言 数组循环移动,如何将一个数组的元素循环左移?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #define SIZE(a) (sizeof(a)/sizeof(a[0]))#define HBIT(a) ((a & 0x00000080) ! 0)#define LBIT(a) ((a & 0x00000001) ! 0)int TAB[] {0x10, 0x71, 0x12, 0x10, 0x10, 0x7C, 0x00, 0x00,0x00, 0x00, …

你们还在用8位单片机吗?

工作这些年,一种从事嵌入式相关的工作,大部分接触的是ARM芯片,不过也有接触到8位单片机的机会,在一些控制领域,8位单片机还是有自己的用武之地的,大家也来说一说,自己还有接触到8位单片机吗&…

生成 excel 直接用 httpServletResponse 输出

之前写过一篇文章 《超详细的java生成excel文件并下载》,该文章虽然够详细,也行得通,但还是有一定的缺陷,该文章可以拆分成两个部分,一是指定位置生成excel文件,二是根据地址下载文件。缺陷的部分是会产生中…

获取网站投资(融资成功)的20个自我检查

1、web2.0提了也白提web2.0这是一个概念,打着web2.0的概念,只是说技术如何如何2.0,战略如何2.0,其实意 义真的不大。投资人需要的是一个网民能够接受,并且很有特点的网站,能够满足网民的某个需求&#xff0…

MYSQL AB复制原理

Mysql复制(replication)是一个异步的复制,从一个Mysql instace(称之为Master)复制到另一个Mysql instance(称之Slave)。实现整个复制操作主要由三个进程完成的,其中两个进程在Slave&…

TCP拥塞控制详解

为了防止网络的拥塞现象 ,TCP提出了一系列的拥塞控制机制。最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congestion avoidance)”组成,后来TCP Reno版本中又针对性的加入了“快速重传(Fast retransmit)”…

北航博士,研究所月入两万

大家好,看到张老师的一篇文章,说的一位研究生大哥的心路历程,分享给大家。作者:易贝贝https://www.zhihu.com/question/64371326/answer/2251105460文章转自:大鱼机器人北航博士,2019 年 7 月毕业&#xff…

分号是不是c语言的一部分,问什么C程序里总是提示缺少分号;,而明明有分号?...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼if(lpNULL)printf("********还没存入图书********\n");else{for(s0;s<5;s){while(( szp->snumber[s]!lp->number )&&(lp->next!NULL))lplp->next;if( szp->snumber[s]lp->number){printf(&…

django使用用户名或手机号码登录

django有自己的认证系统&#xff0c;会自动根据用户名和密码进行验证。如果需要使用用户名或手机登录的话&#xff0c;需要重写django的认证后台&#xff0c;并且设置到配置文件中。 重写django的认证后台 class UsernameMobileAuthBackend(ModelBackend):"""用…

ArcUser 2006第2期拾零

前天收到了上半年的两期ArcUser&#xff0c;其中第二期的主题是Imagery In GIS。这一期的“聚焦”是“Using Imagery”&#xff0c;其中包含5篇文章&#xff1a;Leverage Imagery in ArcGISMobile GIS and Digital PhotomappingThe Key to the Present is the PastUnderstandin…

工作的习惯,看到好收藏下

转载的&#xff0c;读过了感觉有收获&#xff0c;分享下。1&#xff0c;当时公司招了大批应届本科和研究生毕业的新新人类。平均年龄25岁。那个新的助理&#xff0c;是经过多次面试后&#xff0c;我亲自招回来的一个女孩。名牌大学本科毕业&#xff0c;聪明&#xff0c;性格活泼…

TCP传输过程中丢包问题

TCP协议本身是保证传输的数据完整性不会丢数据的。如果通信中发现缺少数据或者丢包&#xff0c;那么&#xff0c;最大的可能在于程序发送的过程或者接收的过程出现问题。例如服务器给客户端发大量数据&#xff0c;Send的频率很高&#xff0c;那么就有可能在Send时发生错误&…

c语言随机迷宫生成器,作为新手该如何快速上手 C++

1.C 实现基数树使用 C 实现Radix树&#xff1a;一种基于二进制表示的键值的查找树&#xff0c;尤其适合处理非常长的、可变长度的键值&#xff0c;Patricia 的基本思想是构建一个二叉树。2.C 实现并行计算的K-Means聚类算法使用 C 实现一个完整的面向对象的可并行K-Means算法。…

薪资是跳出来的,不是涨出来的!

下面的内容是转自朱老师的公众号&#xff0c;他说的观点我是认同的&#xff0c;之前在一个国外的论坛&#xff0c;有个老外总结了程序员的涨薪情况&#xff0c;里面就有提到&#xff0c;如果想拿到比较好的薪水&#xff0c;靠的还是跳槽。当然&#xff0c;他还总结了很多其他方…

团队Alpha冲刺(三)

目录 组员情况组员1(组长)&#xff1a;胡绪佩组员2&#xff1a;胡青元组员3&#xff1a;庄卉组员4&#xff1a;家灿组员5&#xff1a;凯琳组员6&#xff1a;丹丹组员7&#xff1a;家伟组员8&#xff1a;政演组员9&#xff1a;鸿杰组员10&#xff1a;刘一好组员11&#xff1a;何…

收缩数据库

http://codehunter008.cnblogs.com/archive/2005/05/08/150998.aspxhttp://wuchang.cnblogs.com/archive/2004/10/13/51835.html 转载于:https://www.cnblogs.com/passrift/archive/2006/09/26/515292.html

我的助理辞职了!——给不听话的下属看看~

喜欢收藏下&#xff0c;以后给新人看。 是本人转载的&#xff0c;与诸位分享、交流。1&#xff0c;当时公司招了大批应届本科和研究生毕业的新新人类。平均年龄25岁。那个新的助理&#xff0c;是经过多次面试后&#xff0c;我亲自招回来的一个女孩。名牌大学本科毕业&#xf…

快速排序非递归算法c语言实现,数据结构与算法----3.5 非递归的快速排序方法

[c]代码库#include using namespace std;#include using namespace std;typedef int KeyType;struct LElemType{KeyType key;};struct SElemType{int a;int b;};struct SList{LElemType *r;int length;};const int StackInitSize10;const int StackInc15;struct SStack{SElemTy…

C++类中成员变量的初始化总结

C类中成员变量的初始化总结 1. 普通的变量&#xff1a; 一般不考虑啥效率的情况下 可以在构造函数中进行赋值。考虑一下效率的可以再构造函数的初始化列表中进行。 1 class CA 2 { 3 public: 4 int data; 5 public: 6 CA(); 7 }; 8 9 CA::CA():data(0) //……#1……

今天把房子定下来了

今天同学L跟我说&#xff0c;今天付了定金&#xff0c;把买房子的事给定下了。先说下疫情这两年的房价在疫情之前&#xff0c;2019年那时候&#xff0c;深圳经历了一波房价上涨&#xff0c;那时候的房价上涨是我完全没有预料到的&#xff0c;但是在2015年房价的那一波房价上涨&…