ping命令的实现

4-16 749 views

1.ping 的原理


 

ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。ping 使用的是ICMP协议它发送icmp回送请求消息给目的主机ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。
 
2.那么首先第一个问题就很容易出现:为什么要使用icmp协议作为传输的协议呢?

ICMP 是(Internet Control Message Protocol)Internet 控制报文协议。它是 TCP/IP 协议族的一个子协议,用于在 IP 主机、路由器之间传递控制消息。

控制消息有:目的不可达消息,超时信息,重定向消息,时间戳请求和时间戳响应消息,回显请求和回显应答消息。

ping 命令使用回显请求和回显应答消息。具体表现是向网络上的另一个主机系统发送 ICMP 报文,如果指定系统得到了报文,它将把报文一模一样地传回给发送者。

3.ICMP的格式


 

回显请求报文其中类型为 0,代码为 0。

回显应答报文其中类型为 8,代码为 0。

校验和字段:包括数据在内的整个 ICMP 协议数据包的校验和

标识符字段:用于唯一标识 ICMP 报文,本项目使用程序的进程 id。因为如果同时在两个命令行终端执行 ping 命令的话,每个 ping 命令都会接收到所有的回显应答,所以需要根据标识符来判断回显应答是否应该接收。

序号字段:ICMP 报文的序号。

数据字段:也就是报文,本项目中我们将发送报文的时间戳放入数据字段,这样当接收到该报文应答的时候可以取出发送时间戳,将接收应答的时间戳减去发送时间戳就是报文往返时间(rtt)。提前预告一下,这里使用gettimeofday()API函数获取时间戳,详细介绍会在函数介绍部分说明。

ICMP的数据结构在C语言中的定义如下:

系统发送ICMP报文时会将ICMP报文作为IP的数据,也就是放入IP报文格式的数据字段,IP报文格式如下图所示:

ip报文在C语言中的数据结构定义:

4.icmp命令为什么属于ip层(网络层)?


这是因为ICMP报文在发送给报文接收方时可能要经过若干子网,会牵涉到路由选择等问题,所以ICMP报文需通过IP协议来发送,是IP层的。
 
5.地址信息表示

sockaddr_in与sockaddr是可以互相转换的

6.函数介绍


7.代码实现


 

 

 

学习笔记(2)-Linux文件与目录管理

1.目录与路径 ①相对路径与绝对路径 这个自然很简单啦。 相对路径:根据当前文件的位置来写路径。 绝对路径:路径的写法一定从根目录开始。 一般来说,在写程...

阅读全文

学习笔记(1)-文件权限与目录配置

1.Linux文件属性 首先我们用ls -al来显示出文件的列表         ①.第一列代表文件的属性和权限。           总共有10个字符,           第一个字符代表的是...

阅读全文

欢迎留言

*