Linux 网络协议栈开发番外篇(四)—— Wireshark-ICMP数据报分析
2018-01-24 23:17
1411 查看
ICMP是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。
ICMP协议通过IP协议发送的,IP协议是一种无连接的,不可靠的数据包协议,属于网络层协议。
ICMP报文是在IP数据报内被传输的。在实际传输中的数据包结构:20字节IP首部 + 8字节ICMP首部+ 1472字节<数据大小>38字节。
ICMP报文格式:IP首部(20字节)+8位类型+8位代码+16位校验和+(不同的类型和代码,格式也有所不同)。下面即为ICMP报文格式:
ICMP报文的类型
不同类型由报文中的类型字段和代码字段来共同决定,简单的可以分为两种:即ICMP差错报告报文和ICMP询问报文。
ICMP请求与应答报文 ping
通过ping程序可以发送请求报文,在ping的服务器收到报文后会返回应答报文。
下面是请求应答的报文格式:
让wireshark开始抓包,用icmp过滤,打开cmd窗口,输入ping www.youku.com,就会发现wireshark开始抓取报文,ping默认发4个请求报文,所有这里会抓取到8个报文(请求和应答各4个)。下面查看一个请求报文结构:
再来看一看实际的数据域:
Traceroute工具
Traceroute程序可以让我们看到 I P数据报从一台主机传到另一台主机所经过的路由,它是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。
Traceroute基本原理:这个程序利用报文的TTL信息实现路由的获取。首先主机向目的主机发送一个TTL=1的数据报,当数据报到达第一个路由器时,TTL=0,这时路由器会发送一个ICMP报文返回给主机,说明数据报超时。由此得到第一个路由地址,然后令TTL=2,再次发送一个数据报,会得到第二个路由返回的ICMP,由此一次次增加TTL就可以得到主机到目的主机之间所经过的路由信息。
windows cmd中运行结果
在linux中traceroute是可以选则数据包的类型(-I,-U,-T)分别代表ICMP,UDP,TCP数据包类型。而在windows的cmd中tracert用的是ICMP数据包。实际测试中可能会出现一些问题。
附:
wireshark与对应的OSI七层模型
TCP包的具体内容
从下图可以看到wireshark捕获到的TCP包中的每个字段。
ICMP协议通过IP协议发送的,IP协议是一种无连接的,不可靠的数据包协议,属于网络层协议。
ICMP报文是在IP数据报内被传输的。在实际传输中的数据包结构:20字节IP首部 + 8字节ICMP首部+ 1472字节<数据大小>38字节。
ICMP报文格式:IP首部(20字节)+8位类型+8位代码+16位校验和+(不同的类型和代码,格式也有所不同)。下面即为ICMP报文格式:
ICMP报文的类型
不同类型由报文中的类型字段和代码字段来共同决定,简单的可以分为两种:即ICMP差错报告报文和ICMP询问报文。
ICMP请求与应答报文 ping
通过ping程序可以发送请求报文,在ping的服务器收到报文后会返回应答报文。
下面是请求应答的报文格式:
让wireshark开始抓包,用icmp过滤,打开cmd窗口,输入ping www.youku.com,就会发现wireshark开始抓取报文,ping默认发4个请求报文,所有这里会抓取到8个报文(请求和应答各4个)。下面查看一个请求报文结构:
再来看一看实际的数据域:
Traceroute工具
Traceroute程序可以让我们看到 I P数据报从一台主机传到另一台主机所经过的路由,它是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。
Traceroute基本原理:这个程序利用报文的TTL信息实现路由的获取。首先主机向目的主机发送一个TTL=1的数据报,当数据报到达第一个路由器时,TTL=0,这时路由器会发送一个ICMP报文返回给主机,说明数据报超时。由此得到第一个路由地址,然后令TTL=2,再次发送一个数据报,会得到第二个路由返回的ICMP,由此一次次增加TTL就可以得到主机到目的主机之间所经过的路由信息。
windows cmd中运行结果
在linux中traceroute是可以选则数据包的类型(-I,-U,-T)分别代表ICMP,UDP,TCP数据包类型。而在windows的cmd中tracert用的是ICMP数据包。实际测试中可能会出现一些问题。
附:
wireshark与对应的OSI七层模型
TCP包的具体内容
从下图可以看到wireshark捕获到的TCP包中的每个字段。
相关文章推荐
- Linux 网络协议栈开发基础篇(十二)—— 使用wireshark分析TCP/IP协议中TCP包头的格式
- Linux 网络协议栈开发基础篇(十二)—— 使用wireshark分析TCP/IP协议中TCP包头的格式
- Linux 网络协议栈开发(一)—— 网络协议栈内核分析
- Linux 网络协议栈开发番外篇(七)—— Linux下路由配置
- Linux 网络协议栈开发代码分析篇之VLAN(三)—— VLAN收发处理
- Linux 网络协议栈开发番外篇(五)—— Linux路由表详解
- Linux 网络协议栈开发代码分析篇之VLAN(二)—— Linux下VLAN功能的实现概述
- Linux 网络协议栈开发番外篇(三)—— ping命令执行过程详解
- Linux 网络协议栈开发代码分析篇之数据收发(二) —— dev_queue_xmit()函数
- Linux 网络协议栈开发番外篇(一)—— hlist 详解
- Linux 网络协议栈开发代码分析篇之VLAN(一)—— vlan 功能模块分析
- Linux 网络协议栈开发番外篇(二)—— list_head 学习
- Linux 网络协议栈开发代码分析篇之数据收发(一) —— netif_receive_skb()函数
- Linux 网络协议栈开发番外篇(六)—— Windows路由表详解
- Linux 网络协议栈开发番外篇(八)—— 策略路由
- linux网络协议栈分析笔记12-路由2-FIB1
- linux网络协议栈分析笔记4-网桥3
- linux网络协议栈分析笔记11-路由1-路由缓存
- linux网络协议栈分析——ioctl的调用流程
- Linux网络协议栈分析——从设备驱动到链路层