如果一个应用程序打开 2 个 TCP 套接字,是不是会在这两个套接字之间保持有序属性?

Posted

技术标签:

【中文标题】如果一个应用程序打开 2 个 TCP 套接字,是不是会在这两个套接字之间保持有序属性?【英文标题】:If an application opens 2 TCP sockets, will the in-order property be maintained across both of them?如果一个应用程序打开 2 个 TCP 套接字,是否会在这两个套接字之间保持有序属性? 【发布时间】:2014-03-12 23:00:52 【问题描述】:

如果我有一个 javascript 应用程序可以并行打开 2 个 websocket,其中两个 websocket 都指向同一端口上的同一主机:

var socket1 = io.connect(host);
var socket2 = io.connect(host);

然后我将数据从它们中的每一个发送到应用程序中的相同函数:

socket1.on("data", function(e) doStuff(e););
socket2.on("data", function(e) doStuff(e););

每个套接字是否会仅对其自身强制执行有序属性,还是会为整个应用程序强制执行?例如,如果发送到 socket1 的数据包丢失,socket2 是否仍然能够接收和处理未来的 TCP 数据包,而无需等待数据包重新传输到 socket1?

【问题讨论】:

【参考方案1】:

这两个套接字将完全独立。在一个连接上发送的数据不会影响另一个连接,无论丢失和重新传输。具体来说,TCP 用于数据完整性的序列号空间特定于 (addr1, port1, addr2, port2) 的四元组。

【讨论】:

但是假设他们在同一个端口上与同一个服务器通信?两个连接的元组不是相同的吗? @Joey 不,不会。客户端将使用两个不同的端口。还要记住,Web Sockets 是一个在 TCP 上运行的单独协议,而 Socket.IO 是 Web Sockets 其他传输之上的另一个协议。您的问题混淆了所有这些层。事实上,Socket.IO 完全不需要持久连接。 @Brad 是正确的。 TCP 连接由该四元组定义。如果你在两个连接上使用相同的端口号,你就没有两个 TCP 连接,你只有一个。但你不知道 - 每个 WebSocket 都是一个单独的客户端端口号。

以上是关于如果一个应用程序打开 2 个 TCP 套接字,是不是会在这两个套接字之间保持有序属性?的主要内容,如果未能解决你的问题,请参考以下文章

如果达到超时,gen_tcp:recv/3 是不是会关闭套接字?

HTTP TCP 和 WEB 套接字

服务器是不是为每个客户端进程打开了套接字?

多插座连接的优点

如何确定打开的套接字是 TCP 还是 unix 域套接字?

Google 会为它收到的每个请求打开多少个套接字?