如果一个应用程序打开 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 套接字,是不是会在这两个套接字之间保持有序属性?的主要内容,如果未能解决你的问题,请参考以下文章