TCP上的校验和

4

TCP并不负责通过在传输过程中进行必要的操作(例如重传)来确保流完整地发送到目标地址,这是正确的吗?

TCP在这方面表现良好吗?

为什么更高级别的应用层协议及其应用程序仍需要执行校验和?


@cnicutar,此刻正在狠狠地咬我的是 FreeBSD 上的 fetch(类似于 wget 的工具),它正在通过移动互联网连接下载一个 60 MB 的文件。 - Cetin Sert
1
称呼我为无知,但我不知道有任何执行校验和的应用层协议。你能具体提到你所考虑的应用层协议吗? - Robᵩ
@Robᵩ 您是正确的。我的表述可能不太清晰。校验和是由使用诸如http、ftp等协议下载大文件的应用程序或操作系统的软件包管理器执行的。因此,它发生在这些协议的周围,而不是作为这些协议的组成部分。虽然我不确定当我们考虑BitTorrent和类似的点对点数据传输协议时是否可以安全地这样说;这种不确定性导致了我的模糊表述。 - Cetin Sert
2个回答

5
虽然TCP包含自己的校验和,但它只是一个16位的校验和,因此多位传输误差有可能会绕过TCP的校验机制。虽然这种情况相当少见,但仍然有可能发生,我事实上曾经在几十年中看到过这种情况发生过(一两次)。
一个强大的协议将要使用更高级别的哈希函数来保证传输数据的完整性。话虽如此,很少有传输少量数据的应用程序会费这个劲。大量数据传输应用程序(例如包管理器或自动更新机制)通常会使用加密哈希函数来增加数据完整性的保证。

现在正在发生这种情况,让我感到十分苦恼 :) 我快要放弃了,等到下午我的主要互联网连接重新恢复之前再进行吧。 - Cetin Sert
3
如果您反复遇到相同的问题,那么这很可能不是 TCP 传输错误。那种多比特传输错误是不可重复的。 - Greg Hewgill
在FreeBSD上(尽管是在VirtualBox中),fetch的表现并不一致(在我的情况下也是如此)。也许是因为我不够了解如何正确地“操作”fetch,它会在校验和错误时重新启动下载。 - Cetin Sert

1
TCP 确保可靠地传递 TCP 数据包,使用校验和来捕获在传输过程中引入的错误,并在需要时重新传输丢失或损坏的数据包。当数据包被传输时,它会保留在重传队列中,直到对等主机确认接收;如果在一定的超时期限内未收到确认,则会重新传输该数据包。但是,主机不会永远地保持重传数据包 - 如果数据包反复失败,则 TCP 最终会放弃并关闭连接。
更高级别的协议假定 TCP 可靠工作(这是一个公正的假设),并使用其自己的校验和或其他方法来检查更高级别的数据流是否安全到达。我曾经编写过很多有缺陷的套接字应用程序,破坏了它们自己的高级别缓冲区并损坏了应用程序数据流!
在任何具有健壮应用程序的生产级 TCP/IP 栈中,我认为您可以相信问题出在您的连接正在断开。或者您可能有一个有缺陷的应用程序,但我怀疑您的 fetch/wget 是否有缺陷。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接