用于固定目标和源端口的并行TCP会话

据我所知,TCP接收大量的数据并将其分割成通过TCP 会话传输的

现在假设我作为客户端有两个数据块AB ,我想要发送到服务器。 每个块被分成3个部分,共6个部分。

我将通过互联网发送这6个段,但我不能保证服务器将收到它们的顺序。 幸运的是,TCP服务器为我重新排列乱序。

但是,对于我的应用程序来说,区块A和区块B是完全独立的,所以如果所有的B区段都被接收到,我不希望服务器等待A区段,反之亦然。 实际上,我想为块AB两个独立的TCP会话。

客户端和服务器可能有并行的,独立的TCP会话吗? 查看TCP标题条目,我看不到“会话编号”。 我被迫使用不同的源或目标端口?

当然,你可以在同一个客户端和服务器之间有两个并行的,独立的TCP会话。 否则,举个例子,Web浏览器将无法同时从Web服务器获取HTML页面和图像,或者两个图像。

TCP会话的鉴别器不是“会话号码”,而是元组(local-address,local-port,remote-address,remote-port) 。 只要至less有一个是不同的,这是一个不同的TCP会话。

所以回答你的问题,是的,你被迫使用不同的源或目标端口。 如果您尝试使用相同的源和目标端口,TCP堆栈将拒绝build立连接(给您错误EADDRINUSE)。 这一切都假设本地地址和远程地址始终是相同的。

但这不是你通常不必担心的事情。 通常,TCP启动器(客户端)不需要绑定到特定的端口。 他们让内核在调用connect()之前不调用bind()自动select一个源端口。 内核将确保为第二个连接select一个不同的源端口。

被接受的答案是正确的,并且回答了这个问题,但是这个问题解决了与使用多个TCPstream不同的问题。

您所描述的“线路阻塞”问题是Quick UDP Internet Connections(QUIC)协议背后的一个动机。 如果您对如何解决这个问题以及其他问题感兴趣,我build议您从Google上关注QUIC的networking直播 。

当然, 维基百科上也有QUIC 。