TCP/IP协议之ping和traceroute
Ping程序就是调用的就是ICMP报文。利用的是ICMP的应答和回显请求。来看下具体的ping报文。 Request的报文类型为8

Reply的类型为0

通过具体的ping报文可以看到ping报文的大小为84字节。其中ICMP报文56个字节,再加上20个字节的IP首部和8个字节的ICMP首部。因此IP报文的总长度为84字节

我们也可以改变ICMP的报文大小,通过-s命令。Ping www.sina.com.cn –s 32. 将ICMP报文大小设置为32字节。加上20字节的IP首部以及8字节的ICMP首部,总共60个字节

Ping程序中还可以通过设置ping的次数,通过-c。ping www.sina.com.cn –c 3.在ping了3次以后,ping程序自动停止

其他ping的字段设置可以通过man ping查看,一般用的最多的就是-s和-c。
IP记录路由选项:ping程序还可以记录所经过路径的IP地址。这个通过-R的方法来实现。Ping程序在发送出去的IP数据报中设置IP RR选项。这样每个处理该数据报的路由器都把它的IP地址放入选项字段中。当数据包达到目的端时,IP地址清单就复制到ICMP回显应答中。当ping程序收到回显应答时,它就打印出这份IP地址清单。
数据格式如下:由于IP首部中的首部长度字段只有4bit,因此IP首部最长只能包含15个32bit的字=60字节。IP首部为20个字节。RR选项用去3个字节。这样只剩下37个字节来存放IP地址清单,一个IP地址为4个字节,因此最大也就只能存放9个IP地址。在当前的互联网场景下,9个IP地址太少了。一半情况下都满足不了要求

结果显示如下,我们用ping局域网192.168.0.1的例子来看,首先显示的是去的路径192.168.0.8->192.168.0.1然后是回来的路径192.168.0.1->192.168.0.8

Traceroute:
前面讲到IP可以记录路由选项。但是IP首部中留给选项空间有限,不可能存放太多的路径,最多只能存放9个地址,对于现在的网络来说远远不够,那么如果我们想探究网络路径可以用traceroute命令。
Traceroute主要运用的是ttl原理
1 首先第一个包发出,ttl为1. 由于目的路由器为将ttl减一,因此返回ICMP超时给主机,记录返回的路由地址
2 然后主机继续发出ICMP报文,设置ttl为2,这样在经过第二个路由器的时候,返回ICMP超时给主机。记录返回的路由地址
.。。。。。。
一直重复这个过程,每次都将ttl在上一次的基础上加一,直到达到目的地。这样就可以记录所有经过的路由地址
但是在windows和linux下命令名称不一样,而且实现方式也不太一样
Windows下用的命令是tracert,linux下用的是traceroute
实现方式来说:
Windows下使用的是ICMP报文,而linux下使用的是UDP报文。这个有什么区别呢
看下windows下的结果:

Linux下的结果:

从最终的执行结果来看,看不出什么差异,
继续看下报文的结果,首先来看windows下的
从报文中可以看出ttl不断的在增长。

而且主机发出的报文全都是ICMP报文。

Linux下的报文可以看到主机发出的报文都是UDP报文,而且每个报文都带有一个目的端口,端口每次都在增长。

带的是一个UDP报文,而非ICMP报文

但是从对端反馈回的报文都是ICMP报文。且最终目的地址反馈一个port unreachable的报文。这个端口不可达的报文在windows系统中并没有找到。

从上面的报文对比可以看到windows下和linux下的traceroute报文是不一样的。Windows下是纯粹使用ICMP报文。直到找到目的地址,并记录经过的路径
而linux下是发出一个UDP报文。且同样也设置TTL时长,但选择一个不可能的值作为UDP端口(大于30000),使目的主机的任何一个应用程序都不可能使用这个端口。最终目的主机会产生一份端口不可达的错误。此时就判断结束。具体流程参考下图

TCP/IP协议之ping和traceroute的更多相关文章
- TCP/IP协议学习之实例ping命令学习笔记
TCP/IP协议学习之实例ping命令学习笔记(一) 一. 目的为了让网络协议学习更有效果,在真实网络上进行ping命令前相关知识的学习,暂时不管DNS,在内网中,进行2台主机间的ping命令的整个详 ...
- Android网络编程系列 一 TCP/IP协议族之网际层
这篇借鉴的文章主要是用于后续文章知识点的扩散,在此特作备份和扩散学习交流. 网际层包括:IP.ICMP.IGMP 以及处在网际层实际工作在链路层的 ARP 和 RARP等等协议. 1.IP协议 互联网 ...
- 【转载】TCP /IP协议详解
首先,TCP/IP不是一个协议,而是一个协议族的统称. 里面包括了IP协议,IMCP协议,TCP协议,以及http.ftp.pop3协议等等. TCP/IP协议分层 提到协议分层,我们很容易联想到IS ...
- 网络基础知识-TCP/IP协议各层详解
TCP/IP简介 虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Micro ...
- 网络编程基础之C/S架构和TCP/IP协议
一.何谓C/S架构 C指的是client(客户端软件),S指的是Server(服务端软件),既然我们的的标题是网络编程基础, 那我们就一起来学习怎样写一个C/S架构的软件,实现服务端与客户端软件基于网 ...
- TCP /IP协议详解【转】
转自:https://www.jianshu.com/p/0cf648510bce?utm_campaign=maleskine&utm_content=note&utm_medium ...
- 【Linux网络基础】TCP/IP协议簇的详细介绍(三次握手四次断开,11种状态)
一.TCP/IP协议簇(DoD参考模型) 用于简化OSI层次,以及相关的标准. 传输控制协议(tcp/ip)簇是相关国防部DoD所创建的,主要用来确保数据的完整性以及在毁灭性战争中维持通信 是由一组不 ...
- TCP/IP协议学习-1.概述
目录 TCP/IP协议概述 分层 延伸知识 FTP例子 为什么需要网络层和传输层 TCP/IP的分层 封装 分用 总结 本文主要摘抄自书籍<TCP/IP详解卷一:协议>与TCP协议相关内容 ...
- 003 TCP/IP协议详解(二)
一.ping ping可以说是ICMP的最著名的应用,是TCP/IP协议的一部分.利用"ping"命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障. 例如:当我们某一 ...
随机推荐
- map | make_pair
#include <map> void func(std::map<int,std::pair<const char*,int>> &T_map) { st ...
- mysql revise
DATABASE create database db_name; use db_name; alter database db_name; drop database db_name; show d ...
- Redis 集群搭建详细指南
先有鸡还是先有蛋? 最近有朋友问了一个问题,说毕业后去大城市还是小城市?去大公司还是小公司?我的回答都是大城市!大公司! 为什么这么说呢,你想一下,无论女孩男孩找朋友都喜欢找个子高胸大的.同样的道理嘛 ...
- NodeJS 实现手机短信验证 模块阿里大于
1,NodeJS 安装阿里大于模块 切换到项目目录使用npm 安装阿里于模块 npm i node-alidayu --save 2,aliyu官网使用淘宝账户登录 登录阿里大于 https://do ...
- 解决(防止)DDOS攻击的另一种思想
本方案适合作最后的处理方案. 在服务器遭到DDOS攻击后,防火墙.高防盾或者其他的方案都已经失去了效力,这时运维人员无任何方案可以处理,并且只能任由DDOS攻击或关闭服务器时,该方案可以有限的抵挡大部 ...
- Go - concurrency
并发 vs 并行 首先,我们先来搞清楚概念以及并发和并行的区别. 并发 - 利用时间片切换来实现“同时”运行的. 并行 - 利用CPU的多核来实现通过多线程来实现同时运行. Go 语言的设计理念就是通 ...
- 设置Ubuntu下adb 及 fastboot权限
以普通用户登录linux,然后运行adb devices会提示权限不够: List of devices attached ???????????? no permissions 这是因为 ...
- angularJS directive详解(自定义指令)
Angularjs指令定义的API AngularJs的指令定义大致如下 其中return返回的对象包含很多参数,下面一一说明 1.restrict (字符串)可选参数,指明指令在DOM里面以什么形式 ...
- js关闭当前窗口,window.close()方法只能是window.open打开的才能执行关闭
js关闭当前窗口,window.close()方法只能是window.open打开的才能执行关闭. function closeWin() { //open(location, '_self').cl ...
- XMLHttpRequest函数封装
XMLHttpRequest函数封装: function ajax(Url,sccuessFn,failureFn) { //1.创建XMLHttpRequest对象 var xhr = null; ...