如果我們建立一個監聽套接字,它將傳回一個描述符(比如說根描述符),並且我們將該描述符綁定到一個位址。每當有新的客戶端連線可用時,根描述符就會通知我們,我們接受該新連線並接收每個客戶端的唯一描述符(比方說客戶端描述符)。從現在開始,我們可以使用該描述符與該客戶端進行通訊。客戶端資訊儲存在客戶端描述符指出的單獨 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_struct也https://en.wikipedia.org/wiki/IPv4_header#Header
答案2
當您執行操作時,listen
您指定一個端口,因為該端口必須是眾所周知的。這一端有一個IP(或多個)和一個連接埠。
當你執行 a 時,connect
你指定遠端伺服器的 IP 和連接埠listen
。本機IP由作業系統決定,並分配一個連接埠(可以是任何數字)。
連線可以透過以下方式識別:( (remote IP, remote port), (local IP, local port) )
這設定了從任何一個 IP 位址到每個遠端連接埠的 64K 連線的上限。