当丢弃其中一个数据包时,TCP协议如何延迟数据包传输?

时间:2013-03-20 10:00:15

标签: sockets tcp

如果客户端套接字发送:

  1. 数据包A - 已丢弃
  2. Packet B
  3. Packet C
  4. 服务器套接字会接收并排队B和C然后当收到A时B和C会立即传递给服务器应用程序吗?或者B和C也会被重新发布?或者在A交付之前根本不会发送任何数据包?

2 个答案:

答案 0 :(得分:1)

TCP是一种复杂的协议,根据当前的网络状态更改许多参数,有关于该主题的全书。回答你问题的最明确的方法是说TCP通常维持一个给定的发送'窗口'大小,以字节为单位。这是在成功返回先前发送的确认之前将发送的数据量。

在较旧的TCP规范中,该窗口中丢弃的数据包将导致从丢弃的数据包开始完全重新发送数据。为了解决这个问题,因为它显然有点浪费,TCP现在采用了选择性确认(SACK)选项(RFC 2018)。这将导致重新发送丢失/损坏的数据包。

回到你的例子,假设窗口大小足以包含所有三个数据包,并提供你正在利用最新的TCP标准(不明白为什么你不会),如果数据包A只被丢弃包A将被重新发送。如果所有数据包都单独大于窗口,则必须按顺序发送和确认数据包。

答案 1 :(得分:0)

这取决于延迟。通常,重新发送第一个A.如果客户端获得它并且已经有B和C,它也可以确认它们。

如果这种情况发生得足够快,B和C将不会被重新发送,或者可能只是B。