ping源代码完全解析
--------------------------------------------------
author: Zero1,lingyi.pro#163.com
date: 2008-04-27
--------------------------------------------------
目录
-------------
1.相关知识
2.相关数据结构
3.相关函数
4.代码分析
5.小结
1.相关知识
-----------
ping命令可以查看一个系统到另一个系统是否可达,即判断网络连接是否正常。它的工作原理是:向网络上的另一台主机发送ICMP报文,并等待ICMP回显应答(ECHO_REPLY);如果目标系统接收到ICMP报文,它将返回给发送者一样的报文;同时ping可以计算这两台主机间的往返时间,以表明两主机间的距离。
ps:当然现在有些主机为了隐藏自己,对于ping发送来ICMP报文不返回回显信息。
想要深入了解ping的工作原理,还得了解ping命令所使用的TCP/IP协议。
ICMP(Internet Control Message Protocol,网际控制报文协议)是为网关和目标主机提供的一种差错控制机制,使它们在发生差错是把错误信息报告给源发送方(source sender)。ICMP协议是IP层的一个协议,但是由于差错报告发送会源发送方的过程中可能要经过若干子网,因此牵扯到路由选择问题,所以ICMP报文通常有IP协议来发送。于是ICMP数据报发送前需要进行两次封装:首先添加ICMP报头形成ICMP报文,再添加IP报头形成IP数据报,如下图所示
----------------
| IP报头 |
|---------------------|
| |----------------| |
| | ICMP报头 ||
| |-----------------| |
| | |------------| | |
| | | ICMP数据报 | | |
| | |------------| | |
| |-----------------| |
|---------------------|
由于IP协议是一种点对点的协议,而不是端对端的协议,它提供无连接的数据包服务(通常使用UDP协议),所以不需要bind()和connect()函数来绑定和连接端口。用sendto()函数来发送数据报,接收数据使用recvfrom()函数。(更多信息参看socket编程相关资料)
2.相关数据结构
----------------
2.1 IP报头格式
IP报头格式:版本号(4bit),IP报头长度(4),服务类型(8),数据报长度(16),报文标志ID(16),报文标志F(3),分段偏移量(13),生存时间(8),协议号(8),报头校验和(16),源地址(32),目的地址(32),任选项和填充位(若干)。示意图如下:
--------------------------------------------------------------------------
| 版本号VER(4) | IP报头长度IHL(4) | 服务类型TOS(8) | 数据报长度TL(16) |
|------------------------------------------------------------------------|
| 报文标志ID(16) | 报文标志F(3) | 分段偏移量 F0(13) |
|------------------------------------------------------------------------|
| 生存时间(8) | 协议号PORT(8) | 报头校验和(16) |
|------------------------------------------------------------------------|
| 源地址(32) |
|------------------------------------------------------------------------|
| 目的地址(32) |
|------------------------------------------------------------------------|
| 任选项和填充位(若干) |
--------------------------------------------------------------------------
根据IP报头格式信息,可定义IP报头格式数据结构如下(更详细请阅读<netinet/ip.h>):
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)