我观察到一个令人惊讶的事情,当基于 udp 和基于 tcp 的应用程序都在发送数据包时,如果基于 upd 的应用程序发送数据包的速度如此之快,以至于带宽几乎被 udp 数据包填满,那么 tcp 数据包将非常困难发送出去。
令人惊讶的是,尽管基于 tcp 的应用程序能够发送一些数据包(通过 write() 的返回值观察),但 tcp 数据包的接收者从未收到它们。为什么?那是因为tcp-packets最终不是由网卡发出的吗?还是路由器实际上丢弃了 tcp 数据包?
谢谢,史蒂夫
首先,write() 的返回值并不是数据包是否发送的指标。它只是表示数据已被缓冲。
其次,如果你用 UDP 数据包使网络饱和,将会有很多数据包丢失,而自适应 TCP 将通过更慢地发送数据包来适应这种情况。如果丢包率太高,TCP基本上可以完全停止。解决方案是不要用 UDP 数据包使网络饱和。
这是一个简化的答案。您可以阅读许多文章。
UDP是建立在IP之上的一层。TCP 同上。网卡只是发送IP数据包。您可以查找这些数据包的各种结构。
TCP 是一种使用 IP 数据包的协议,但使用一种机制来尝试确保以正确的顺序传送和重新排列数据包。请参阅维基百科上的文章。
路由器可以随意丢弃数据包。当网络过载、网络连接中断或 IP 数据包损坏时,可能会发生这种情况。
因此,要回答您的问题,他们在从一端传输到另一端的 UDP 或 IP 之间没有偏好。