TCP的可靠传输原理

理想的传输条件有以下两个特点:
1.传输信道不产生差错。
2.不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据。

在这样的理想传输条件下,不需要采取任何措施就能够实现可靠传输。
然而实际的网络都不具备以上两个理想条件。必须使用一些可靠传输协议,在不可靠的传输信道实现可靠传输。

停止等待协议

1.停止等待。发送方每次只发送一个分组。在收到确认后再发送下一个分组。
2.编号。对发送的每个分组和确认都进行编号。
3.自动重传请求ARQ (Automatic Repeat reQuest)。发送方为每个发送的分组设置一个超时计时器。若超时计时器超时,发送方会自动重传分组。

TCP 会在以下两种情况发生超时重传:
数据包丢失
确认应答丢失

TCP的可靠传输原理
停止等待协议的优点是简单,缺点是信道利用率太低。

连续ARQ协议

1.发送方一次可以发出多个分组。
2.滑动窗口协议
3.累积确认
即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了。
TCP的可靠传输原理

TCP的可靠传输原理
优点:容易实现,即使确认丢失也不必重传。
缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。

流量控制

发送方不能无脑的发数据给接收方,要考虑接收方处理能力。

如果一直无脑的发数据给对方,但对方处理不过来,那么就会导致触发重发机制,从而导致网络流量的无端的浪费。

流量控制 (flow control) 就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。
利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制。

TCP的可靠传输原理
可能发生死锁。
接收方处理完数据后,会向发送方通告一个窗口非 0 的 ACK 报文,如果这个通告窗口的 ACK 报文在网络中丢失了,发送方一直等待收到接收方发送的非零窗口的通知,而接收方也一直等待发送方发送的数据。
如果没有其他措施,这种互相等待的死锁局面将一直延续下去。
为了解决这个问题,TCP 为每一个连接设有一个持续计时器

只要 TCP 连接的一方收到对方的零窗口通知,就启动该持续计时器。
若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带 1 字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。
若窗口仍然是零,则收到这个报文段的一方就重新设置持续计时器。
若窗口不是零,则死锁的僵局就可以打破了。

糊涂窗口综合症
每次仅发送一个字节或很少几个字节的数据时,有效数据传输效率变得很低的现象。

解决方法:使用Nagle算法
让接收方等待一段时间,使得或者接收缓存已有足够空间容纳一个最长的报文段,或者等到接收缓存已有一半空闲的空间。

拥塞控制

在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种现象称为拥塞 。
在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大。
最坏结果:系统崩溃。

拥塞窗口
TCP发送方维持一个拥塞窗口 cwnd
发送窗口大小不仅取决于接收方窗口,还取决于网络的拥塞状况
真正的发送窗口值 = Min (接收方窗口值,拥塞窗口值)

四种拥塞控制算法:
慢开始 (slow-start)
拥塞避免 (congestion avoidance)
快重传 (fast retransmit)
快恢复 (fast recovery)

慢开始
由小到大逐渐增大拥塞窗口数值。
当发送方每收到一个 ACK,就拥塞窗口 cwnd 的大小就会加 1。
cwnd大小:1->2->4->8

有一个叫慢开始门限 ssthresh
当 cwnd < ssthresh 时,使用慢开始算法。
当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。

拥塞避免
让拥塞窗口 cwnd 缓慢地增大,避免出现拥塞。
每经过一个传输轮次,拥塞窗口 cwnd = cwnd + 1。
cwnd大小:8->9->10···
“拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。
“拥塞避免”是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。

快重传
发送方只要一连收到三个重复确认,就知道接收方确实没有收到报文段,因而应当立即进行重传(即“快重传”),这样就不会出现超时,发送方也不就会误认为出现了网络拥塞。

快恢复
当发送端收到连续三个重复的确认时,由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,而是执行快恢复算法 FR 算法:
慢开始门限 ssthresh = 当前拥塞窗口 cwnd / 2 ;
新拥塞窗口 cwnd = 慢开始门限 ssthresh ;
开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。

TCP的可靠传输原理
0->1慢开始
1->2:拥塞避免
2->3:判定发生拥塞,慢开始门限调整为cwnd/2=12,再次慢开始
3->4:拥塞避免
4->5:快恢复

总结

一、传输中通常使用连续ARQ协议。
二、使用流量控制抑制发送端发送数据的速率,以使接收端来得及接收。
1.连续计时器解决死锁问题。
2.Nagle算法解决糊涂窗口综合症
三、使用拥塞控制防止过多的数据注入到网络中,使网络中的路由器或链路不致过载;
1.拥塞窗口
2.四种拥塞控制算法