Linux

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

  • March 14, 2020

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

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

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(printer daemon) 和named(Bind name server)。這些將接受傳入連接。

參考資料了解更多:

$$ 1 $$ https://en.wikipedia.org/wiki/Port_(computer_networking) $$ 2 $$ https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure>以及<https://en.wikipedia.org/wiki/IPv4_header#Header $$ 3 $$ https://en.wikipedia.org/wiki/OSI_model $$ 4 $$ https://en.wikipedia.org/wiki/Netstat

引用自:https://unix.stackexchange.com/questions/572310