将套接字绑定到本地主机以外的任何地址是啥意思?

Posted

技术标签:

【中文标题】将套接字绑定到本地主机以外的任何地址是啥意思?【英文标题】:What does it mean to bind() a socket to any address other than localhost?将套接字绑定到本地主机以外的任何地址是什么意思? 【发布时间】:2017-01-11 20:24:06 【问题描述】:

我不明白 bind 到 127.0.0.1(或 ::1 等)以外的任何地址的套接字 意味着。 我不是 - 根据定义 - 将套接字绑定到 我自己的 机器上的端口.. 是本地主机吗? 绑定或侦听另一台机器或 IP 地址的端口有什么意义? 从概念上讲,这对我来说没有意义!

(事实证明,这对 Google 来说非常困难……可能是因为我没有在 Google 上搜索正确的条款。)

【问题讨论】:

将套接字绑定到 INADDR_ANY 以外的 任何 IP 地址意味着什么,其中 'other' 包括 @ 987654322@,是它只接受对该 IP 地址的连接。 【参考方案1】:

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

通常在特定机器上有几个接口,即机器可以到达自身的伪接口环回、以太网、WLAN、***...。这些接口中的每一个都可以分配多个 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) 那么说我bind 到的“地址”实际上是指定我绑定到的 interface 是否正确? (2) 尽管有第一部分,如果我在两个接口上有相同的地址怎么办?它会同时绑定到两者吗? (3) 从安全的角度来看,绑定到 127.0.0.1 是否真的会阻止其他系统向我发送数据包?他们不能手动发送一个数据包,将其指定为目标的虚假 IP 地址吗? (4) 绑定到虚假地址的套接字是否 100% 无法访问? @Mehrdad:不,您不是绑定到接口,而是绑定到接口上的地址。绑定到 127.0.0.1 将不会接收 127.1.1.1 的数据,即使这可能是同一个接口。 (2) 你不能在不同的接口上拥有相同的 IP,如果你这样做会发生混乱(即未定义)。 (3) 是的,绑定到 127.0.0.1 会限制对可以访问您的 127.0.0.1 的所有系统的访问 - 这应该只是您的系统。大多数系统会拒绝或丢弃到达未配置目标地址的接口的数据包。 (4) 如果没有人能够将数据发送到虚假地址,那么您将无法在那里接收数据。这使得套接字在大多数情况下实际上无法使用。 谢谢!关于#2,我不太明白。例如,假设我有一个内置和一个 USB Wi-Fi 适配器,每个都连接到不同的路由器,但它们的 IP 地址都恰好是 192.168.1.60。这应该是完全可能的,对吧?现在,如果我将套接字绑定到该地址会发生什么?我会从任一接口获取数据包吗? @Mehrdad:不知道这有什么可怕的。想象一下,您有一个城市,在该城市的不同部分(即界面)多次使用相同的街道名称(即 IP 地址)。除非您有其他方法可以区分地址中的街道(即邮政编码),否则在尝试投递邮件时会发生混乱。

以上是关于将套接字绑定到本地主机以外的任何地址是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

我必须将侦听套接字绑定到哪个主机?

套接字 的端口重用 作用 是啥??

在 Ruby 中将 UDP 套接字绑定到通配符主机

socket是啥意思

Java:绑定和连接方法

Windows 7:嗅探到本地主机的 TCP 套接字