我正在学习服务器/客户端基础知识,作为我网络编程技能发展的一部分。
所以基本上我写服务器监听某个端口,客户端连接到它并且数据流继续......
现在我很着迷,如何ping能够在没有任何服务响应的情况下接收来自远程机器的响应?还是我在这里弄错了?
wnr*_*rph 10
由于 ping(更准确地说,ICMP 回显请求)是 Internet 协议的一部分,您的网络堆栈(这是您操作系统的协议实现)响应这些请求。
它既不是 TCP 也不是 UDP,也不是任何其他传输协议。在 Internet 标头中,有一个协议字段,用于指示 IP 数据包包含的有效负载类型。对于 TCP 数据包,该字段表示 TCP。对于 ping 数据包,它表示 ICMP。
顺便提一句。这不是 ICMP 的唯一用途。例如,当数据包在网络上传输时其TTL降至零时,它会被丢弃,并且发送方会收到 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);
Run Code Online (Sandbox Code Playgroud)
是的,你有点误会了。
当向主机发送ping 请求时,根据标准 (RFC 1122),主机必须回复。因此,有一个“服务”响应它。它不是应用程序级服务 - TCP/IP 堆栈本身就是“服务”响应。
Ping 是无会话的——这可能会让你感到困惑。Ping 使用不需要通过协商建立会话的 IP(TCP 这样做)。当您为您的班级编写程序时,我敢打赌您是使用 TCP 套接字编写的。
| 归档时间: |
|
| 查看次数: |
1021 次 |
| 最近记录: |