环回接口( loopback )-127.0.0.1 VS 192.168.0.5 VS 0.0.0.0, 服务器套接字(server socket)如何选择绑定哪个IP?

loopback 是什么东东?

本地环回接口(或地址),亦称回送地址(loopback address)。此类接口是应用最为广泛的一种虚接口,几乎在每台路由器上都会使用。

参考

《working with TCP sockets》

loopback 介绍

IP地址并不总是必须指向远程主机。特别是在开发中你经常想要连接到你本地主机上的套接字(sockets)。

大多数系统定义了一个环回接口(loopback interface)。这是个完全虚拟的接口,并且它和你网口的接口不同,它是没有连接到任何硬件的。
发送到环回接口的任何数据会立即在同一个接口被接收。在使用回环地址时你的网络被限制在本地主机。

回环接口的主机名(host name)被官方称为localhost,其回环IP地址是经典的 127.0.0.1。对于你的系统而言,这些在”hosts”文件中被定义。

服务器套接字如何选择绑定哪个IP地址?–127.0.0.1 VS 192.168.1.1 VS 0.0.0.0

绑定到 0.0.0.0 和 绑定到 127.0.0.1 或者 1.2.3.4 到底有何区别呢?

系统的环回接口以IP地址 127.0.0.1 表现。系统也有一个物理的、基于硬件的接口,它表现为不同的IP地址,让我们假设这个IP为 192.168.0.5。
当你绑定(bind)到一个特定的接口时,以其IP地址表现,你的套接字(socket)只会监听(listening)那个接口。它会忽略其他接口。

如果你绑定到 127.0.0.1,那么你的套接字将只会监听回环接口。在这种情况下,只有到 localhost 或者 127.0.0.1 的连接才会被路由到你的服务器套接字(server socket)。
由于这个接口只在本地可用,所以不允许任何外部连接。

如果你绑定到 192.168.0.5,在这个例子中,那么你的套接字将会只监听那个接口。
任何能够寻址到那个接口的客户端(clients)都将会被监听到,但是任何到 localhost 的连接都将不会被路由到那个服务器套接字。

如果你想要监听所有接口那么你可以使用 0.0.0.0.这将会绑定到任何可用的接口,环回接口或者其他。
大多数情况下,这正是你所期望的。

在 Linux 操作系统中,可以通过以下步骤配置组播: 1. 检查网络适配器是否支持组播功能。可以使用以下命令查看: ``` $ ifconfig -a ``` 如果网络适配器支持组播功能,则应该看到类似如下输出: ``` eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::20c:29ff:fe8c:54b2 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:8c:54:b2 txqueuelen 1000 (Ethernet) RX packets 9117 bytes 720098 (720.0 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8319 bytes 579825 (579.8 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device interrupt 18 base 0x2000 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 172 bytes 13696 (13.6 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 172 bytes 13696 (13.6 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ``` 可以看到 eth0 网络适配器支持 MULTICAST 多播功能。 2. 确保 Linux 内核开启了组播功能。可以使用以下命令检查: ``` $ cat /proc/sys/net/ipv4/ip_multicast ``` 如果输出为 1,表示内核已经开启了组播功能。如果输出为 0,则需要手动开启组播功能: ``` $ sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_multicast" ``` 3. 加入组播组。可以使用以下命令加入组播组: ``` $ sudo ip maddr add <multicast-address> dev <interface> ``` 其中,`<multicast-address>` 是组播地址,`<interface>` 是网络适配器名称。例如: ``` $ sudo ip maddr add 224.0.0.1 dev eth0 ``` 表示将 eth0 加入到组播地址为 224.0.0.1 的组播组中。 4. 发送组播包。可以使用 `sendto()` 函数发送组播包。组播包的目标地址应该设置为组播地址,例如: ``` struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(port); inet_pton(AF_INET, "224.0.0.1", &addr.sin_addr); sendto(sockfd, buffer, length, 0, (struct sockaddr *)&addr, sizeof(addr)); ``` 其中,`port` 是端口号,`sockfd` 是套接字描述符,`buffer` 和 `length` 是要发送的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值