【问题标题】:linux unix sockets vs tcp sockets send buffer sizelinux unix sockets vs tcp sockets发送缓冲区大小
【发布时间】:2019-12-18 17:00:37
【问题描述】:

我正在比较当套接字是 tcp 和 unix 套接字时 send 调用可以传输多少字节。

对于 unix 域套接字,这个数字总是 219264,但是对于 TCP,这个数字要高得多。为什么会有这种差异?两个程序都在同一台机器上执行

注意:套接字处于非阻塞模式

检查缓冲区大小,这些是值

unix 域套接字

receive buffer size =212992
send buffer size =212992

TCP 套接字

receive buffer size =1062000
send buffer size =2626560

谁能解释一下为什么会有这种差异?

【问题讨论】:

  • 事实是缓冲区大小是有限的,并且没有指定确切的大小,因此无论哪种方式您都必须处理它。您可以通过setsockopt() 更改缓冲区大小,并在需要时使用getsockopt() 进行查询,或者只是正确处理send() 返回的字节数少于您的请求。
  • @james 不,我理解。我要问的是,与 tcp 套接字相比,unix 套接字发送只发送很少的字节?一般来说,两者都是套接字
  • 如果你只发送几个字节,那么无论缓冲区大小是 219264 还是更大的东西,从地狱到早餐时间都没有关系。
  • @user207421 我正在发送 10mb 数据,因为对于 unix 套接字,发送缓冲区大小很小,因此污染事件的数量也更多。我想避免这种情况。
  • @user207421 这意味着在高性能应用程序的情况下不能使用unix套接字?

标签: linux sockets unix tcp unix-socket


【解决方案1】:

tcp 缓冲区用于已发送但另一端尚未确认的包,以及已接收到的包乱序并等待延迟包到达后再提交给应用程序的包。当然,只要消费应用程序没有read() 数据,包也会保留在缓冲区中。

在 UNIX 套接字上,等待 ACK 的包或包的顺序不是问题,因此缓冲区可以更小。

【讨论】:

  • “包裹的顺序不是问题”是什么意思。您是说数据不会按照发送顺序接收吗?
  • 在互联网上,不能保证包裹会按照发送的顺序到达,对吧。在接收数据时,TCP 会等待包的顺序可以恢复,然后再将它们(它们的有效负载)呈现给客户端
猜你喜欢
  • 2015-05-01
  • 2012-08-14
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多