帧中继环境下Ping的实现
帧中继环境下Ping的实现
一. ICMP协议和Ping 命令
为了让互联网中的路由器报告错误或提供有关意外情况的信息,TCP/IP中加入了一个特殊用途的报文机制。这个机制叫做Internet控制报文协议ICMP(Internet Control Message Protocol),它是IP的一部分,并在每个IP实现中必须有它。最初的设计虽然是为了允许路由器向主机报告投递出错的原因,但是ICMP并没有限制仅在路由器上使用。尽管限制某些ICMP报文的使用,但是任一台机器可以向任何其他机器发送ICMP报文。因此,主机可以使用ICMP与路由器或另一台主机通信。
当一台主机创建了一个I P 数据报时,主机会产生一个覆盖整个头部的校验和。无论何时收到一个数据报,校验和都被用于验证头部是否无损地到达。为了验证校验和,计算机对接收到的数据报的整个头部(包括校验和域)重新计算校验和。如果I P 头部中的某一位在传输过程中被破坏,则计算出的校验和不为零。当改变头部中的域时(例如将生存时间TIME TO LIVE 域递减),路由器必须在转发该数据报前,重新计算校验和。
发现校验和错时的处理非常简单:数据报必须立即丢弃,而不作进一步的处理。接收者不能相信数据包头部中的任何域,因为接收者不知道哪一位被改变了。甚至也不能发一个出错消息给发送者,因为接收者不能相信包头中的源地址。同样,接收者也不能转发被损坏的数据包,因为它也不能相信包头中的目的地址。因此,接收者除了将被损坏的数据包丢弃外别无选择。
ICMP报文是放在一个IP数据报的数据部分中通过互联网的。ICMP报文的最终目的不是一个应用程序或是目的机器上的用户,而是该机上处理它的Internet协议软件模块。总之,ICMP在两台机器上的Internet协议软件之间提供了通信。
ICMP中的回送请求(echo request)和回送应答(echo reply)报文为网络管理者或用户提供了一个识别网络问题的调试工具。主机或路由器向指定目的站发送ICMP回送请求报文,任何收到回送请求的机器形成回送应答并把它返回最初的发送者。回送请求包含一个可选数据区;应答包含了在请求中所发送数据的一个拷贝。回送请求及其关联的应答可用来测试目的站是否可达和是否响应。因为请求和应答都是在IP数据报中传送的,所以应答的成功接收就证实传送系统的主要部分是正常的。
在许多系统上,用户所使用的发送ICMP回送请求的命令叫做Ping。较复杂的Ping的发送一系列ICMP回送请求,捕获响应并提供丢失数据报的统计。不太复杂的版本仅仅发送一个ICMP回送请求并等待应答。
二. IP和ICMP报文格式
ICMP回送请求和回送应答报文格式如下:
IP报文格式如下:
程序中利用函数CheckSum()来计算和验证IP的首部校验和以及ICMP的校验和。将要计算校验和的数据部分看作为一个16位的整数序列,并定义校验和是数据中所有16位整数的和的二进制反码。在函数CheckSum()中使用了32位(长)算法来累加得到一个和,然后通过向这个整数和中增加所有进位位的方法,将结果折合成一个16位的值。最后,CheckSum()返回结果的反码。注意,每次调用CheckSum()计算校验和之前,要先将校验和域清空,再计算赋值。
三. 程序思路
该实验的实现是在只是前面提到的ARP/InARP的基础上增加了对Ping的处理,仍然采用多线程结构,实现互斥操作。
在主线程中,增加了用户可以使用Ping命令,并做出相应处理。写线程仍然是从数据包队列中取出一个数据包,并在写事件到来时将其发送出去。 读线程在读取一个数据包后判断其包类型时,增加了对ICMP回送请求和回送应答的处理。
四. 主要的数据结构
Ping的实现是ARP/InARP实现的基础上增加了以下一些数据结构:
struct S_PING_PKT
// 定义了Ping报文的格式,包括帧中继报文头,
// IP数据报头,ICMP报文格式;
/
{
//FrameRelay head
unsigned char frameHead[2];
// IP head
unsigned char ip_ver; // 0x45
unsigned char ip_tos; // 0
unsigned short ip_tl; // 0x0020
unsigned short ip_id;
unsigned short ip_ffo; // 0x0000
unsigned char ip_ttl; // 32
unsigned char ip_pro; // 1
unsigned short ip_chk;
unsigned char ip_sip[4];
unsigned char ip_tip[4];
// ICMP head
unsigned char type; // 8=echo request 0=Echo reply
unsigned char code; // 0
unsigned short chk;
unsigned short id;
unsigned short seq;
//可选数据
unsigned char data[32];
};
struct S_pingState; //用于记录发送出去的Ping报文的状态信息,包括Ping的目的IP地址,该报文是否已发送,是否已经接收到应答;
六. 程序结构与主要流程
(1) 主线程: 接收用户输入,在用户使用Ping命令时,将用户输入的目的IP地址存放到S_pingState结构中去,调用函数SendPing()
函数SendPing()实现如下:
(2) 读线程
函数handlePingRequest():
生成一个相应的回送请求,并暂存到待发送数据队列中
函数handlePingReply():
根据收到的应答的序列号,将相应的S_pingState中的已接收标志置为1
七.程序中其他一些处理
1. 并发控制:由于本程序是一个多线程的程序,多个线程运行时是共享代码和数据的。如果不对这种共享作一些控制的话肯定会出现不可预料的结果。本程序对并发的处理采用 MFC 中的并发锁机制,由于线程会共享的数据被封装在两个类里面(C_QUEUE_INFO和C_DLCI_INFO),线程操作数据都是通过这两个类的实例进行的,所以只要在两个类的代码里实现并发锁就可以了。
2. 需要特别注意的是数据链路帧的帧头不是固定的,有的情况下(发送配置类原语)是8个字节,真正发送数据的时候是2个字节。
3. 协议中对数字的处理可能会和大家最初设想的很不一样。譬如主机的IP地址,大家很可能会认为是和标准Socket里面那样是一个以网络字节序存储的结构体来表示的,结果经过分析发现不是,而是用了四个字节,每个字节存储相应的点分十进制数字。如 100.1.1.1 在协议数据包中是这样构成的:[100] [1] [1] [1],其中[ ]表示一个字节。
4. 校验和的处理也很奇怪。传输时也不是采用网络字节序,而是采用了位串的方式。
参考资料:
RFC791, J. Postel. Internet Protocol, Sep-01-1981.
RFC826, D.C. Plummer. Ethernet Address Resolution Protocol, Nov-01-1982.
RFC1293, T. Bradley, C. Brown, Inverse Address Resolution Protocol. January 1992.
RFC1294, T. Bradley, C.Brown, A. Malis. Multiprotocol Interconnect over Frame Relay. January 1992.
CCITT X.36
附录:
A. 帧中继的一些原语
#define DL_DATA_IND 4
#define DL_DATA_REQ 4
/*
ID (04)
DSAP
USER_DATA
*/
#define NUM_DL_PARA 12
#define DL_PARA_REQ 7
#define DL_PARA_IND 7
/*
ID (07)
DSAP
..........
**********
PARA
VALUE_LOW
VALUE_HIGH
**********
..........
*/
/* ------------PARA TABLE--------------
PAR 1: CONFIG
BIT 0: 1-ON,0-OFF
BIT 1: 1-LMI:Q.933 Annex A, 0-LMI:NONE
PAR 2: FIRST_DLCI
PAR 3: NUM_DLCI
PAR 4: NUM_PVC
PAR 5: N203
PAR 6: N391
PAR 7: N392
PAR 8: N393
PAR 9: T391
PAR 10: T392
PAR 11: BAUD RATE
0---XXX
1---XXX
2---XXX
3---75
4---150
5---300
6---600
7---1200
8---2400
9---4800
10---9600
11---19200
12---48000
13---64000
14---128000
15---256000
PAR 12:CLOCK 1-INTER; 0-EXTERN */
CONFIG: 3--使用Q.933协议中附件A的链路管理协议 (缺省值)
1--不使用上述链路管理协议
DLCI NUM: 永久虚电路的个数
FIRST DLCI: 第一条永久虚电路的DLCI编号,缺省为16
N391: 完全状态(所有PVC状态)轮询计数器
N392: 差错/恢复计数器(N392应小于或等于N393)。
N393: 事件监测计数器(如果N393置为一个比N391小很多的值, 则链路可能在差错和无差错状态之间切换而未能被DTE或网络觉察)。
T391: 链路完整性校验轮询计时器
T392: 轮询校验计时器
#define DL_WIND_IND 8
/*
ID (08)
DSAP
WIND_SIZE
*/
#define DL_PERMIT_REQ 9
/*
ID (09)
DSAP
PERMIT_SIZE
*/
#define DL_STATE_IND 10
/*
ID (10)
DSAP (0)
STATE
**********
DSAP
DLCI_LOW
DLCI_HIGH
STATE : 0---NOT READY 1---READY
**********
*/
B. 物理层原语
VL3-X25规程控制卡向高层提供了按X.211建议设计的网络服务原语。当VL3-X25规程控制卡设置成物理模式时可以使用这些原语。VL3规程控制卡原语用VL3规程控制卡驱动程序作为数据块发送和接收。用户把每个原语看成一个数据块,交给VL3规程控制卡驱动程序,VL3规程控制卡控制卡驱动程序也把原语以数据块的形式交给用户。
PH_ACT_REQ激活请求、PH_ACT_IND激活指示
格式
ID (01)
说明
PH_ACT_REQ用于激活物理链路,PH_ACT_IND用于指示物理链路已激活。
PH_DEACT_REQ撤消请求、PH_DEACT_IND撤消指示
格式
ID (02)
说明
PH_DEACT_REQ用于撤消已激活的物理链路、PH_DEACT_IND用于指示物理链路已撤消。
PH_DATA_REQ数据请求、PH_DATA_IND数据指示
格式
ID (03)
USER_DATA
说明
PH_DATA_REQ用于发数据,PH_DATA_IND用于指示收到的数据。
PH_PARA_REQ参数请求、PH_PARA_IND参数指示
格式
ID (04)
.....................
*********************
PARA
VALUE_LOW
VALUE_HIGH
*********************
.....................
说明
PH_PARA_REQ用于设置或读出参数。当原语没有参数字段时从VL3规程控制卡中读出参数。否则设置新的参数值。参数的编号和意义如下表。
转载于:https://www.cnblogs.com/ericgqs/archive/2005/11/09/272634.html
帧中继环境下Ping的实现相关推荐
- 帧中继环境下NBMA模式的配置
帧中继环境下NBMA模式的配置 1. 实验目的: 通过本次的实验,我们可以掌握如下技能 1) 帧中继静态映射及其broadcast参数的含义. 2) NBMA模式下的DR ...
- 帧中继环境下ospf的使用(点到点模式)
一:实验目标: 掌握帧中继的网络环境下ospf的配置. 二:实验拓扑: 三:实验配置 (1) 对R2的配置<?xml:namespace prefix="o">?xml ...
- 帧中继环境中NBMA模式下OSPF的配置
帧中继环境中NBMA模式下OSPF的配置 在帧中继服务器添加端口 R1(config)#int s1/0 R1(config-if)#ip add 172.16.134.1 255.255.255.0 ...
- 在windows11环境下如何通过主机名ping通其它系统
在windows11环境下如何通过主机名ping通其它系统 (1)host映射 [1]说明 [2]应用 (2)修改windows11下的hosts 文件 [1]管理员身份打开记事本 [2]在记事本中打 ...
- linux环境下常用的网络命令ping、telnet、traceroute、tcpdump
文章目录 前言 网络 网络命令 ping telnet nc traceroute tcpdump 总结 前言 因特网(Internet)的前身是美国国防部高级研究计划局(ARPA)用于军事目的的通信 ...
- linux下ipv6地址如何ping,IPv6地址环境下如何使用ping、telnet命令
IPv6地址环境下如何使用ping.telnet命令 日期:2020-08-12 10:46 浏览次数: 分类:知识库 来源:郑州冰川网络技术有限公 本文主要介绍IPV6通信时,IPv6地址的ping ...
- Linux 环境下的抓包工具 - tcpdump
Linux 环境下,通常通过 tcpdump 来进行抓包和分析.它是几乎所有 Linux 发行版本预装的数据包抓取和分析工具. 一.tcpdump 的用法 tcpdump [-aAbdDefhHIJK ...
- hyper-V环境下虚拟机和宿主机之间时钟不统一
hyper-V环境下虚拟机和宿主机之间时钟不统一,一般是多个虚拟的CPU才用. 表现为时间不一致,ping包的延迟突然很大 在boot.ini中加入"/usepmtimer" 转载 ...
- 【网络安全】关于ARP攻击的原理以及在Kali Linux环境下的实现
转自:https://www.cnblogs.com/rebrust/p/6096101.html 全文摘要 本文讲述内容分为两部分,前半部分讲述ARP协议及ARP攻击原理,后半部分讲述在Kali L ...
- Docker容器环境下ASP.NET Core Web API应用程序的调试
本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...
最新文章
- C# MainWindowHandle为0的解决方法
- vue-11-路由嵌套-参数传递-路由高亮
- 的日志在哪里_写给大忙人看的,MyBatis日志如何做到兼容所有常用的日志框架?...
- 哪款浏览器好用_碉堡了!火狐浏览器发布重大更新,谷歌Chrome请hold住!
- irms模拟数据生成及数据分析
- 251f与ips屏显示器对比_不闪屏,HDR,带鱼屏全都有,LG 29WK600宽屏显示器测评
- 阿帕奇骆驼遇见Redis
- linux i2c adapter 增加设备_Linux驱动之I2C驱动架构
- 妈妈培养天才的13绝招
- jdk和jre是什么?都有什么用?
- 10分钟掌握运输问题(一)
- 阳光动力2号太阳能飞机的基本工作原理
- VMware卸载后再安装时网络连接处没有虚拟网卡
- 小米平板1-专用解账号锁激活设备救砖线刷包 一键刷机
- 服务器系统 Windows server 2019 安装与搭建
- 莫队算法+带修莫队+回滚莫队
- OCR+RFID感应识别电子护照阅读器|读卡器MERR100+的 API 接口函数说明
- 设置无线路由器与有线网络在同一网段
- 【文件IO】Linux 文件操作(一) —— 遍历指定目录下的所有文件
- Excel 自动生成排名 RANK函数的使用
热门文章
- js 原生拖拽,返回到原点
- Jquery基础笔记
- Wrong FS: hdfs://......, expected: file:///
- 《工作型PPT设计之道》培训心得
- struts2的struts.properties配置文件详解 (转)
- XML参考 :XmlReader 详解、实例(3)-- 读取XML节点和属性名称
- Linux用apt命令安装软件
- Linux 下自动化脚本安装Jdk、Nginx等软件
- ylbtech-Unitity-CS:AnonymousDelegates
- tar、rpm和yum总结