2015-07-20 92 views
0

我想减少TCP服务器的延迟。所以我读了一下,并使用了TCP_NODELAY。大!整体延迟下降了一点!现在我在想,我可能也可以在阅读时减少延迟。但我不太了解TCP堆栈的行为。举例来说,在接收端的以下代码中,如果发送者只发送一个25字节的数据包,会发生什么?读取TCP缓冲

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

我特别的问题是,如果套接字被阻塞,当读取的调用将返回?是否有任何情况下,TCP会在读取通话返回之前等待更多的数据到达?

回答

1

如果套接字被阻塞,当读取的调用将返回?

如果有在插座数据接收缓冲器或未决结束流或误差会立即返回,否则它会阻止,一旦,直到这些条件之一出现。

有没有任何情况下TCP会稍微等待更多的数据到达从读通话返回之前到达?

+0

如果你没有设置Nagle的TCP_NODELAY,实际上对2的回答是YES。即使设置了这个位,操作系统tcp堆栈实现也可以在回调它之前自由地等待其他数据。我肯定看到发生这种情况的情况。如果你想真的加快速度,你需要用专用网卡(例如SolarFlare)来完成用户空间中的所有事情。 –

+0

@dau_sama现在我很困惑! – dsign

+0

阅读了tcp的工作原理,不仅仅是Nagle算法,它是一个相当复杂的协议。为了您的目的,除非您需要非常低的延迟,否则您拥有的应该足够了。如果你想达到纳秒性能,那是另一回事。 –

1

阅读是一个阻塞呼叫,这意味着它会阻止阅读线,直到你会收到一些东西。

如果您收到的缓冲区大小小于您的缓冲区大小,您将转到下一个操作,您的“收到”变量将保存已读取的字节数。

参考: http://man7.org/linux/man-pages/man2/read.2.html

成功时,字节读取返回的个数(零表示文件的结束 ),并且该文件的位置由该数目提前。如果这个数字小于请求的字节数 ,那么它是 不是错误的;这可能发生,例如因为现在实际可用的更少字节(可能是因为我们接近 文件的结尾,或者因为我们正在从管道或终端读取)或 ,因为read()是被信号中断。出错时,返回-1为 ,并且适当地设置errno。在这种情况下,未指定文件位置(如果有)是否更改为 。

+0

感谢。我很担心TCP可能有的缓冲技巧。请检查我的编辑。 – dsign