TCP是如何实现可靠链接的?

TCP是如何实现可靠链接的?

TCP是面向链接的协议,它与UDP的不一样之处主要有两点:
一、TCP是面向链接的,而UDP是不面向链接的;
二、TCP的信息传输是可靠的,而UDP的信息传输是不可靠的。
那么TCP是如何实现可靠链接的呢?
TCP协议主要经过检验和、序列号、确认应答(ACK)、重发控制、链接管理、窗口控制等实现可靠性链接。

1、确认应答:ACK(Positive Acknowled-gement)意指已经接收。

假设没有丢包,那么发送端每次发送数据后都会受到接收端的确认应答(ACK),发送端只有受到接收端的确认应答(ACK)后,才会继续发送数据。
clipboard.png网络

假设发送过程当中产生了丢包,那么在特定时间内发送端将没法受到接收端的确认应答(ACK),以后发送端会从新发送以前的数据,直到在发送数据后的特定时间内受到接收端的确认应答(ACK)。
clipboard.png函数

请思考:那么若是出现如下状况怎么办? 根据上面说的规则,发送端只有在特定时间内接收到的ACK才会中止从新发送以前的数据,那么若是发送端发送数据后,由于网络延迟等缘由,接收端发送的ACK出现了延迟,致使发送端在特定时间外接收到接收端的ACK,那对接收端来讲就是一个“灾难”——它在不断地接收发送端发来的重复数据。性能

2、序列号

看了上述思考题后,首先咱们会想到这种状况是彻底有可能的,由于网络的不稳定颇有可能致使这种状况,可是TCP要保证不管是在何种状况下都要有高性能的传输能力,那么该如何作呢?
为了不上述状况,保证TCP高性能的传输能力的特性,协议中给发送端的每段数据都规定了一个序列号。
以下图所示,为了方便起见,咱们将数据按照1000为一个单位,数据的初始序列号为数据量(实际中是以数据的散列值为准),每当发送端发送数据时,会将序列号放入TCP包的首部中,而后接收端接收到数据后会解析TCP包的首部,在序列号的基础上+1生成新的序列号,经过ACK发回给发送端,那么即便当发送端在特定时间外接收到以前接收端返回的ACK,发送端会根据序列号判断是否要继续从新发送以前的数据。自此,经过序列号咱们解决了因网络延迟的问题不断从新发送相同数据的状况。
clipboard.pngspa

请思考:经过上文,咱们了解到TCP发送数据后会有一个特定的等待时间,若是这个等待时间过长,那么势必会致使数据传输性能减弱,若是太短,那么发送端将会发送屡次相同数据,一样致使数据传输性能减弱,那么如何作到合理的规定这个特定的等待时间呢?code

3、重发控制

首先咱们将那个等待的特定时间定义为重发超时——是指重发数据以前,等待ACK到来的那个特定时间。
TCP要求不论在何种网络环境下都要提供高性能通讯,而且不管网络拥堵状况发生何种变化,都必须保持这种特性。为此,它在发包时都会计算往返时间及其误差。
计算完往返时间及其误差后,将往返时间加上误差就能得出重发超时。
数据被重发以后若仍是收不到确认应答,则进行再次发生。此时,等待确认应答的时间将会以2倍、4倍的指数函数增加。此外,数据不会被无限、反复的重发。达到必定重发次数以后,若是仍没有任何确认应答返回,就会判断为网络或对端主机发生异常,强制关闭链接。而且通知应用通讯异常强行终止。ip

请思考:获得重发超时后,按理咱们已经基本已经完成了基本的可靠性传输,可以保证丢包后从新发送而且不会出错,那么为何TCP还要规定其余的东西呢?目前咱们完成的协议是否有弊端?该如何解决?it

4、窗口控制

在了解什么是窗口控制前,咱们须要知道的是以前咱们完成的方案是存在弊端的,那就是实际传输效率很低。那是由于每次咱们要发一个包都得等一个ACK甚至是重发超时+ACK的时间,若是发送的数据不少,那么势必会影响到传输速度,而这显然违背了TCP高性能传输的特性。
为了解决这个弊端,TCP提出了一个很好的解决方案——窗口控制。
如图下图所示,ACK再也不是以每一个分段,而是以更大的单位进行确认时,转发时间将会被大幅度的缩短。也就是说,发送端主机,在发送了一个段之后没必要要一直等待确认应答,而是继续发送。
clipboard.pngclass

自此,咱们基本实现了高性能的可靠性传输,而TCP在此以外还规定了其余的内容,如流控制,用来处理缓冲区满的状况等等,这些内容进一步提升了传输性能。
最后,建议初学者能够去看《图解TCP/IP》。效率

相关文章
相关标签/搜索