大家都知道传输层中的 TCP 和 UDP 这两个协议(《不得不知的 TCP 和 UDP》),也经常听说 TCP 是可靠传输,UDP 是不可靠传输,然而,并不一定所有的人都了解 TCP 协议是如何保证可靠传输的。
说到TCP 传输的可靠性,首先,我们要理解可靠是指什么。
举个例子,我们要发一件快递,肯定会根据可靠性来选择一家靠谱的快递公司,但是,我们选择了靠谱的快递公司就可以保证快递完好无损的到达目的地吗?这显然是无法 100%保证的,比如包裹在运输途中破损了,比如收件人搬家换了手机号,再比如快递小哥跟小三私奔了,这些不可抗力都会导致包裹无法完好的到达目的地,但是靠谱的快递公司会将快递过程中,包裹的情况及时的通知发件方,出现问题时也可以采取合理的方式解决,对发件方负责,这样,即使在特殊情况下,包裹无法被正常投递,我们还是会认为这家快递公司是可靠的。
其实网络传输也是如此,当我们选择了TCP这家快递公司后,TCP会尽最大的可能将包裹(数据包)发送到目的主机。但 TCP 再「可靠」也无法解决路由器故障或者终端掉电等异常情况的发生。由于这些不可抗力造成的数据发送失败,TCP 还是会尽责的将失败信息反馈给发送方。所以我们说 TCP 协议也是可靠的。
现在大家应该明白了 TCP 协议中可靠的含义。下面我们来看看 TCP 是用哪些手段来保证可靠。
顺序编号
一个大文件在网络上用 TCP 传输的时候,会被拆分成多个 TCP 数据包发送到网络,一个装满数据的 TCP 数据包的大小通常在 1K 左右,那么一个 1M 的文件就会被分成 1024 个数据包发送到网络,TCP 协议为了方便对数据包进行管理,会对每个数据包进行顺序编号,这是 TCP 能供可靠传输的基础。
确认机制(ACK)
当数据包成功传输到接收方时,接收方会遵循 TCP 协议向发送方反馈一个成功接收的信号(ACK),这个信号会带上当前包的序号,这样发送方就可以明确的知道包裹被正常投递了。
超时重传
发送方每发送一个数据包,都会为这个数据包做一个定时器,当定时器归零时,发送方仍然没有接收到接收方的 ACK,那么就会对这个数据包进行重传,直至接收到数据包的ACK,或者连接被断开。通过上述策略,TCP 供了一套不成功便成仁的数据发送方式来保证可靠传输,而 UDP 协议由于没有确认和超时重传机制,发出去的数据包都象是断了线的风筝,永远不知道对方是否成功接收了。