用於固定目標和來源連接埠的並行 TCP 會話

用於固定目標和來源連接埠的並行 TCP 會話

據我了解,TCP 獲取一大塊數據並將其切割成透過 TCP 傳輸會議

現在假設我作為客戶端有兩塊A資料B想要發送到伺服器。每個塊被切成3段,總共形成6段。

我將透過網路發送這 6 個片段,但我無法保證伺服器接收它們的順序。幸運的是,TCP 伺服器為我重新排列了無序的段。

但是,對於我的應用程序,塊A和是完全獨立的,因此我不希望伺服器在收到所有段的情況下B等待段,反之亦然。實際上,我想要兩個獨立的 TCP 會話用於區塊和.ABAB

客戶端和伺服器是否可以擁有並行、獨立的 TCP 會話?查看 TCP 標頭條目,我沒有看到“會話號碼”。我被迫使用不同的來源連接埠或目標連接埠?

答案1

當然,您可以在同一客戶端和伺服器之間擁有兩個並行、獨立的 TCP 會話。否則,僅舉一個例子,Web 瀏覽器將無法同時從 Web 伺服器取得 HTML 頁面和圖像或兩個圖像。

TCP 會話的鑑別符不是“會話號”,而是元組(本機位址、本機連接埠、遠端位址、遠端連接埠)。只要其中至少有一個不同,它就是不同的 TCP 會話。

因此,在回答您的問題時,是的,您被迫使用不同的來源或目標連接埠。如果您嘗試使用相同的來源連接埠和目標端口,您的 TCP 堆疊將拒絕建立連線(給您錯誤 EADDRINUSE)。這一切都假設本地地址和遠端地址始終相同。

但這不是您通常需要擔心的事情。通常,TCP 發起方(客戶端)不需要綁定到特定連接埠。他們讓核心透過bind()在呼叫之前不呼叫來自動選擇來源連接埠connect()。核心將確保為第二個連接選擇不同的來源連接埠。

答案2

接受的答案是正確的並回答了問題,但該問題解決的問題的答案與使用多個 TCP 流的答案不同。

您所描述的「隊頭阻塞」問題是快速 UDP Internet 連線 (QUIC) 協定背後的動機之一。我建議觀看這個網路廣播如果您對 QUIC 如何解決該問題和其他問題感興趣,請參閱來自 Google 的 QUIC 的資訊。

當然,還有維基百科上的 QUIC也。

相關內容