从0到1用java再造tcpip协议栈:ICMP协议的原理和实现

绝大多数TCPIP传输协议基于IP寻址协议,然后建造在IP之上的TCP和UDP两种协议用于控制数据包的传输。问题在于这些协议只关注数据传输,在传输过程中如果出现错误信息,或者是网络出现某种异常情况需要数据发送双方做一些控制操作时,我们就需要在这些协议的控制范围之外传递一些有关数据发送的控制信息,这些数据的发送就必须依赖于控制数据报协议,也就是ICMP协议。

ICMP协议在保证数据的准确发送上发挥了巨大作用,但人们往往忽略它的作用,就连专业从事信息技术开发的工程师对它了解也很少。它经常被使用,当你感觉网络出问题时,你会执行ping命令,看数据包的发送是否顺畅,ping命令正是基于ICMP协议实现的。

ICMP协议的主要目标是汇报数据发送过程中出现的错误信息,如果把IP协议看做强力首席执行官,那么ICMP就是辅助执行官工作的总裁助理。ICMP主要任务是辅助IP层把数据包有效的发送给目的地,一旦发送过程中出现问题时,相关信息就通过ICMP协议进行传输,如下图:


屏幕快照 2018-12-21 上午11.09.03.png

假设设备A要把消息发送给左边设备B,数据包要经过路由器R3,但R3出现了问题,于是R3就会使用ICMP协议把问题信息传递给设备A。ICMP存在一个问题是,它只能把错误信息传递给数据包发送者,假设R3发现问题是R2引起的,但它不能通过ICMP把信息发送给R2,让其进行纠正,而只能把消息回传给A.

ICMP协议主要发送两类消息。第一类是错误消息,如果数据发送过程中产生错误,那么有关错误的信息会封装在ICMP协议数据包中返回给发送者;第二类是控制信息消息,这类信息主要用于把当前网络状况传递给发送者,让发送者根据情况调整数据包的发送控制。

我们先看看ICMP协议数据报的格式。ICMP数据报首先以数据链路层包头开始,我们前面章节提到过,包头2字节使用0x0800表示发送的是IP数据包。ICMP数据包有意思的一点是,它使用IP包头寻址,但又不包含在IP数据包里。因此跟在数据链路层包头后面的是IP4包头,其格式如下:

屏幕快照 2018-12-21 下午5.37.41.png

后面我们研究IP协议时在详细讲解这个包头,ICMP使用IP包头主要是确定发送者和接收者的IP地址而已,ICMP使用的IP包头中,options部分一般没有,因此包头总长度是20字节,过了IP包头后接下来才是ICMP数据包部分,其格式如下:

屏幕快照 2018-12-21 下午5.44.02.png

其中的type用来标志消息类型,0-127表示错误消息,128-255表示控制信息。code用来表示消息分类,如果是错误消息,那么它用来表示不同的错误情况,checksum用来表示校验值,用来判断数据包是否出错。接下来的部分是消息的主要内容,它的结构根据type和code的不同组合而不同。

我们看一个ICMP数据的具体实例,假设你在浏览器中登陆www.chenyi.com,这是一个不存在的网站,此时就会有一个ICMP数据包包含着错误信息回传到你电脑上,这个错误类型叫Destination Unreachable Message,使用wireshark抓包就会看到如下内容:

屏幕快照 2018-12-22 下午4.19.40.png

当上述类型错误产生时,type取值为1,code有多种取值,0表示找不到给的IP对应的网络,1表示IP对应网络找到了,但网络中不存在接收该消息的设备;2表示发送数据包的协议无效;3表示端口不可达;4表示数据量太大却不分割;5表示数据包发送路径出错;其他数值表示的含义我们今后用到时才讲解。此时数据报的消息主体是导致这个错误的数据包它的IP包头加8个字节的数据内容,其格式如下:

屏幕快照 2018-12-22 下午4.43.55.png

其中前4字节留着没用任何用处。我们分析一个具体例子,当你在浏览器里输入www.chenyi.com后,wireshark会抓到消息类型为Destination Unreachable 的ICMP数据报,它以14个字节的数据链路层包头开始,然后接着是20字节的IP包头,该包头是用来发送该数据包的IP包头,由此可见ICMP的传输依赖于IP层协议,但记住,它是与IP协议并列同一层的协议。

下来

然后我们往下拉,进入ICMP数据报部分,然后点击它的消息体,我们可以看到消息主体首先包含了IP数据包头,这个数据包头市产生这个ICMP错误消息的那个数据包,也就是当我们在浏览器输入www.chenyi.com,按回车后浏览器发送出去的数据包的IP包头:

屏幕快照 2018-12-22 下午4.59.24.png

最后是导致出错数据包的内容中前8个字节,从这里看是UDP数据包前8个字节,该协议我们在后续课程中再详细分析:

屏幕快照 2018-12-22 下午5.06.05.png

在下一节课,我们将使用代码实现该ICMP数据包的解析。

更详细的讲解和代码调试演示过程,请点击链接

更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号:


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

推荐阅读更多精彩内容

  • 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者...
    保川阅读 5,940评论 1 13
  • 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者...
    JasonShi6306421阅读 1,225评论 0 1
  • 经过前两节的准备,我们完成了数据链路层,已经具备了数据包接收和发送的基础设施,本机我们在此基础上实现上层协议,我们...
    望月从良阅读 2,376评论 4 9
  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 13,033评论 6 174
  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,050评论 0 8