全双工套接字与使用的两个套接字,一个用于读取,另一个用于写入

Posted

技术标签:

【中文标题】全双工套接字与使用的两个套接字,一个用于读取,另一个用于写入【英文标题】:Full duplex socket vs. two sockets used, one for read and other for write 【发布时间】:2014-10-28 17:52:34 【问题描述】:

我想知道,

第一个问题每个对等方使用一个套接字(全双工)与两个套接字(单工)的优缺点是什么:一个用于读取,另一个用于写入?特别是在性能和​​资源利用率方面。

第二个问题如果我选择每个对等方使用超过 1 个套接字,那么我所做的一切都是读写。那么它会帮助我扩展处理不处理的消息吗?

第三个问题:什么可以帮助我确定每个对等方的套接字数量?网络带宽?进出消息的数量?

所有问题都是不同的,没有任何相互关系。

【问题讨论】:

什么样的应用程序使用该套接字?如果您需要并行进行不同类型的通信,则必须使用两个套接字,例如 FTP。 一些专有协议通过 TCP 套接字发送和接收消息。 使用两个套接字的一个缺点是增加了复杂性。对于单个套接字,套接字要么已连接,要么未连接。对于两个套接字,现在您必须弄清楚当两个套接字连接中的一个断开(或无法连接)而另一个仍然连接时如何处理它。这是额外的麻烦,没有明显的好处。 【参考方案1】:

使用一个套接字(全双工)与两个套接字一个用于读取和其他写入的优缺点是什么?特别是在性能和​​资源利用率方面。

Pro one socket:资源利用率。反对一个插座:无。性能:相同,但如果您只使用一个套接字,则可以节省连接和关闭握手。

如果我选择采用两个套接字的方法,那么同时使用它们全双工将没有用,这样可以帮助我在数据流入和流出方面进行横向扩展?

现在您正在比较苹果和橙子。您无法将一个全双工套接字与两个全双工套接字进行比较。我不知道为什么您认为您可能需要两个入站和两个出站流,但您不需要。除了 FTP,我能想到的每个协议都只使用一个。

网络带宽对其有什么影响?

无。

或者它对网络利用率有影响?

无,除了连接和关闭握手。但它在两端都浪费资源。

【讨论】:

对不起,我没能把问题写好。第二个问题与第一个问题不同,它们不是相互关联的。在第二个问题中我想知道的是,如果我选择每个目的地使用两个套接字,那么我会同时读写。然后它可以帮助我扩展处理任何消息。第三个问题是选择每个目的地的套接字数量,应该取决于可用带宽吗? 第二个问题的答案取决于你的功能需求。我看不出它如何帮助扩展任何东西。第三个问题的答案是否定的。 @EJP 只是为了扮演魔鬼的拥护者(因为我也认为两个套接字是一个套接字太多)...... TCP 数据包被丢弃的情况呢?在单套接字情况下,您在该方向上的整个数据流将暂停(短暂),直到检测到丢弃的数据包并重新发送。使用两个套接字,您可以在此期间继续从另一个套接字接收数据,因为 TCP 流 B 不会受到 TCP 流 A 丢弃的数据包的影响。 @JeremyFriesner 当然,如果您的功能要求如此说明。大多数情况下他们没有。大多数情况下,它们要求您以串行方式而不是并行方式执行客户端操作。 如果延迟很大,比如美国和欧洲国家之间的通信,需要很多requect-response通信,而且大部分request-response通信是独立的,增加socket数量可能有助于增加消息处理能力一般。如果使用 10gb/s 的网络发送大数据包,一个 socket 就足够了,因为硬盘的数据带宽限制了数据传输的速度。【参考方案2】:

我们已将 --full-duplex 添加到 iperf 2.0.14,它将测试全双工套接字。每个 -d 或 --dualtest 选项可以将它与两个套接字进行比较。我们发现“您的里程会有所不同”,并且对于是否具有相同的性能没有统一的答案。从理论上讲,它们似乎应该是平等的,但实际上可能不是。

   -d, --dualtest
          Do a bidirectional test simultanous test using two unidirectional sockets

       --fq-rate n[kmgKMG]
          Set a rate to be used with fair-queueing based socket-level pacing, in bytes or bits per second. Only available on  platforms  supporting  the  SO_MAX_PACING_RATE  socket  option.
          (Note: Here the suffixes indicate bytes/sec or bits/sec per use of uppercase or lowercase, respectively)

       --full-duplex
          run a full duplex test, i.e. traffic in both transmit and receive directions using the same socket

鲍勃

【讨论】:

以上是关于全双工套接字与使用的两个套接字,一个用于读取,另一个用于写入的主要内容,如果未能解决你的问题,请参考以下文章

QTcpSocket真的是全双工的吗?

C语言 socket shutdown()函数(将与 sockfd 关联的套接字上的全双工连接全部或部分关闭)

socket编程基本概念

socket模块和粘包现象

多进程编程之进程间通信

websocket实战 入门