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

Ran*_*lue 1 tcp

据我了解,TCP 获取一大块数据并将其切割成通过 TCP会话传输的

现在假设我,作为一个客户端,有两个数据块AB我想发送到服务器。每个chunk被切成3个段,总共形成6个段。

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

但是,对于我的应用程序,块AB是完全独立的,因此A如果B已收到所有段,我不希望服务器等待段,反之亦然。实际上,我想要两个独立的 TCP 会话用于块AB.

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

Cel*_*ada 5

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

TCP 会话的鉴别器不是“会话号”而是元组(local-address, local-port, remote-address, remote-port)。只要其中至少一个不同,它就是不同的 TCP 会话。

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

但这不是您通常需要担心的事情。通常,TCP 发起方(客户端)不需要绑定到特定端口。通过在调用bind()之前不调用,它们让内核自动选择一个源端口connect()。内核将确保为第二个连接选择不同的源端口。