我知道TCP使用验证来确保发送到服务器的数据的准确性。我的问题是它是一次性验证所有内容还是在内容到达时进行验证?
快速示例:
假设我在这里加载超级用户页面。为了简单起见,它可以放在 5 个数据包中(几乎不可能装下任何现代网页中如此少量的数据。):
一次全部:
*客户:[请求数据放在这里]**
服务器:[数据包 1]
服务器:[数据包 2]
服务器:[数据包 3]
服务器:[数据包 4]
服务器:[数据包 5]
客户端:[数据包 1]
客户端:[数据包 2]
客户端:[数据包 3]
客户端:[数据包4]
客户端:[数据包5]
一点一点地(抱歉,我无法抗拒这个双关语!):
*客户:[请求数据放在这里]**
服务器:[数据包 1]
客户端:[数据包 1]
服务器:[数据包 2]
客户端:[数据包 2]
服务器:[数据包 3]
客户端:[数据包 3]
服务器:[数据包 4]
客户端:[数据包4]
服务器:[数据包 5]
客户端:[数据包5]
答案1
来自 Tanenbaum 的计算机网络 - 第 5 版:
TCP 实体使用的基本协议是具有动态窗口大小的滑动窗口协议。发送方在传输一个段时,还会启动一个计时器。当该段到达目的地时,接收方 TCP 实体会发回一个段(如果存在数据,则包含数据,否则不包含数据)带有一个确认号,该确认号等于它期望收到的下一个序列号以及剩余的窗口大小。如果在收到确认之前发送方的计时器已关闭,则发送方将再次传输该段。
粗体字明确表示第二种情况,即数据包以正确的顺序发送并接收确认。不是发送大量数据包并等待其确认的情况。
答案2
TCP 使用每个数据包中的序列号来验证是否已收到所有发送的数据且顺序正确。每个数据包都会添加校验和,以检查数据包中是否存在损坏。
维基百科上的 TCP 文章更详细地描述可靠传输。