(我使用Linux)
我电脑的本地IP是
172.16.1.2
ip a
命令返回 172.16.1.2
然后我可以将另一个IP添加到同一网络接口:
ip addr add 192.168.1.10 dev eth0
现在
ip a
命令返回2个IP
172.16.1.2
192.168.1.10
然后我将 Python 简单的 http 服务器 绑定到
192.168.1.10
:
from wsgiref.simple_server import make_server
def hello_world_app(environ, start_response):
print(environ['REMOTE_ADDR']) # why not 172.16.1.2
start_response(status='200 OK', headers=[])
return [b"Hello World"]
IP = '192.168.1.10'
PORT = 8000
make_server(IP, PORT, hello_world_app).serve_forever()
然后只需在浏览器中或通过curl打开
http://192.168.1.10:8000
我的问题是为什么它打印
192.168.1.10
而不是 172.16.1.2
?172.16.1.2
,我希望它是 REMOTE_ADDR
如果路由表没有设置特定的“首选源地址”提示,则 Linux 使用“最长前缀匹配”选择本地地址;也就是说,它通常会尝试选择与目的地最相似的源地址。
在这种情况下,
192.168.1.10 ↔ 192.168.1.10
匹配所有32位(一如既往从左开始),而172.16.1.2 ↔ 192.168.1.10
仅匹配1位,因此系统选择前者。
(这不是完整的描述 - 我确信还有一些其他条件我已经忘记了,而且 IPv4 和 IPv6 之间的工作方式也略有不同。)