Ping程序的实现
Ping程序的实现
在windows系统下进行cmd可以进行ping操作。
ping命令是用来确定本地主机与网络中其他主机的网络通信情况,或者查看是否是为效IP。
ping的工作原理:网络另一主机发送ICMP报文,通过返回信息判断网络连接状况。没有通过运输层的TCP或者UDP
可以看到ping的返回信息中有一个值为TTL(time to live)表示ping程序发送的ICMP数据包的生存周期,没经过一个网段,TTL减1,当其值被减到0时,改数据包将被丢弃,该数据包的源地址被告知的情况下,以重新发送数据包。不同的操作系统TTL值不同,Linux64,Windows??(不确定)
ping的流程:
- 创建通信套接字
- 将地址、端口信息于套接字绑定
- 构建IP包头与ICMP包头
- 发送构建数据包
- 接收对方主机回应
- 给出程序反馈信息
补充
ICMP协议:
即网际控制报文协议,可在网络中实现主机探测,路由维护、路由选择和流量控制。
由于IP协议没有机制来获取网络错误信息以及对错误进行处理,所以需要一个协议—ICMP协议来解决这个问题,ICMP是IP层的一部分,用于传输差错报文及控制报文,遇到错误时能把错误报告给源发送方,ICMP报文是封装在IP数据报内部。
ICMP包头格式:
ICMP报文分为两种,一是差错报告报文,二是查询报文。每个ICMP报头均包含类型(8B)、编码(8B)、校验(16B)三项内容。其余选项岁ICMP功能不同而不同。
ping命令只适用众多ICMP报文中的两种:“回送请求(ICMP_ECHO)”和“回送回答报文(ICMP_ECHOREPLY)”,往返的ICMP报文中都有时间戳。
参考:http://blog.csdn.net/petershina/article/details/8571562
http://blog.chinaunix.net/uid-20321537-id-1966835.html
Ping程序的实现的更多相关文章
- TCP协议学习记录 (二) Ping程序
简单的实现了一个ping程序,没有做icmp差错报文的检查. 支持自定义字节数,支持发包个数 #pragma pack(4) #define ECHO_REQUEST 8 #define DATASI ...
- 计算机网络(5)-----ICMP协议和PING程序
控制报文协议(Internet Control Message Protocol) 定义 它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制消息.控制消息是指网络通不通.主机是否可 ...
- TCP/IP详解之:Ping程序、Traceroute程序
Ping程序: ping程序是通过发送一份ICMP回显请求报文(即ICMP报文的一种,其类型为8,代码为0)给主机,并等待返回ICMP回显应答 来测试另一台主机是否可达. ping程序不用经过传输层, ...
- 用C语言实现Ping程序功能
本文转载自:http://www.ibm.com/developerworks/cn/linux/network/ping/ ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具.p ...
- 第7章 Ping程序和traceroute程序
Ping程序 ping程序编写的目的是为了测试另外一台主机是否可达.程序发送的是一份ICMP回显请求报文给目的主机,并等待ICMP回显应答. 一般的TCP/IP实现都在内核中直接支持ping服务器—— ...
- Ping程序
一.概述 Ping程序是对两个TCP/IP系统连通性进行测试的基本工具.该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答. 二.格式 大多数TCP/IP实现都在内核中直接支持Pin ...
- 用C语言实现Ping程序功能---转
ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具.ping命令的工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把报文一模一样地传回给发送者,这 ...
- TCP协议学习记录 (三) Ping程序 RR选项 记录路由hop
一开始想直接在上个程序改,自己构造IP包头,但后来发现不行,微软不让干了,所以后来选用libcap库来收发包 代码写的很乱.. #pragma pack(4) #define ECHO_REQUEST ...
- 003.同时Ping多个IP(select实现IO复用,信号计时),ping程序升级版
写这个的目的主要是为了以后的方便: 1.信号计时函数的使用 2.ip头的构建和icmp头的构建 3.selec函数t的用法 代码实现: /src/ping.h /* * ping.h * * Crea ...
随机推荐
- js遍历数组和遍历对象
可以用for in来遍历对象,具体内容如下: <script type="text/javascript"> var objs = { ...
- Java继承,重写方法时改变方法的访问权限
java中的方法天生具有继承多态特性,这点与C++有很大不同(需要在父类方发上加virtual关键字),但用起来确实方便了许多. 最简单的继承多态 声明一个接口BaseIF,只包含一个方法声明 pub ...
- path变量修改后无法保存
Eclipse启动时出现错误: A Java Runtime Environment (JRE) or Java Development Kit(JDK) must be available in o ...
- Django 2.0 学习(21):Django Session
Django Session Session 与Cookie 1.简介 1.Cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们又需要"保持状态",因 ...
- JAVA相关概念(一)
依赖注入和控制反转 首先,这两个词是同一个概念的不同角度的说法,依赖注入感觉是对描述了如何实现,而控制反转则像是描述了一种思想. 依赖注入的流行可以说是由spring的流行带动的,只要是做过sprin ...
- C#:system.collections.generic(泛型)
1. array是一个固定长度的,如果要动态的存储的话就不行了,虽然 System.Collections.ArrayList(),是一个动态的存储的容器,但是没有对存储中的数据进行一个约束,所以非泛 ...
- js浏览器缩放提示
data() { return { instance: null, isZoomOpen: false }; }, mounted() { const that = this; this.isZoom ...
- log4net日志文件的应用
日志作为快速定位程序问题的主要手段,日志几乎是所有程序都必须拥有的一部分,下面我们就看下怎么使用log4net.dll文件: 1.下载log4net.dll文件 2.创建自己的项目 3.在自己项目下的 ...
- Discrete Square Roots UVALive - 4270(拓展欧几里得)
a≡b(mod n)的含义是“a和b除以n的余数相同”,其充要条件是“a-b是n的整数倍”: 求所有满足条件r^2=x(mod m)的r 题目已经给定了一个初始的r,x,m #include < ...
- 【BZOJ4006】管道连接(动态规划,斯坦纳树)
题面 BZOJ 洛谷 题解 和这题区别不是很大吧. 基本上拿过来改一下就做完了. #include<iostream> #include<cstdio> #include< ...