ping源代码完全解析(1)


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>):

 
/****************************
*  计算icmp校验和算法
*  2008-05-02
* *************************
*/


unsigned 
short  chksum(addr,len)   
    unsigned 
short   * addr;   /* 校验数据开始地址(注意是以2字节为单位) */    
    
int  len;                 /* 校验数据的长度大小,以字节为单位 */
{  
    
int sum = 0;        /* 校验和 */   
    
int nleft = len;    /* 未累加的数据长度 */   
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值