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 连接的上限。

相关内容