如果我们创建一个侦听套接字,它将返回一个描述符(比如说根描述符),并且我们将该描述符绑定到一个地址。每当有新的客户端连接可用时,根描述符就会通知我们,我们接受该新连接并接收每个客户端的唯一描述符(比方说客户端描述符)。从现在开始,我们可以使用该描述符与该客户端进行通信。客户端信息存储在客户端描述符指出的单独 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 连接的上限。