Sockets 读时TCP缓冲

Sockets 读时TCP缓冲,sockets,tcp,Sockets,Tcp,我想减少TCP服务器的延迟。所以我读到了,并使用了TCP_NODELAY。伟大的总体延迟下降了一点!现在我在想,我可能还可以减少阅读时的延迟。但是我不太了解TCP堆栈的行为。例如,如果发送方发送的数据包只有25个字节,那么在接收方的以下代码中会发生什么 BUFFER_SIZE = 4096 char buffer[BUFFER_SIZE]; received = read (common_socket, buffer, BUFFER_SIZE); 我的特别问题是,如果套接字阻塞,那么read调

我想减少TCP服务器的延迟。所以我读到了,并使用了TCP_NODELAY。伟大的总体延迟下降了一点!现在我在想,我可能还可以减少阅读时的延迟。但是我不太了解TCP堆栈的行为。例如,如果发送方发送的数据包只有25个字节,那么在接收方的以下代码中会发生什么

BUFFER_SIZE = 4096
char buffer[BUFFER_SIZE];
received = read (common_socket, buffer, BUFFER_SIZE);

我的特别问题是,如果套接字阻塞,那么read调用何时返回?TCP是否会在读取调用返回之前等待更多数据到达?

读取是一个阻塞调用,这意味着它将在读取行阻塞,直到您收到某个数据

如果接收的字节数小于缓冲区大小,则将移动到下一个操作,“received”变量将保存已读取的字节数

参考:

成功时,返回读取的字节数(零表示结束) ,文件位置将按此数字前进。它是 如果此数字小于字节数,则不是错误 请求;例如,这可能是因为需要的字节更少 实际上现在可用(可能是因为我们快结束了)- 文件,或因为我们正在从管道或终端读取),或 因为read()被一个信号中断了。错误时,-1为 返回,并正确设置了errno。在这种情况下,它是左 未指定文件位置(如果有)是否更改

如果套接字阻塞,何时返回read调用

如果套接字接收缓冲区中有数据或流的挂起结束或错误,它将立即返回,否则它将阻塞一次,直到出现其中一种情况

TCP是否会在读取调用返回之前等待更多数据到达


没有。

谢谢。我担心TCP可能具有的任何缓冲技巧。请检查我的编辑。实际上,如果您没有设置Nagle的TCP_节点延迟,那么对2的回答是肯定的。即使设置了此位,操作系统tcp堆栈实现也可以在调用其他数据之前自由等待。我肯定看到过发生这种情况的案例。如果你真的想加快速度,你需要在用户空间里用专用网卡做任何事情,比如SolarFlare网卡。@dau_sama现在我很困惑!!阅读tcp的工作原理,它不仅仅是Nagle算法,而且是一个相当复杂的协议。出于您的目的,除非您需要非常低的延迟,否则您所拥有的应该足够了。如果你想达到纳秒级的性能,那就另当别论了。