我有一个客户端和服务器都用C语言编写,并在Linux上运行。 客户端请求的数据段,并发送类似的数据段发送到服务器。 下面是客户端和服务器之间的典型交互。
- 客户端告诉服务器来保存一些数据(即写入请求)。 该请求是由数据的4KB和元数据的一些额外的字节(2xunsigned长+ 1xint)的。 疗法服务器保存数据,而没有响应写请求。
- 从服务器的客户端请求数据(即读请求)。 该请求是由元数据的一些字节的(再次... 2xunsigned长+ 1xint)。 该服务器只用4KB数据段进行响应。
在服务器侧的迹线表明,它总是发送4KB的数据段。 然而,在客户端的跟踪显示一个不同的故事:不同大小的数据包。 如果在一个点上,客户端接收超过4KB其它大小的数据然后将下面的数据包加起来要么4KB或8KB。
为了说明故障模式这里有一些例子我在跟踪中看到:
- 4KB,1200个字节,2896个字节,4KB。
- 4KB,1448个字节,6744个字节,4KB。
我大概可以应对在用等待一个完整的4KB段要读取的应用程序级别的第一个场景(即1200B + 2896B),但我不知道如何对付对方。 但是,我宁愿避免整个问题完全与强制客户端/服务器接收各4KBs的全部数据段。
我已经尝试禁用Nagle算法( TCP_NODELAY
),并设置MTU大小为4KB。 但是,这些也都没有解决的问题。