将套接字绑定到本地主机以外的任何地址是啥意思?
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 地址)。除非您有其他方法可以区分地址中的街道(即邮政编码),否则在尝试投递邮件时会发生混乱。以上是关于将套接字绑定到本地主机以外的任何地址是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章