【问题标题】:How reliable is a TCP connection?TCP 连接有多可靠?
【发布时间】:2013-12-05 15:36:38
【问题描述】:

我已经编写了服务器-客户端应用程序。服务器用c#编写,客户端代码使用java编写。通信协议是TCP。

使用 tcp 传输文件时,可能会发送丢失的数据。换句话说,tcp 是否保证数据正确到达。(我是否应该发送此文件的标头信息以检查错误,例如文件大小、哈希等)

【问题讨论】:

  • TCP 偶尔会出现错误。这就是为什么您有时会看到带有文件的校验和。
  • TCP 是reliable
  • Sriram 我知道 tcp 是可靠的包裹。我的意思是它正在检查错误、包裹丢失等。但我不确定订购包裹传输的可靠性。换句话说,假设你要发送一个大通过 tcp 文件。在向客户端传输文件时,一个包丢失,当然它会再次发送,原因是 tcp。但是在客户端你打开了一个流并将传入的数据写入文件,那么包发生了什么。它是不是它应该的顺序。背景发生了什么?如果我直接将传入流写入文件,是否正确写入?
  • @DavutÖzcan TCP 负责所有这些。它永远不会以错误的顺序发送字节。 TCP provides reliable, ordered, error-checked delivery of a stream of octets between programs running on computers connected to a local area network, intranet or the public Internet. It resides at the transport layer 来自维基
  • 感谢您的回复。

标签: c# java sockets networking tcp


【解决方案1】:

TCP 在协议中提供 16 位校验和。它可以检测到大部分错误。错误更可能发生在上层而不是 tcp/ip。如果您需要软件的高可靠性,可以考虑采用端到端策略。

有一篇经典文章谈到了这一点:“end to end arguments in system design”。

【讨论】:

    【解决方案2】:

    一个tcp传输os的包的顺序是可靠的。

    例如,您的 tcp 消息分为三个包 A、B 和 C。

    您的客户端收到 A,包 B 丢失,然后客户端收到 C。在流中,您将仅获得包 A,包 C 被存储,并且一旦包 B 被您的客户端重新传输并接收,您将在流中将获得包 B,然后是 C。

    如果包B通过另一种方式路由并因此在包C之后接收,则执行相同的操作。

    此机制需要 tcp 标头中的“序列号”字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 2011-11-27
      • 2010-12-06
      • 1970-01-01
      相关资源
      最近更新 更多