据我了解,TCP 会获取一块数据并将其切割成段通过 TCP 传输会议。
现在假设我作为客户端有两块A
数据B
需要发送到服务器。每块数据被分成 3 段,总共 6 段。
我将通过互联网发送这 6 个段,但我无法保证服务器接收它们的顺序。幸运的是,TCP 服务器会为我重新排列无序的段。
但是,对于我的应用程序来说,块A
和是完全独立的,因此我不希望服务器在收到所有段后B
等待段,反之亦然。实际上,我希望为块和建立两个独立的 TCP 会话。A
B
A
B
客户端和服务器是否可以拥有并行、独立的 TCP 会话?查看 TCP 标头条目,我没有看到“会话编号”。我被迫使用不同的源端口或目标端口?
答案1
当然,您可以在同一个客户端和服务器之间建立两个并行、独立的 TCP 会话。否则,举个例子,Web 浏览器将无法同时从 Web 服务器获取 HTML 页面和图像,或两张图片。
TCP 会话的鉴别器不是“会话号”,而是三元组(本地地址,本地端口,远程地址,远程端口)。只要其中至少一个不同,它就是不同的 TCP 会话。
因此,回答您的问题,是的,您被迫使用不同的源或目标端口。如果您尝试使用相同的源和目标端口,您的 TCP 堆栈将拒绝建立连接(给出错误 EADDRINUSE)。这一切都假设本地地址和远程地址始终相同。
但这不是您通常需要担心的事情。通常,TCP 发起者(客户端)不需要绑定到特定端口。它们让内核自动选择源端口,方法是bind()
在调用之前不调用connect()
。内核将确保为第二个连接选择不同的源端口。
答案2
接受的答案是正确的并且回答了问题,但是问题解决的问题与使用多个 TCP 流的答案不同。
您描述的“队头阻塞”问题是快速 UDP 互联网连接 (QUIC) 协议背后的动机之一。我建议观看这次网络直播如果您对它如何解决这个问题和其他问题感兴趣,可以参阅 Google 提供的有关 QUIC 的信息。
当然有维基百科上的 QUIC也。