什么是SO_SNDBUF和SO_RECVBUF

你能解释一下SO_SNDBUFSO_RECVBUF选项到底是什么吗?

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

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

他们是每sockets缓冲区?

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

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

一篇好文章也会很棒。

我GOOGLE了,但没有find任何有用的信息。

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

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

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

这一切最好在Unix网络编程书中描述。

在Windows中,发送缓冲区确实对UDP有影响。 如果你发送数据包的速度比网络传输的速度快,那么你最终会填充套接字输出缓冲区,SendTo将会以“会阻塞”的方式失败。 增加SO_SNDBUF将有助于此。 我不得不增加发送缓冲区和接收缓冲区,以便在Windows盒子和Linux盒子之间找到可以发送的最大数据包速率。 我也可以通过检测“会阻塞”错误代码,休眠一下,然后重试来处理发送大小。 但是增加发送缓冲区的大小更简单。 在Windows的默认是8K,这似乎在这个与GB的RAM的个人电脑的时代不必要的小!

在Google搜索“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.