为什么一个socket读取比实际发送更多的数据?(Why do a socket reads mor

2019-10-18 15:44发布

我有一个客户端和服务器都用C语言编写,并在Linux上运行。 客户端请求的数据段,并发送类似的数据段发送到服务器。 下面是客户端和服务器之间的典型交互。

  1. 客户端告诉服务器来保存一些数据(即写入请求)。 该请求是由数据的4KB和元数据的一些额外的字节(2xunsigned长+ 1xint)的。 疗法服务器保存数据,而没有响应写请求。
  2. 从服务器的客户端请求数据(即读请求)。 该请求是由元数据的一些字节的(再次... 2xunsigned长+ 1xint)。 该服务器只用4KB数据段进行响应。

在服务器侧的迹线表明,它总是发送4KB的数据段。 然而,在客户端的跟踪显示一个不同的故事:不同大小的数据包。 如果在一个点上,客户端接收超过4KB其它大小的数据然后将下面的数据包加起来要么4KB或8KB。

为了说明故障模式这里有一些例子我在跟踪中看到:

  • 4KB,1200个字节,2896个字节,4KB。
  • 4KB,1448个字节,6744个字节,4KB。

我大概可以应对在用等待一个完整的4KB段要读取的应用程序级别的第一个场景(即1200B + 2896B),但我不知道如何对付对方。 但是,我宁愿避免整个问题完全与强制客户端/服务器接收各4KBs的全部数据段。

我已经尝试禁用Nagle算法( TCP_NODELAY ),并设置MTU大小为4KB。 但是,这些也都没有解决的问题。

Answer 1:

为什么一个socket读取比实际发送更多的数据?

事实并非如此。 它读取任何数据是可用的,同时有没有堵塞,如果有必要了。

你的问题是建立在错误的。 有一个在TCP协议规范或伯克利套接字API是一个读==一个写不能保证任何地方。 TCP是一个字节流的协议。 如果更多的数据到达比你期待并且有足够的空间,你提供给的recv()或read()方法的缓冲区,你会得到它。 如果你想消息边界是严格由你来实现它们。



文章来源: Why do a socket reads more data than what is actually sent?