天天看点

分布式系统中不可靠的TCP

TCP协议为应用层提供了可靠的、面向连接传输服务。 TCP协议是最优秀的传输层协议之一,其设计初衷就是在不可靠的网络之上建立传输服务。 TCP协议通过为传输的每一个字节设置顺序递增的列号,由接收方在收到数据后按重组并发送确认信息,当发现数据包丢失时,TCP协议重传丢失的包,从而TCP协议解决了网络数据包丢失的问题和数据包乱序的问题。TCP协议为每个TCP数据段使用32位的检验从而检查数据错误问题。TCP协议通过设置接受和发送窗口的机制极大的提高了传输性能,解决了网络传输的时延与吞吐问题。TCP协议最为复杂而巧妙的是其几十年来不断改进的拥塞控制算法,使得TCP可以动态感知底层链路的带宽加以合理使用并与其它TCP链接分享带宽。

上述使得TCP协议成为一个在通常情况下非常可靠的协议,然而在分布式系统的协议设计中不能认为所有网络通信都基于TCP协议则通信就是可靠的。一方面,TCP保证了TCP协议栈之间的可靠传输,但无法保证两个上层应用之间的可靠通信。通常,当某个应用层程序通过TCP的系统调用发送一个网络消息时,即使TCP系统调用返回成功,也仅仅只能意味着该消息被本机的协议栈接受,一般这个消息是被放入了TCP协议栈的缓冲区中。在退一步讲,即使目的机器的TCP协议栈收到后续也正常收到了该消息,并发送了确认数据包,也仅仅意味消息到达了对方机器的协议栈,而不能认为消息被目标应用程序进程接受并正确处理了。当发送过程中出现宕机等异常时,TCP协议栈缓冲区中的消息有可能被丢失从而无法被目标节点正确处理。更有甚者,在网络中断前,某数据包已经被目标进程正确处理,之后网络立刻中断,由于接收方的TCP协议栈发送的确认数据包始终被丢失,发送方的TCP协议栈也有可能告知发送进程发送失败。另一个方面,TCP协议只能保证同一个TCP链接内的网络消息不乱序,TCP链接之间的网络消息顺序无法保证。但在分布式系统中,一个节点向另一个节点发送数据,有可能是先后使用多个TCP链接发送,也有可能是同事并发多个TCP链接发送,那么发送进程不能认为先调用TCP系统调用发送的消息就一定会先于后发送的消息到达对方节点并被处理。

继续阅读