TCP如何保证可靠传输
前置知识
TCP 和 UDP
TCP 和 UDP 的特点
用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和 多对多
的交互通信。
传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的( 一对一
)。
TCP 相比 UDP 最重要的特点: 保证可靠传输
# 一、 TCP 协议如何保证可靠传输
先列出 TCP 协议保证可靠传输的手段:
- TCP 协议保证可靠传输的手段:应用数据被分割成 TCP 认为最适合发送的数据块。TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。 校验和:TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化(确认过程)。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段(重传过程)。TCP 的接收端会丢弃重复的数据。
- ARQ 协议:它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
- 流量控制:TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
- 拥塞控制:当网络拥塞时,减少数据的发送。
- 超时重传:当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
# 1.1 ARQ 协议
自动重传请求(Automatic Repeat-reQuest,ARQ): 它通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认帧,它通常会重新发送。
ARQ 协议使用两种方式来保证可靠性:
- stop & wait 停止等待 ARQ 协议
它的基本原理就是每发完一个分组就停止发送,等待对方确认(回复 ACK)。
如果过了一段时间(超时时间后),还是没有收到 ACK 确认,说明没有发送成功,需要重新发送,直到收到确认后再发下一个分组;
在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认;
- Automatic 连续 ARQ 协议
连续 ARQ 协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。
# 1.2 流量控制
和上节连续 ARQ 协议的滑动窗口概念对应:
我们只需要控制窗口大小即可控制流量.
TCP 的滑动窗口是动态的,我们可以想象成小学常见的一个数学题,一个水池,体积 V,每小时进水量 V1,出水量 V2。当水池满了就不允许再注入了,如果有个液压系统控制水池大小,那么就可以控制水的注入速率和量。这样的水池就类似 TCP 的窗口。应用根据自身的处理能力变化,通过本端 TCP 接收窗口大小控制来对对对端的发送窗口流量限制。
应用程序在需要(如内存不足)时,通过 API 通知 TCP 协议栈缩小 TCP 的接收窗口。然后 TCP 协议栈在下个段发送时包含新的窗口大小通知给对端,对端按通知的窗口来改变发送窗口,以此达到减缓发送速率的目的。
# 二、总结
- 最基本的传输可靠性来源于“确认、重传”机制。
- TCP 的滑动窗口的可靠性也是建立在“确认、重传”基础上的。
- 发送窗口只有收到对端对于本段发送窗口内字节的 ACK 确认,才会移动发送窗口的左边界。
- 接收窗口只有在前面所有的段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不对后续字节确认。以此确保对端会对这些数据重传。