我的机器的私有IP地址是192.168.44.182。如果我使用以下方式启动一个进程
nc -l localhost 20000
那么这个进程将不会处理发送到192.168.44.182的请求。
由于侦听 localhost:20000 的进程确实在 LAN IP 为 192.168.44.182 的物理机上运行,因此我想知道该进程如何忽略对 192.168.44.182 的请求。
这些请求是否真的被进程忽略了,或者这些请求根本没有传递到 127.0.0.1 的网络接口?这是网络层机制,还是链路层机制?
答案1
当您设置侦听套接字时,您可以选择它绑定到哪个本地地址。这是通过bind(2) 系统调用完成的。 (您也可以选择将其绑定到0.0.0.0,这意味着监听所有本地地址)。
您告诉 netcat 在本地主机上监听。因此它使用 127.0.0.1(或类似的)作为套接字地址调用了bind(2)。因此内核将侦听套接字仅绑定到该地址。
当连接请求传入 192.168.44.182:20000 时,内核查看侦听套接字列表,但没有找到任何套接字。所以内核拒绝了连接。
当请求进入 127.0.0.1:20000 时,内核将找到侦听套接字,accept(2) 系统调用将告诉 netcat 相关信息。
要让 netcat 侦听所有接口,请省略 host:nc -l -p 20000
或指定 0.0.0.0: nc -l 0.0.0.0 -p 20000
。您还可以指定您希望它监听的特定IP地址(192.168.44.182),但这样当然nc localhost 20000
会被拒绝。
(当您只想允许来自同一台计算机的连接时,通常会绑定到本地主机,例如出于安全原因。)
答案2
每个套接字都有 2 个与之相关的特征。地址和端口。每个接口上的套接字侦听实际上侦听一个地址INADDR_ANY
,即0.0.0.0
,因此,既然您告诉套接字它正在侦听,127.0.0.1
它将忽略对计算机其他地址的所有请求。