丢失的TCP数据包在哪里?

时间:2013-01-29 12:14:37

标签: linux sockets tcp

我观察到一个令人惊讶的事情,当基于udp和基于tcp的应用程序都发送数据包时,如果基于upd的应用程序发送数据包的速度太快以至于带宽几乎都填充了udp数据包,则tcp数据包会很难发出。

令人惊讶的是,尽管基于tcp的应用程序能够发送一些数据包(通过write()的返回值观察),但tcp数据包的接收器永远不会接收它们。为什么?那是因为tcp-packet最终没有被网卡发出?或路由器实际丢弃了tcp数据包?

谢谢, 史蒂夫

2 个答案:

答案 0 :(得分:1)

首先,write()的返回值不是数据包是否被发送的指示。它只是表明数据是缓冲的。

其次,如果使用UDP数据包使网络饱和,将会有大量数据包丢失,而自适应TCP将通过更慢地发送数据包来适应这种情况。如果数据包丢失太高,TCP基本上可以完全停止。解决方案不是使用UDP数据包使网络饱和。

答案 1 :(得分:0)

这是一个简化的答案。您可以阅读很多文章。

UDP是基于IP构建的层。同样适用于TCP。网卡只发送IP数据包。您可以查找这些数据包的各种结构。

TCP是一种使用IP数据包的协议,但使用一种机制来尝试确保传送并以正确的顺序重新排列数据包。请参阅维基百科上的文章。

路由器可以自由丢弃数据包。当网络过载,网络连接断开或IP数据包损坏时,可能会发生这种情况。

所以为了回答你的问题,UDP或IP之间没有偏好从一端传输到另一端。