绑定套接字到除localhost以外的任何地址是什么意思?

65

我不理解绑定socket到除127.0.0.1(或::1等)以外的任何地址的含义。
按照定义,难道我不是将socket绑定到本地机器上的端口吗?也就是localhost?
那么绑定或监听另一台机器或IP地址的端口有什么意义呢?
从概念上讲,这对我来说毫无意义!

(这在Google上被证明是非常困难的...可能是因为我没有搜索到正确的术语。)


绑定套接字到除INADDR_ANY以外的任何IP地址,其中“其他”包括localhost,意味着它只会接受连接到该IP地址的请求。 - user207421
1个回答

77

将套接字绑定到地址和端口以在此套接字上接收数据(大多数情况下)或在发送数据时使用此地址/端口作为数据源(例如在FTP服务器中与数据连接一起使用)。

通常,特定计算机上有几个接口,例如伪接口回环,其中计算机可以访问自己,以太网、WLAN、VPN等。每个接口都可以分配多个IP地址。例如,回环通常具有127.0.0.1和IPv6的::1,但您也可以分配其他地址。以太网或WLAN具有本地网络上的IP地址,例如172.16.0.34或其他地址。

如果将用于接收数据的套接字绑定到特定地址,则仅能接收发送到此特定IP地址的数据。例如,如果绑定到127.0.0.1,则仅能从自己的系统接收数据,而不能从本地网络上的其他系统接收数据,因为它们无法向您的127.0.0.1发送数据:首先,任何发送到127.0.0.1的数据都会发送到他们自己的127.0.0.1,其次,您的127.0.0.1是内部回环接口上的地址,无法从外部访问。

您还可以将套接字绑定到一个通配地址,例如0.0.0.0(IPv4)和::(IPv6)。在这种情况下,它不绑定到特定的IP地址,而是能够接收发送到计算机上任何IP地址的数据。


1
+1 感谢您的回答。这实际上引发了几个问题:(1)那么,我“绑定”到的“地址”实际上是指定我要绑定到的接口吗?(2)尽管第一部分如此,如果我在两个接口上有相同的地址怎么办?它会同时绑定到两个接口吗?(3)实际上,绑定到127.0.0.1是否从安全角度防止其他系统向我发送数据包?他们不能手动发送一个指定该地址为目标的虚假IP地址的数据包吗?(4)绑定到虚假地址的套接字是否100%不可达? - user541686
1
@Mehrdad:不,你绑定的不是接口而是接口上的地址。绑定到127.0.0.1将无法接收到127.1.1.1的数据,即使它可能是相同的接口。(2)你不能在不同的接口上拥有相同的IP地址,如果这样做会导致混乱(即未定义的行为)。(3)是的,绑定到127.0.0.1会限制访问所有可以访问你的127.0.0.1的系统,这应该只有你的系统。大多数系统将拒绝或丢弃到达目标地址未配置的接口的数据包。 - Steffen Ullrich
1
如果没有人能够向虚假地址发送数据,那么你就无法在那里接收数据。这使得套接字在大多数情况下变得无法使用。 - Steffen Ullrich
1
@Mehrdad:如果你有这样的设置,且针对该IP地址的TCP SYN请求进来了,那么你的系统可能会在不同的接口上发送ACK,因为该接口声称处于同一网络中。这就是我所说的混乱,也就是说它可能工作或者不工作,或者有时候工作等等。这种行为也可能取决于特定的操作系统。 - Steffen Ullrich
3
@Mehrdad: 我不知道哪一部分有问题。请想象一下,如果你住在一个城市里,同一条街道(即IP地址)在该城市的不同位置(即接口)上出现了多次。除非你有其他方式来区分地址中的街道(即邮政编码),否则在投递邮件时会发生混乱。 - Steffen Ullrich
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接