TCP/IP协议笔记5-ICMP协议及其应用

1 ICMP协议概述

ICMP(Internet Control Message Protocol)协议是因特网控制报文协议,ICMP常被认为是网络层协议,它的报文存在于IP数据报的数据部分,如图。

ICMP协议栈

因为ICMP是基于IP数据报的,所以跟TCP不同的是,它是不需要指定端口的,更没有建立连接一说。而且,通常来说ICMP协议都是内核帮你实现的,系统自身就支持了,并不像TCP/HTTP等还要自己开个服务监听对应端口啥的。 可能有人会有疑问了,既然没有端口来标识了,那我有时候开多个ping进程,这些响应消息是怎么对应到不同的ping进程的? 这个就是ICMP报文里面的标识符的作用了。标识符会在响应中带回来,这样发送方就能根据标识符将请求和应答匹配了。在ping中,这个标识符就是进程ID。

ICMP报文有多种类型,如地址掩码请求和应答、时间戳请求和应答、请求回显和回显应答等。ICMP报文通用格式如下,不同类型的报文内容有所不同。ICMP协议在 ping,traceroute等工具中有典型应用,下面都分析一下。

ICMP报文格式

2 Ping 原理分析

ping使用的是 ICMP 的请求回显/回显应答类型的报文,格式如下。它的内容包括标识符、序列号以及回显数据3部分,报文大小默认为 64 字节(header的8字节+body的56字节)。

ICMP回显报文格式
  • 请求回显类型是8,回显应答类型是0,他们代码都是 0,校验和是包内容根据算法生成用于校验数据完整性。
  • 标识符在 Linux/macOS 中用的是进程ID。
  • 序列号在 Linux/macOS 中是从0递增的,每个进程独立的。
  • 回显数据包括发送ping请求的时间戳(在macOS占8字节,在Linux占16字节),以及一串填充数据,在Linux这串数字默认是0x10...37,共40字节。在macOS中是0x08090a...37,共48字节。填充数据你也可以通过 -p pattern指定,比如 ping -pff 192.168.33.10,则填充数据全部是 ff。
  • 默认TTL是64,你可以通过 -t ttl 指定TTL值。
  • ping请求时间 = 接收到回显应答的时间 - 应答回显数据中的时间

实例分析

在测试机ping我的虚拟机 ping -c2 192.168.33.10,192.168.33.10是我测试用的虚拟机IP,wireshark抓包如下:

Ping请求
Ping响应

可以验证前面的分析。第2对请求和应答跟第一对类似,只是序列号,校验和等不同罢了。

关于校验和

ICMP报文头部中的校验和生成/校验方式也比较简单。

  • 生成:先将校验和置为0,然后将ICMP报文的header+body按16bit分组求和。如果结果溢出,则将高16位和低16位求和,直到高16位为0。最后求反就是检验和的值。
  • 校验:将报文的header+body按16bit分组求和(包括校验和字段),看看结果是否全是1,如果不是,则校验失败。
ICMP校验和算法

如何自己写一个ping?可以参考下这位朋友的ping工具的 python实现。 Lingerhk: icmp_ping_tool.py

3 Traceroute 原理分析

traceroute 用于查看IP数据报从一台主机传到另一台主机所经过的路由。其实,在IP数据报的头部的选项字段有一个 IP记录路由选项(RR),它也可以记录路由。为什么不直接用它而是另外弄出个traceroute工具,这是因为:

  • 1)IP首部长度限制,导致记录的IP地址最多9个 ,远远不够。
  • 2)并不是所有路由器都支持记录路由选项,因此某些路径无法使用。

traceroute 用到ICMP协议和TTL字段。TTL字段是数据报的生存周期,初始值通常默认是64,每个处理数据报的路由器都需要把TTL值减去1或者数据报在路由器停留的秒数(因为绝大多数路由器转发数据报时延都小于1秒,因此通常都是减去1,而且很多路由器的实现即便超过1秒也是减去1,因此可以把TTL看做一个跳站计数器)。路由器接收到一份IP数据报时,如果TTL为0或者1,则路由器不转发该数据报,而是丢弃并给源机器发送一份ICMP超时报文,而ICMP信息中的IP报文中源地址正是路由器的IP地址。

traceroute的原理就是:

  • 先发送一份TTL为1的报文,这样第一个路由器会将TTL减1然后丢弃该报文,并发回一个ICMP超时报文,这样就得到了第一个路由器的IP地址;接着发送一个TTL为2的报文,可以得到第二个路由器的IP地址;继续该过程直到目的主机。
  • 但是目的主机即便收到TTL为1的报文,它也不会丢弃该数据报并发回一份ICMP超时报文,因为此时数据报已经到了目的地。为了判断是否到达目的主机,traceroute发送的报文采用了UDP数据报,它选择一个很大的端口值如30000以上的,以保证没有其他应用程序使用该端口,然后目的主机会返回一个端口不可达的ICMP报文,这样就可以知道什么时候结束。
  • traceroute针对每个TTL会发3次UDP报文,并打印每次的往返时间。如果5秒内没有收到3次报文中任何一个的响应,则打印*号继续下一个TLL的报文发送。3次报文选择的UDP目的端口分别是 33435,33436,33437,UDP报文数据长度为24字节,内容为全0(macOS环境)。

实例分析

运行 traceroute 119.75.217.109,可以看到wireshark抓包的前几跳信息,TTL最开始是1,然后是2...,端口是33435到33437,每个TTL发3次报文,在没有达到目的主机前,返回的是ICMP超时报文。到达主机后,则会返回ICMP端口不可达报文。

traceroute 请求的UDP报文
traceroute 响应的ICMP超时报文
traceroute 目的主机响应的ICMP端口不可达报文

由于IP路由通常都是动态的,每个路由器都要判断数据报接下来要转发到哪个路由器,应用程序对路由策略并不控制。而traceroute程序的IP源站选路选项(-g gateway)可以实现发送者指定路由,比如指定必须经过哪些路由IP,这里就不展开了。有兴趣的可以参见 《TCP/IP详解 卷1:协议》的第8章。

参考资料

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,051评论 0 8
  • 地址解析协议ARP 物理这一级,主机和路由器是用物理地址来区别的。物理地址是一个本地地址,管辖范围是本地网络,所以...
    顾慎为阅读 1,073评论 0 1
  • IPv4分组 IPv4,即现在普遍使用的IP协议(版本为4)。IP协议定义数据传送的基本单元——IP分组及其确切的...
    CodeKing2017阅读 1,866评论 0 0
  • 前言 这一篇文章主要围绕了IP协议,ICMP协议和UDP协议展开,希望可以在这里大概做一个总结,将《TCP/IP协...
    Noskthing阅读 3,084评论 5 57
  • 本篇结构: ICMP IGMP 附 反思 接着上一篇TCP/IP--划分子网和构造超网,本章接着分享IP协议的两个...
    w1992wishes阅读 10,803评论 0 4