发送到 127.0.0.1 的数据包是否完全使用工作连接套接字?

Do packets sent to 127.0.0.1 fully use the working connection socket?

给定客户端-服务器机器系统(例如 MP 视频游戏),服务器出于某些原因想要向自己发送数据包(我想使用的协议无关紧要)。可以通过 IP 将此类数据包发送到服务器,但这实际上涉及在互联网上发送数据包,然后等待它返回(另外,这样做有点奇怪)。这就是为什么我们可以将数据包发送到地址 127.0.0.1.

我的问题是:当向 127.0.0.1 发送数据包时,数据包是否真的到达了用于建立连接的套接字以便传送到同一台机器,或者只是 "captured"之前并发回(因为它是一个自发送数据包)然后让套接字空闲到来自外部的 send/receive 个数据包?

好吧,这确实取决于实现 - 但取决于 Linux - 即使来自节点的数据包说 192.168.0.1 并且发往同一主机 192.168.0.1 也不会看到就像机器的以太网卡一样。因此,将其发送到 IP 地址本身不会有任何坏处。但是,如果您选择将其发送到 127.0.0.1,那也没关系。

回到你的问题,数据包是否被发送到套接字。这取决于 - 如果您正在监听 INADDR_ANY,那么它可以发送到服务器。如果您只监听特定地址(比如您的以太网适配器的地址),则发送至 .

要将数据包传送到套接字 - 给定地址上必须有一个 'connected' 或 'listening' 的套接字。大体上就是这样。

希望对您有所帮助。

操作系统有某种形式的 "loopback device",在主机与自身通信时使用。在 Linux 上,您可以明确地将其视为 lo 设备:

# ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 172.16.5.202/24 brd 172.16.5.255 scope global eth0

当您向 127.0.0.1 发送数据包时,它确实会通过此设备。它将由您的套接字 API 调用正常处理,在套接字缓冲区中消耗 space 直到被处理,就像它来自 "the Internet".

首先,寻址到本地分配的 IP 的数据包,即使不是环回,也由网络堆栈在内部管理,不会发送到网络。

看来问题本身就有点混乱

客户端打开与服务器的连接,连接建立后,在服务器端创建一个新的套接字并返回给服务器应用程序。如果与 127.0.0.1(环回地址)中的服务器建立连接,则服务器需要侦听地址 127.0.0.1 或 INADDR_ANY,它将接收数据报并可以建立连接。如果服务器只监听 127.0.0.1,它将不会收到来自外部的消息。

Sockets只是操作系统提供的处理不同协议的接口。当客户端将消息发送到服务器时,它通过套接字发送消息,然后将其发送到内核网络堆栈,后者在 IP 层查看目标地址并决定如何处理该数据报。如果它转到环回或本地分配的地址,它将在内部将数据报传递到适当的数据结构以在连接的另一端接收:服务器中的接受系统调用返回的套接字,如果它是已建立的连接。

这些数据报永远不会进入 NIC,也永远不会发送到网络。