Linux(二十五)TCP的可靠性体现

TCP保证可靠性的方式

*校验和
*序列号
*确认应答
*超时重发
*连接管理
*流量控制
*拥塞控制

校验和

TCP校验和是一个端到端的校验和,由发送端计算,然后由接收端验证,其目的就是为了发现TCP首部和数据在发送端到接收端之间发生的任何改动,如果接受方检测到校验和有差错,那么TCP段会被直接丢弃。
TCP校验和覆盖TCP首部和TCP数据

确认应答(ACK)机制

TCP为每个字节的数据都进行了编号,即序列号
这里写图片描述

每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;下次你从哪里开始发。

超时重传机制

主机A发送数据给主机B后,可能因为网络拥堵等原因,数据无法到达主机B;如果主机A在一个特定时间间隔内没有收到B发来的确认应答,就会进行重发;但是主机A未收到B发来的确认应答,也可能是因为ACK丢失了;
因此主机B会收到很多重复数据,那么TCP协议需要能够识别出哪些包是重复的包,并且把重复的丢弃掉,这时候我们可以利用前面提到的序列号们就可以很容易做到去重的效果。

那么,如果超时,超时的时间如何确定?
*最理想的情况下,找到一个最小的时间,保证“确认应答一定在这个时间内返回”。
*但是这个时间的长短,随着网络环境的不同,是有差异的。
*如果超时时间设的太长,会影响整体的重传效率;
*如果超时时间设的太短,有可能会频繁的发送重复的包;

TCP为了保证无论在任何环境下都能比较高性能的通信,因此会动态的计算这个最大的超时时间。
*Linux中,超时以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。
*如果重发一次之后,仍然得不到应答,等待2*500ms后再进行重传。
*如果仍然得不到应答,等待4*500ms进行重传,以此类推,以指数形式递增
*累积到一定的重传次数,TCP认为网络或者对端主机出现异常,强制关闭连接。

连接管理

TCP是面向连接的协议,运输连接有三个阶段:简历连接、数据通信、连接释放。**连接管理的目标就是使连接的建立和释放都能够正常的进行。**TCP连接的建立是采用C/S模式,主动发起连接请求的客户端,而被动等待连接的是服务器。
完成三次握手后,客户端与服务器开始传送数据。三次握手可以完成两个重要功能:它确保连接双方做好传输准备,并使双方统一了初识顺序号,两台机器仅仅使用三个握手报文就能协商好各自的数据流的顺序号

流量控制

接收端处理数据的速度是有限的,如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送没救会造成丢包,进而引起丢包重传等等一系列问题。
因此TCP支持根据接收端的处理能力,来决定发送端的发送速度。这个机制叫做流量控制

*接收端将自己可以接受的缓冲区大小放入TCP首部中的“窗口大小”字段,通过ACK端通知发送端;
*窗口大小字段越大,说明网络的吞吐量越高;
*接收端一旦发现自己的缓冲区快慢了,就会将窗口大小设置成一个更小的值通知给发送端;
*发送端接收到这个窗口之后,就会减缓自己的发送速度;
*如果接收端缓冲区满了,就会将窗口置为0;这时发送方不在发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端。

这里写图片描述

在TCP首部中,有一个十六位窗口字段,就是存放了窗口大小信息,16为数字最大表示65535,那么TCP窗口最大就是65535吗?
其实在TCP首部40字节选项中还包含了一个窗口扩大M,实际窗口大小就是窗口字段的值左移M位,左移一位,扩大两倍;

拥塞控制

虽然TCP有了滑动窗口,能够高效可靠地发送大量数据,但是如果咋子刚开始阶段就发送大量的数据,仍然可能引发问题。
TCP引入慢启动机制,先发少量的数据,探探路,摸清楚当前的网络拥堵状态,再决定按照多大的速度传输数据;
此处引入一个概念为拥塞窗口,发送开始的时候,定义拥塞窗口为1;每次收到一个ACK应答,拥塞窗口+1;每次发送数据包的时候,将拥塞窗口和接收端主机反馈做比较,取较小的值作为实际大宋窗口

像上面这样的拥塞窗口的增长速度是指数级别的,慢启动只是指初始时满,但是增长速度非常快。

为了不增长的那么快,因此不能使拥塞窗口单纯的加倍,此处引入一个叫做慢启动的阈值,当拥塞窗口超过这个阈值的时候,不在按照指数方式增长,而是线性方式增长
这里写图片描述
当TCP开始启动的时候,慢启动的阈值等于窗口最大值,在每次超时重发的时候,慢启动的阈值会变成原来的一半,同时拥塞窗口置回1;

少量的丢包,我们仅仅是触发超时重传,大量的丢包,我们就认为是网络拥塞;
当TCP通信开始后,网络吞吐量会逐渐上升;
随着网络发生拥堵,吞吐量会立刻下降;
拥塞控制,归根结底是TCP协议想尽可能快的把数据传输给对方,当时又要避免给网络造成他打压力的这种方案

猜你喜欢

转载自blog.csdn.net/mignatian/article/details/80777361