Networking

作業系統如何將發送到同一埠的消息路由到不同的套接字?

  • March 12, 2019

這是我一直不太明白的事情:伺服器提供的服務可以通過其 IP 地址和埠來唯一標識,例如 1.2.3.4:22,但多個客戶端可能同時連接到同一個埠。當不同的客戶端向服務端發送新數據時,服務端如何區分它們,從而以不同的方式路由數據?

例如,當伺服器允許 SSH 連接時,它會預設打開 22 埠。可以連接多個 SSH 客戶端,以便多個人可以同時使用 SSH,並且他們都將使用埠 22。我相信在伺服器上,不同的會話通過不同的套接字來區分,但每個會話一個套接字我可能是錯的。

但如果是這種情況,當特定使用者在他們的 SSH 會話期間輸入新命令時,伺服器如何知道將該命令路由到哪個套接字?使用者的電腦無權訪問套接字描述符,他們只有 IP 地址和埠,所以我看不出他們如何向伺服器發送足夠的資訊以允許它區分他們的會話和另一個會話。伺服器是根據客戶端的IP地址和埠來區分的,還是做別的?

連接的每一端都有自己的 IP 地址和埠。“客戶端”(它不是客戶端,因為 TCP/IP 是對等的;它是發起者)在其自己的系統上具有源 IP 和源埠,數據包被定址到這些系統。連接由所有四個源 IP、源埠、目標 IP 和目標埠定義,這使得消除連接歧義變得微不足道。

閱讀 TCP - 這就是創建和跟踪會話的原因。客戶端將通過其 IP 和發送埠來辨識,因此至少是這樣。對於某些協議/應用程序,還有進一步的改進,如 cookie、密鑰等。

https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Resource_usage

大多數實現在將會話映射到正在執行的作業系統程序的表中分配一個條目。因為 TCP 數據包不包含會話標識符,所以兩個端點都使用客戶端的地址和埠來標識會話。每當接收到數據包時,TCP 實現必須在此表上執行查找以找到目標程序。表中的每個條目稱為傳輸控制塊或 TCB。它包含有關端點(IP 和埠)、連接狀態、正在交換的數據包的執行數據以及用於發送和接收數據的緩衝區的資訊。

引用自:https://serverfault.com/questions/957927