C 实现简单的 Ping 程序

By | 2017年8月28日 | 阅读:494 次

前言
最近在复习计算机基础,看到计网第四章 ICMP 的应用 Ping 程序时,好奇是内部细节是怎么运作的,于是参考 IBM Linux 文档库:Ping 的实现 文章,学习下 Ping 的模拟实现

  1. 准备知识
  2. 使用的系统 API
  3. 编码实现

效果图
deping 是模仿实现的 ping 程序


1. 准备知识

1.1 ICMP 协议

ICMP 协议细节参考《计网》4.4 节 和 《TCP/IP卷1》第六章;
ping 程序是使用 ICMP 的询问报文实现的,过程是向特定的主机发出询问,目标主机必须给该源主机发送询问应答报文(可设置为不予理睬),用来测试主机间网络是否连通;

  • 类型字段是 8 (询问请求)或 0(询问应答)
  • 代码字段:唯一标示 ICMP 报文
  • 校验和字段
  • 类型字段
  • 数据字段:发送或响应报文的时间戳

1.2 校验和

  • 不同协议的校验和字段校验的内容不同,但校验方法一样,下边以 IP 数据包的检验为例:

    • IP 协议: 只检验 IP 数据报的头部,不检验数据部分;
    • ICMP 协议:ICMP 依靠 IP 传输,需要自己检验 ICMP 头部和数据;
    • TCP / UDP 协议:12 字节伪首部 + TCP / UDP 报文
  • 假设发送数据如下,发送方计算数据的检验和为 29 18 并写入数据报;

  • 接收方收到数据报后进行校验:求和结果为全 1 则收下数据报,否则丢弃;

1.3 Linux 中的 ICMP 、地址信息数据结构


2. 使用的系统 API

2.1 socket()

2.2 IP 数据报的发送、接收函数

  • sendto()

  • recvfrom()


3. 编码实现


题外话:在 Google Book 上看到《Linux C编程》的示例代码居然和 IBM 2002年的这篇博文一毛一样,国内的技术书真是厉害了。

发表评论

电子邮件地址不会被公开。