ping(8) 如何工作?

ping(8) 如何工作?

我正在学习服务器/客户端基础知识,作为我的网络编程技能开发的一部分。

所以基本上我编写了服务器监听某个端口,然后客户端连接到它并且数据流继续......

现在我很好奇,如何ping能够从远程机器接收响应,而没有任何服务响应它?还是我搞错了?

答案1

由于 ping(更准确地说,ICMP 回显请求)是 Internet 协议的一部分,因此您的网络堆栈(即操作系统对该协议的实现)会回答这些请求。

它既不是 TCP,也不是 UDP,也不是任何其他传输协议。在互联网标头中,有一个协议字段,它指示 IP 数据包包含哪种类型的有效负载。对于 TCP 数据包,该字段指示 TCP。对于 ping 数据包,它指示 ICMP。

顺便说一句,这不是 ICMP 的唯一用途。例如,当生存时间如果数据包在网络传输过程中下降到零,则该数据包会被丢弃,并通过 ICMP 数据包通知发送方。

如果你想知道如何ping (8)显示从用户空间收到的 ICMP 回复,它是使用套接字 API 来实现的。这是源代码中的相关部分:

/* Initialize raw ICMP socket */
proto = getprotobyname ("icmp");
if (!proto)
  {
    fprintf (stderr, "ping: unknown protocol icmp.\n");
    return NULL;
  }

fd = socket (AF_INET, SOCK_RAW, proto->p_proto);

答案2

是的,你有点误会了。

当一个ping 请求发送到主机后,根据标准 (RFC 1122),主机必须回复。因此,有一个“服务”响应它。它不是应用程序级服务 - TCP/IP 堆栈本身就是响应的“服务”。

Ping 是无会话的 - 这可能会让您感到困惑。Ping 使用 IP,不需要通过协商建立会话(而 TCP 需要)。当您为班级编写程序时,我敢打赌您是使用 TCP 套接字编写的。

答案3

ping实际上是针对 IP 堆栈本身发出 ICMP 请求,因此机器上的任何服务都不会记录它,但如果您正在运行类似 wireshark 的程序,您可以通过这种方式检测数据包。

相关内容