TCP 如何保证可靠性与实现高效性传输

1. 概念

tcp 是一种面向连接的、可靠的服务。

2. tcp 如何实现可靠性服务

2.1 检验和
2.2 序列号
2.3 确认应答

确认应答就是回复 ack 应答。每当一个主机向另一个已建立连接的主机发送 tcp 报文时,响应主机就会回复一个 ack 应答,告诉发送 tcp 报文的主机下一个该发送的报文的序列号。

2.4 超时重传

主机 A 每开始给 主机 B 发送一个 tcp 报文,tcp 便为其保留一个副本,并启动一个定时器,开始计时,等待应答方回复 ack 应答,若在定时器超时前数据未能被确认,tcp 就认为报文段中的数据报已丢失或损坏,开始重新发送异常报文段。

2.5 流量控制
2.5.1 什么是冲突

冲突:发送主机发送过快,接受主机来不及接收。

2.5.2 接收缓冲区

在 tcp 连接中,接收端留有一个接收缓冲区,发送主机根据这个接收端的缓冲区大小调节发送速率。如果发送主机发送过快,会导致接收端的缓冲区打满,这时候如果发送端继续发送,就会导致丢包。

2.5.3 冲突解决

接收端在确认应答时,每次将现在的接收端缓冲区的大小放到 tcp 首部中的【窗口大小】字段,通过 ack 应答通知发送端。

接收端一旦发现自己的缓冲区满了,就会将接收窗口大小设置为一个更小的值通知给发送端,发送端接收到这个窗口大小时,就会减慢自己的发送速度。

这时就会出现一种情况,如果接收端窗口变为 0 了,发送端不再发送数据,待冲突缓解后,发送端是如何知道什么时候开始发送数据呢?

其实发送端有一个定时器,当发送发收到接收窗口为 0 的信息时,就停止发送报文,并且开启一个定时器,每隔一段时间就发送一个探测报文去询问对方是否可以发送数据,如果可以,接收方就告诉它接收窗口的大小,否则发送方就再次刷新定时器。

2.6 拥塞控制
2.6.1 tcp 慢启动

tcp 引入了慢启动,先发送少量的数据摸清楚当前的网络拥堵状况,再决定按照多大的速度传达。

2.6.2 慢启动过程

发送开始时,先将拥塞窗口的大小设为 1,每次收到一个 ack 应答时,拥塞窗口加一,每次发送数据时,将拥塞窗口与接收端的反馈的窗口大小作比较,取其中较小值作为发送窗口大小。

2.6.3 慢启动算法

刚开始时候,发送方设置拥塞窗口为 1,发送报文段,收到接收方的 ack 后,拥塞窗口变为 2,接着继续发送,每一次成功接收到 ack 应答,拥塞窗口大小就增加,其呈指数形式增长。但为了防止拥塞窗口增长过快导致网络阻塞,需要设置一个慢启动门限,类似于一个阈值,用来调节拥塞窗口的大小。

  • 当拥塞窗口 < 慢启动门限时,拥塞窗口大小指数增加
  • 当拥塞窗口 > 慢启动门限时,拥塞窗口大小加法增大,线性增长
  • 当拥塞窗口增长到网络拥塞时,拥塞窗口大小变为 1,同时慢启动门限会变为原来的一半

3. tcp 如何提高性能

3.1 滑动窗口

主机 A 与 主机 B 建立 tcp 连接,发送主机 A 可以在没有收到 接受主机回复的 ack 的情况下,也可以连续的把发送窗口的数据发送出去,但是已经发送过的数据在还没有收到接收方回复的确认之前,还需要暂时保留,以便超时重传使用,采用滑动窗口可以提高传输效率。

3.1.1 1比特滑动窗口协议(发送窗口 = 1,接收窗口 = 1)

相当于停等协议

3.1.2 回退 N 帧协议(发送窗口 > 1,接收窗口 > 1)

发送方在发完一个数据帧后,不停下来等待应答,而是连续发送若干个帧,且发送访在每发送完一个数据帧时都要设定超时定时器,如果未在规定时间内接收到接收方返回的 ack 应答,就进行超时重传,将发送出错帧及其后的 N 帧。

3.1.3 选择重传协议(发送窗口 > 1,接收窗口 > 1)

在选择重传过程中,只发送出错的那一帧。

3.2 快重传
3.3 延迟应答
3.4 捎带应答
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章