Windows 什么是sou SNDBUF和sou RCVBUF
你能给我解释一下到底什么是Windows 什么是sou SNDBUF和sou RCVBUF,windows,sockets,network-programming,Windows,Sockets,Network Programming,你能给我解释一下到底什么是SO_SNDBUF和SO_RCVBUF选项吗 好的,由于某些原因,操作系统会缓冲进出口数据,但我想澄清一下这个问题 他们(通常)的角色是什么 它们是每个套接字缓冲区吗 传输层的缓冲区(例如TCP缓冲区)和这些缓冲区之间是否存在连接 在使用流套接字(TCP)和无连接套接字(UDP)时,它们是否有不同的行为/角色 一篇好文章也会很棒 我在谷歌上搜索了一下,但没有找到任何有用的信息。在谷歌上搜索“SO_RECVBUF msdn”给了我 选项表中的以下几行回答了您的“它们
SO_SNDBUF
和SO_RCVBUF
选项吗
好的,由于某些原因,操作系统会缓冲进出口数据,但我想澄清一下这个问题
- 他们(通常)的角色是什么
- 它们是每个套接字缓冲区吗
- 传输层的缓冲区(例如TCP缓冲区)和这些缓冲区之间是否存在连接
- 在使用流套接字(TCP)和无连接套接字(UDP)时,它们是否有不同的行为/角色李>
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.
稍后将详细介绍:
sou RCVBUF和sou SNDBUF
当Windows套接字实现支持SO_RCVBUF和
因此,应用程序可以请求不同的缓冲区大小
(大或小)。即使在
执行工作没有提供所要求的全部数额。一
应用程序必须使用相同的选项调用getsockopt以检查
实际提供的缓冲区大小
“SO_uuz”前缀表示“套接字选项”,因此是的,这些是每个套接字缓冲区的每个套接字设置。通常有系统范围的默认值和最大值
因此_RCVBUF
更容易理解:它是内核分配的缓冲区大小,用于在数据通过网络到达指定套接字和拥有该套接字的程序读取数据之间的时间内保存到达该套接字的数据。使用TCP,如果数据到达而您没有读取它,缓冲区将填满,发送方将被告知减速(使用TCP窗口调整机制)。对于UDP,一旦缓冲区已满,新数据包将被丢弃
我认为,只有TCP(在UDP中,您发送的任何内容都直接发送到网络)才重要。对于TCP,如果远程端没有读取数据,则可以填充缓冲区(这样远程缓冲区就满了,然后TCP将此事实传递给内核,内核停止发送数据,而是将其累积到本地缓冲区中,直到填满为止)。或者,如果出现网络问题,并且内核没有收到它发送的数据的确认,它可能会被填满。然后,它将减慢在网络上发送数据的速度,直到最终传出缓冲区填满为止。如果是这样,应用程序对该套接字的未来write()
调用将被阻止(或者如果您设置了O\u NONBLOCK
选项,则返回EAGAIN
)
这一切在本书中得到了最好的描述。在Windows中,发送缓冲区在UDP中确实有作用。如果发送数据包的速度快于网络传输数据包的速度,那么最终将填充套接字输出缓冲区,SendTo将以“Wild block”失败。增加SO_SNDBUF将有助于解决这一问题。我必须增加发送和接收缓冲区,以便进行一项测试,以找到在Windows设备和Linux设备之间可以发送的最大数据包速率。我还可以通过检测“将阻塞”错误代码、稍微休眠并重试来处理发送大小。但是增加发送缓冲区的大小更简单。
Windows中的默认值是8K,在这个PC机时代,8K看起来不必要的小,内存为GB 以上答案并没有回答所有问题,特别是关于套接字缓冲区和TCP缓冲区之间的关系 我认为它们是不同层次的不同事物。TCP缓冲区是套接字缓冲区的使用者 套接字缓冲区(输入和输出)是一个IO缓冲区,由系统调用从用户空间中的应用程序代码访问。 例如,使用输出缓冲区,应用程序代码可以
- 在缓冲区已满之前立即发送数据,并在缓冲区已满时阻止
- 设置缓冲区大小
- 将缓冲区中的数据刷新到基础存储(TCP发送缓冲区)
- 通过关闭流来关闭输出缓冲区
- 发送数据包并接受ACK
- 保证包的交付和订购
- 通过调整机上数据包窗口的大小来控制拥塞