网络安全学习第10篇 - ping程序的实现,抓包分析ping数据包以及ping工具对于网络安全方面的威胁

本文探讨了如何实现简单的ping功能,通过分析ping.cpp代码来判断目标主机的可达性。同时,利用Wireshark进行ICMP协议的抓包,识别ping请求与响应数据包,揭示了ping在网络安全中可能带来的DoS攻击风险。
摘要由CSDN通过智能技术生成

请结合附件:Ping的实现原理与ping.cpp的内容,编写一个程序,使其能够实现简单的ping的功能,即判断目标网站是否可以连接,然后通过Wireshark进行抓包分析其ICMP协议,指出哪个数据包是ping的请求(request),哪个数据包是对这个请求的回应(reply)(如果reply数据包存在的话)。


 

相关知识:

 

ICMP (Internet Control Message Protocol) Internet控制报文协议,它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息(即提供TCP/IP网络上设备、服务协议及路由器可用性的信息),ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告,目的是为了更有效地转发IP数据报和提高交付成功的机会。

注:控制消息指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

ICMP的两个主要应用是PingTraceroute

需要编写程序,实现简单的ping的功能,主要需要了解以下内容:

要点1ICMP协议相关知识

ICMP不是高层协议,而是IP层的协议。ICMP报文是装在IP数据报中,作为其中的数据部分

ICMP报文的格式

ICMP协议的类型码与代码根据不同情况,各自取值。8bits类型和8bits代码字段:一起决定了ICMP报文的类型,常见的有:

A.类型8、代码0:回射请求。

B.类型0、代码0:回射应答。

C.类型11、代码0:超时。

ICMP报文的前4个字节是统一的格式,共有三个字段:即类型、代码和检验和。接着的4个字节的内容与ICMP的类型有关。(这8个字节为ICMP报文的首部)

ICMP报文的种类

从类型值来看ICMP报文可分为二大类:

A.差错报告报文

类型值

ICMP报文类型

描述

3

终点不可达

当路由器或主机不能交付数据报 时就向源点发送终点不可达报文

5

改变路由(Redirect)

路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)。

11

时间超过

当路由器收到生存时间为零的数据报时,除丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文

12

参数问题

(Parameter Problem)

当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。

B.询问报文

类型值

ICMP报文类型

描述

80

回送(Echo)

请求(Request)或回答(Reply)报文

ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。

13或14

时间截(Timestamp)请求或回答

ICMP时间戳请求报文是请某个主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日到当前时刻一共有多少秒。可用来进行时钟同步和测量时间

要点2IP地址的点分十进制表示

机器中存放的IP地址是32位二进制代码。以8位为一组,采用点分十进制记法可以进一步提高可读性,如图所示:

在实验代码中,使用到的两个函数inet_addr()和Inet_ntoa()完成的就是32位二进制表示的IP地址与点分十进制记法之间的转换:

inet_addr函数(点分十进制->32位二进制)需要一个字符串作为其参数,该字符串指定了以点分十进制格式表示的IP地址(例如:192.168.0.16)。而且inet_addr函数会返回一个适合分配给S_addr的u_long类型的数值。

Inet_ntoa函数(32位二进制->点分十进制)会完成相反的转换,它接受一个in_addr结构体类型的参数并返回一个以点分十进制格式表示的IP地址字符串

注:在vs2013以上的版本会出现这个两个无法使用的错误信息及相对应的解决方法如图所示:

这两个函数是随IPv6出现的新函数,对于IPv4地址和IPv6地址都适用。对比与使用方法可参见:https://blog.csdn.net/gujintong1110/article/details/45390653

要点3:校验和的计算(具体实现可参见参考代码ping.cpp)

在发送数据时,为了计算数据包的检验和。应该按如下步骤:

1.把校验和字段设置为0;

2.把需要校验的数据看成以16位为单位的数字组成,依次进行二进制反码求和;

3.把得到的结果存入校验和字段中

在接收数据时,计算数据包的检验和相对简单,按如下步骤:

1.把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段;

2.检查计算出的校验和的结果是否为0;

3.如果等于0,说明被整除,校验和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。

注:IP、ICMP、UDP和TCP报文头都有检验和字段,大小都是16bit这四种报文的校验和算法一样,但是在作用范围存在不同:

IP校验和只校验20字节的IP报头;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值