TCP可靠传输和性能保障

本文深入解析TCP协议的可靠传输机制,包括确认应答、超时重传、序号/确认序号确保数据有序传输,以及流量控制、滑动窗口、拥塞控制等性能提升机制。

TCP如何保证可靠传输

1、确认应答机制

发送的每条数据都需要确认回复一下:收到1号报文,ACK2表示:已经收到1号报文,希望下一次接受2号报文。
在这里插入图片描述

2、超时重传机制

发送方等待一段时间后还没有收到回复,就认为传输失败了,将数据重传。
Linux中(BSD Unix和Windows也是如此), 超时以500ms为⼀个单位进行控制, 每次判定超时重发的超时时间都是500ms的整数倍.累计到⼀定的重传次数, TCP认为网络或者对端主机出现异常, 强制关闭连接.

3、序号/确认序号------保证数据有序传输

TCP提升性能机制

tcp因为要保证可靠传输,因此性能有很大的消耗,为了提高tcp传输性能,有需要有其他的一些机制。

1、流量控制

通过不断设定窗口大小来告诉对方我的接受缓冲区的大小,最终达到流量控制的效果,避免因为发送太快,而处理太慢,导致接收方缓冲区塞满引起的大量的数据包重传。

接收端处理数据的速度是有限的. 如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送, 就会造成丢包, 继而引起丢包重传等等一系列连锁反应.
因此TCP支持根据接收端的处理能力, 来决定发送端的发送速度. 这个机制就叫做流量控制(Flow Control);
在这里插入图片描述
接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 “窗口大小” 字段, 通过ACK端通知发送端;窗口大小字段越大, 说明网络的吞吐量越高;
接收端⼀旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给发送端;发送端接受到这个窗口之后, 就会减慢自己的发送速度;
如果接收端缓冲区满了, 就会将窗口置为0; 这时发送方不再发送数据, 但是需要定期发送一个窗口探测数据段, 使接收端把窗口大小告诉发送端。

TCP报头窗口大小字段是16位,那么是否意味着,TCP的窗口大小最大是65535字节呢?
实际上TCP报头的40字节选项中还有窗口扩大因子M,实际窗口大小是窗口字段的值左移 M 位;

2、滑动窗口

刚才我们讨论了确认应答策略, 对每⼀个发送的数据段, 都要给⼀个ACK确认应答. 收到ACK后再发送下⼀个数据段. 这样做有⼀个比较大的缺点, 就是性能较差。尤其是数据往返的时间较长的时候。

既然这样⼀发⼀收的方式性能较低, 那么我们⼀次发送多条数据, 就可以大大的提高性能(其实是将多个段的等待时间重叠在一起了).在这里插入图片描述
窗口大小指的是无需等待确认应答而可以继续发送数据的最大值. 上图的窗口大小就是4000个字节(四个段).
发送前四个段的时候, 不需要等待任何ACK, 直接发送;
收到第一个ACK后, 滑动窗口向后移动, 继续发送第五个段的数据; 依次类推;
操作系统内核为了维护这个滑动窗口, 需要开辟发送缓冲区来记录当前还有哪些数据没有应答; 只有确认应答过的数据, 才能从缓冲区删掉;
窗口越大, 则网络的吞吐率就越高;
在这里插入图片描述
如果发生丢包现象应该怎么重传呢?

  1. ACK丢失,没有关系。假如ACK2001丢失,因为接收端按序号接受,所以当主机A收到ACK3001,主机A认为3000号之前的数据都已经成功发送。
  2. 丢失的是数据包
    在这里插入图片描述
    快重传(选择重传):如上图所示,假如数据包 1001 1001 1001 ~ 2000 2000 2000丢失,那么接收端在收到任何不是1001开头的数据包,它都会回复ACK1001,而发送端主机A在收到三次ACK1001之后,认为1001数据包丢失,重传1001数据包。而对于 2001 2001 2001 ~ 7000 7000 7000之间的数据包会存储在接收端的接收缓冲区
    快重传要求接收端的接受缓冲区有足够大的空间,这种机制被称为“高速重发控制”(快重传)。

3、拥塞控制

开始传输数据时候,接收端的接受缓冲区很大,因此接受窗口比较大,发送方一次发送的数据比较多。但是不确定网络状况是否良好,发送方不能贸然发送大量数据。

因此,TCP采取慢启动策略。先发送很少量的数据去探测网络状况,根据网络状况调整发送窗口大小。
在这里插入图片描述
发送开始的时候, 定义拥塞窗口大小为1; 每次收到⼀个ACK应答, 拥塞窗口加1;
每次发送数据包的时候, 将拥塞窗口和接收端主机反馈的窗口大小做比较, 取较小的值作为实际发送的窗口。

拥塞窗口机制的窗口增长是呈指数增长的,为了控制窗口增长,还有一个增长的阈值。当TCP开始启动的时候, 慢启动阈值等于窗口最大值(拥塞窗口和接收端报头字段的窗口大小);
在这里插入图片描述
当拥塞窗口超过这个阈值的时候, 不再按照指数方式增长, 而是按照线性方式增长。
在每次超时重发的时候, 慢启动阈值会变成原来的一半, 同时拥塞窗口置回1。

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

TCP拥塞控制这样的过程, 就好像热恋的感觉。慢启动,快增长,一旦丢包,回到1。

4、延时应答机制

假如接收端接受缓冲区有1M的剩余空间,当它收到发送端500K的数据之后,如果立即返回ACK,窗口大小为500K。实际上,数据的处理速度很快,500K的数据在10ms内就能处理完成。

接收端给发送端的回复报文中窗口越大, 网络吞吐量就越大, 传输效率就越高. 我们的目标是在保证网络不拥塞的情况下尽量提高传输效率。

接收端接受到数据是否延时再应答,是有限制的。
数量限制: 每隔N个包就应答⼀次;
时间限制: 超过最大延迟时间就应答⼀次;
具体的数量和超时时间, 依操作系统不同也有差异; ⼀般N取2, 超时时间取200ms;

5、捎带应答机制

将确认应答直接标记在即将发送的数据包内,那么这样不仅传输了数据,还对上一次接受的数据进行应答(少传输一个应答包)
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值