2010-11-23 45 views
21

您能否解释一下SO_SNDBUFSO_RECVBUF选项的具体含义?什么是SO_SNDBUF和SO_RECVBUF

好的,出于某种原因,操作系统缓冲了传出/接收数据,但我想澄清这个问题。

他们的作用(一般)是什么?

它们是每插座缓冲区吗?

传输层的缓冲区(例如TCP缓冲区)和这些缓冲区之间是否存在连接?

当使用流套接字(TCP)和使用无连接套接字(UDP)时,它们有不同的行为/角色吗?

好文章也会很棒。

我使用了它,但没有找到任何有用的信息。

回答

3

搜索谷歌为 “SO_RECVBUF MSDN” 给我......

http://msdn.microsoft.com/en-us/library/ms740476(VS.85).aspx

,回答你 “是他们每个插座” 从选项表中的这些行:

SO_RCVBUF int Specifies the total per-socket buffer space reserved for receives. 
SO_SNDBUF int Specifies the total per-socket buffer space reserved for sends. 

随着稍后更详细地描述:

SO_RCVBUF and SO_SNDBUF 
When a Windows Sockets implementation supports the SO_RCVBUF and SO_SNDBUF options, an application can request different buffer sizes (larger or smaller). The call to setsockopt can succeed even when the implementation did not provide the whole amount requested. An application must call getsockopt with the same option to check the buffer size actually provided. 
49

“SO_”前缀用于“套接字选项“,所以是的,这些是针对每个套接字缓冲区的每个套接字设置。通常有系统范围的默认值和最大值。

SO_RCVBUF更容易理解:它是内核分配的缓冲区的大小,用于在数据到达网络之间以及拥有此套接字的程序读取数据期间将数据保存到给定套接字中。对于TCP,如果数据到达并且您没有读取它,缓冲区将被填满,并且发送者将被告知放慢速度(使用TCP窗口调整机制)。对于UDP,一旦缓冲区已满,新的数据包将被丢弃。

SO_SNDBUF,我认为只对TCP有帮助(在UDP中,无论你发送的是什么,直接发送到网络)。对于TCP,如果远程端没有读取,可以填充缓冲区(以便远程缓冲区变满,然后TCP将此事实传达给您的内核,并且您的内核停止发送数据,而是将其累积在本地缓冲区中,直到它填上)。或者如果存在网络问题,并且内核没有得到它发送的数据的确认,它可能会填满。然后它会减慢在网络上发送数据的速度,直到最终输出缓冲区填满。如果是这样,应用程序将来的write()调用此套接字将阻塞(如果您已设置O_NONBLOCK选项,则返回EAGAIN)。

这一切最好在Unix Network Programming书中描述。

7

在Windows中,发送缓冲区确实对UDP有影响。如果将数据包发送出去的速度比网络传输速度快,最终将填充套接字输出缓冲区,SendTo将以“将阻止”失败。增加SO_SNDBUF将对此有所帮助。我不得不增加发送缓冲区和接收缓冲区,以便进行测试,以便查找我可以在Windows盒子和Linux盒子之间发送的最大数据包速率。我也可以通过检测“会阻塞”错误代码,休眠一下并重试来处理发送大小。但增加发送缓冲区的大小更简单。 Windows中的默认值是8K,在这个带有GB内存的PC时代,这似乎是不必要的小事!