假设服务器S与客户端C建立了成功的TCP连接。
C继续向S发送256字节长的数据包。
是否有可能其中一个数据包只接收部分数据包,但连接没有中断(可以继续正确接收新数据包)?
我认为TCP协议本身将保证在连接时不丢失任何字节。但似乎不是吗?
P.S。我正在使用Python的socketserver库。
答案 0 :(得分:2)
TCP协议确保传递。因此(假设您的代码和TCP堆栈中没有错误),您描述的场景是不可能的。
请记住,TCP是流而不是面向数据包。这意味着您可能需要多次调用recv()
来读取整个256字节的数据包。
答案 1 :(得分:0)
正如@NPE所说,TCP是一种面向流的协议,这意味着不能保证每个TCP数据包中发送了多少数据字节,也没有保证可以在接收套接字中读取多少字节。 TCP所确保的是,将按照接收字节的顺序将其发送给接收套接字。
考虑通过两个主机A
和B
之间的TCP连接套接字进行通信。
例如,A
中的应用程序请求发送256个字节时,A
的TCP堆栈可以将它们发送为一个或几个单独的数据包,甚至可以在发送之前等待。因此,B
可能会收到一个或几个具有A
请求发送的全部或部分字节的数据包,因此,当B
中的应用程序收到接收消息的可用性通知时个字节,因此不确定是否可以一次读取256个字节。
唯一可以保证的是,B
读取的字节与A
发送字节的顺序相同。