TCP/IP 協定如何區分客戶端?

TCP/IP 協定如何區分客戶端?

如果我們建立一個監聽套接字,它將傳回一個描述符(比如說根描述符),並且我們將該描述符綁定到一個位址。每當有新的客戶端連線可用時,根描述符就會通知我們,我們接受該新連線並接收每個客戶端的唯一描述符(比方說客戶端描述符)。從現在開始,我們可以使用該描述符與該客戶端進行通訊。客戶端資訊儲存在客戶端描述符指出的單獨 inode 中。因此,Linux 能夠將對應的客戶端資料傳遞到對應的描述符。

如果我上面提到的是正確的(如果我的理解有誤,請糾正我)那麼我就有疑問了。 inode 中儲存的客戶端資訊是什麼? Linux是如何唯一標識客戶端的?

答案1

TCP/IP 和 UDP/IP 協定知道由本機和遠端 IP 位址和連接埠定義的「會話」[1]。例如,TCP/IP 套件將包含來源和目標 IP 位址以及連接埠 [2]。開啟多個連線的伺服器或用戶端(例如 Firefox)將在 OSI [3] 會話層透過位址和連接埠進行區分。

請在使用網頁瀏覽器時開啟 shell 並以 root 身分執行

netstat -tulpan

查看目前和活動的連線 [4]。

輸出範例:

# netstat -tulpan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1966/sshd           
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1902/cupsd          
tcp        0      0 192.168.1.16:57374      172.217.23.165:443      ESTABLISHED 4730/firefox-bin     
tcp        0      0 192.168.1.16:55478      104.26.11.30:443        ESTABLISHED 4730/firefox-bin     
udp        0      0 127.0.0.1:53            0.0.0.0:*                           1996/named          

這些行顯示 Firefox 與不同本機連接埠的「已建立」連接,以便 Firefox 能夠識別哪個封包是哪個請求的答案。

其他處於 LISTEN 狀態的線路是作為伺服器程序運行的本機程序,包括sshd(Secure Shell Server)、cupsd(印表機守護程序)和named(Bind name server)。這些將接受傳入連線。

了解更多參考資料:

[1]https://en.wikipedia.org/wiki/Port_(computer_networking)

[2]https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structhttps://en.wikipedia.org/wiki/IPv4_header#Header

[3]https://en.wikipedia.org/wiki/OSI_model

[4]https://en.wikipedia.org/wiki/Netstat

答案2

當您執行操作時,listen您指定一個端口,因為該端口必須是眾所周知的。這一端有一個IP(或多個)和一個連接埠。

當你執行 a 時,connect你指定遠端伺服器的 IP 和連接埠listen。本機IP由作業系統決定,並分配一個連接埠(可以是任何數字)。

連線可以透過以下方式識別:( (remote IP, remote port), (local IP, local port) )這設定了從任何一個 IP 位址到每個遠端連接埠的 64K 連線的上限。

相關內容