gpt4 book ai didi

c - Ubuntu Socket编程: Packets are repackaged between TX and RX

转载 作者:行者123 更新时间:2023-11-30 18:51:35 26 4
gpt4 key购买 nike

我有 2 台 Ubuntu 14.04 电脑。一台用作服务器,另一台用作客户端。客户端与服务器建立 TCP 连接,服务器发回一些数据包。这是服务器上的代码:

发送(sd、pkt、pkt_len、MSG_NOSIGNAL);

客户端的代码也很简单:

读取(sd, buf, buf_size);

如果服务器上的传输有间隔,我没有发现任何问题。然而,如果服务器正在进行快速传输,那么事情看起来就会很丑陋。下面是服务器连续发送 8 个数据包的示例。

服务器代码显示这8个数据包的大小分别是:752(字节)、713、713、713、396、398、396、396

服务器上的tcpdump捕获4个TX数据包:752(字节)、1398、1398、929

客户端上的tcpdump捕获3个RX数据包:752(字节)、2796、929

客户端代码显示它只收到 2 个数据包,分别为 3548 字节和 929 字节。

所以你可以看到服务器发送的所有字节都被客户端接收了。然而,数据包在传输路径中的不同点进行组合。我猜这是由于 TSO、GSO、GRO 等造成的。但是,当数据包传递到接收应用程序时,这些优化不应该将数据包重新组装回正确的形式吗?

如何解决这个问题?

最佳答案

TCP 经过精心设计,不仅允许而且准确地实现您所看到的内容。它是一种字节流协议(protocol)。如果您想要消息,您必须自己通过叠加的应用程序协议(protocol)来实现它们。

关于c - Ubuntu Socket编程: Packets are repackaged between TX and RX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36511312/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com