【问题标题】:Will TCP connection lose packets?TCP连接会丢包吗?
【发布时间】:2014-07-13 13:27:57
【问题描述】:

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

C 一直在向 S 发送 256 字节长的数据包。

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

我认为 TCP 协议本身会保证在连接时不会丢失任何字节。但好像没有?

附:我正在使用 Python 的 socketserver 库。

【问题讨论】:

  • 上次听到有人抱怨TCP丢包,原来他们没有检查send/recv或write/read或close的返回值。
  • @ZanLynx 这也是发生在我身上的事情:P

标签: sockets tcp


【解决方案1】:

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

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

【讨论】:

  • 我认为一个数据包可能会丢失,可以通过 tcp 标头中的会话标志检查或相等,什么时候会通过网络重传?
  • @KristerAndersson 您将在接收或发送下一个字节时收到错误。你不会得到任何其他东西。具体来说,您不会得到乱序或有间隙的字节。
【解决方案2】:

正如@NPE 所说,TCP 是一个面向流的协议,这意味着无法保证每个 TCP 数据包中发送了多少数据字节,也无法保证接收套接字中有多少字节可用于读取。 TCP 确保的是接收套接字将以与发送数据字节相同的顺序提供数据字节。

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

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

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

【讨论】:

    猜你喜欢
    • 2010-10-21
    • 2011-07-23
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2018-03-09
    • 2021-12-07
    相关资源
    最近更新 更多