TCP是否不负责通过在传输过程中发生丢失等任何必要的事情来确保通过线路完整发送流?
它没有做好它的工作吗?
为什么更高的应用层协议及其应用程序仍然执行校验和?
TCP是否不负责通过在传输过程中发生丢失等任何必要的事情来确保通过线路完整发送流?
它没有做好它的工作吗?
为什么更高的应用层协议及其应用程序仍然执行校验和?
虽然 TCP 确实包含自己的校验和,但它只是一个 16 位校验和,而且 TCP 校验和机制肯定有可能漏掉多位传输错误。这是非常罕见的,但它仍然是可能的,事实上我已经看到它发生(几十年一两次)。
一个健壮的协议将希望使用更高级别的散列函数来确保传输数据的完整性。话虽如此,传输少量数据的应用程序并没有遇到这个麻烦。批量传输应用程序(例如包管理器或自动更新机制)通常会使用加密哈希函数来增加数据完整性的保证。
TCP 确保 TCP 数据包可靠地传递,使用校验和捕获传输过程中引入的错误,并根据需要重新传输丢失或损坏的数据包。当一个数据包被传输时,它被保留在一个重传队列中,直到对等主机确认接收;如果在某个超时期限内没有收到确认,则重新传输数据包。但是主机不会永远重新传输一个数据包——如果一个数据包反复失败,那么 TCP 最终会放弃并关闭连接。
更高级别的协议假设 TCP 工作可靠(一个公平的假设)并使用它们自己的校验和或其他任何东西来检查更高级别的数据流是否安全到达。我写了很多有问题的套接字应用程序,它们搞砸了他们自己的更高级别的缓冲区并破坏了应用程序数据流!
在任何具有强大应用程序的生产级 TCP/IP 堆栈中,我认为您可以确信问题在于您的连接中断。或者你可能有一个错误的应用程序,但我怀疑你的 fetch/wget 是错误的。