TCP连接会丢失数据包吗?

时间:2014-05-24 06:16:56

标签: sockets tcp

假设服务器S与客户端C建立了成功的TCP连接。

C继续向S发送256字节长的数据包。

是否有可能其中一个数据包只接收部分数据包,但连接没有中断(可以继续正确接收新数据包)?

我认为TCP协议本身将保证在连接时不丢失任何字节。但似乎不是吗?

P.S。我正在使用Python的socketserver库。

2 个答案:

答案 0 :(得分:2)

TCP协议确保传递。因此(假设您的代码和TCP堆栈中没有错误),您描述的场景是不可能的。

请记住,TCP是流而不是面向数据包。这意味着您可能需要多次调用recv()来读取整个256字节的数据包。

答案 1 :(得分:0)

正如@NPE所说,TCP是一种面向流的协议,这意味着不能保证每个TCP数据包中发送了多少数据字节,也没有保证可以在接收套接字中读取多少字节。 TCP所确保的是,将按照接收字节的顺序将其发送给接收套接字。

考虑通过两个主机AB之间的TCP连接套接字进行通信。

例如,A中的应用程序请求发送256个字节时,A的TCP堆栈可以将它们发送为一个或几个单独的数据包,甚至可以在发送之前等待。因此,B可能会收到一个或几个具有A请求发送的全部或部分字节的数据包,因此,当B中的应用程序收到接收消息的可用性通知时个字节,因此不确定是否可以一次读取256个字节。

唯一可以保证的是,B读取的字节与A发送字节的顺序相同。