我正在学习服务器/客户端基础知识,作为我的网络编程技能开发的一部分。
所以基本上我编写了服务器监听某个端口,然后客户端连接到它并且数据流继续......
现在我很好奇,如何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 的程序,您可以通过这种方式检测数据包。