TCP/IP 協議如何區分客戶端?
如果我們創建一個監聽套接字,它將返回一個描述符(比如說根描述符),我們將此描述符綁定到一個地址。每當有新的客戶端連接可用時,根描述符就會通知我們,我們接受該新連接並為每個客戶端接收一個唯一的描述符(比如說客戶端描述符)。從現在開始,我們可以使用該描述符與該客戶端進行通信。客戶端資訊儲存在客戶端描述符所指出的單獨 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