TCP 的特性:滑动窗口、流量控制
一、TCP 连接可靠性的依据
二、TCP 其他特性
延迟应答、捎带应答、粘包问题、保活机制、面向字节流
(四)滑动窗口
TCP 的可靠传输需要对每一个发送的数据段, 都要给一个 ACK 确认应答,收到 ACK 后再发送下一个数据段。
这样传输效率较低,尤其当数据往返时间较长时间。
因此有了滑动窗口的概念,批量传输数据(将多次的等待确认应答的时间重叠在一起),提高传送效率。
滑动窗口的工作原理如下图:
异常情况:
(1)数据包丢了:
当某一段报文段丢失之后, 发送端会一直收到 1001 这样的 ACK, 表示报文丢失;
如果发送端主机连续多次收到了同样一个 “1001” 这样的应答, 就会将对应的数据 1001 - 2000 重新发送;
这个时候接收端收到了 1001 之后, 再次返回的 ACK 就是 5001了(因为 2001 - 5000)接收端其实之前就已经收到了, 被放到了接收端操作系统内核的接收缓冲区中;
(2)数据包已经收到了,ACK 丢了
ACK 丢失并不会造成影响,如果 1001 ~ 2000 的 ACK 丢失了,但是收到了 2001 ~ 3000 的 ACK,则默认之前的数据包都已收到了。
(五)流量控制
接收端处理数据的速度是有限的。
如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送, 就会造成丢包, 继而引起丢包重传等一系列连锁反应。
因此 TCP 支持根据接收端的处理能力, 来决定发送端的发送速度。这个机制就叫做流量控制(Flow Control)。
(六)拥塞控制
虽然 TCP 通过滑动窗口能够高效可靠的发送大量数据,但是如果在刚开始就发送大量的数据, 可能因为网络问题出现丢包情况。
因为网络上有很多的计算机, 可能当前的网络状态就已经比较拥堵。在不清楚当前网络状态下, 贸然发送大量数据, 很有可能引起雪上加霜。
因此 TCP引入 慢启动 机制, 先发少量的数据, 摸清当前的网络拥堵状态, 再决定按照多大的速度传输数据。
每接收一个数据包,cmd(拥塞窗口) 都会加 1.
慢启动:
为了不增长的那么快, 因此不能使拥塞窗口单纯的加倍。此处引入一个叫做慢启动的阈值,当拥塞窗口超过这个阈值的时候,不再按照指数方式增长, 而是按照线性方式增长。
当TCP开始启动的时候,慢启动阈值等于窗口大值。
在每次超时重发的时候,慢启动阈值会变成原来的一半,同时拥塞窗口置回1。
少量的丢包, 我们仅仅是触发超时重传;
大量的丢包, 我们就认为网络拥塞;
当TCP通信开始后, 网络吞吐量会逐渐上升; 随着网络发生拥堵, 吞吐量会立刻下降。
拥塞控制, 是 TCP 协议尽可能快的把数据传输给对方, 但是又避免给网络造成太大压力的折中方案。