专栏首页Coding迪斯尼从0到1用java再造tcpip协议栈:ICMP协议的原理和实现

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

本文分享自微信公众号 - Coding迪斯尼(gh_c9f933e7765d)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从0到1用java再造tcpip协议栈:使用责任链模式实现ICMP错误数据报解析

    上一节我们讲述了ICMP协议的数据格式,说到了ICMP数据报包含两种类型的信息:错误消息和控制消息。同时我们详细解析了包含错误消息时的数据格式,本节我们使用代码...

    望月从良
  • TFTP:简单文本传输协议的数据包格式解析

    本节我们看看TFTP数据包的组装方式,为我们代码实现该协议奠定基础。TFTP协议总共有5中不同数据包,分别对应读请求,写请求,数据块,接收回应(ACK),以及错...

    望月从良
  • 代码实现TCP三次握手:基本数据结构说明

    从本节开始,我们用代码实现TCP的三次握手流程,首先我们通过wireshark抓包,看看相关数据包的基本机构。首先打开wireshark,然后用浏览器打开一个网...

    望月从良
  • AFNetworking3的常用操作

    导入的最新版的AFNetworking3.1.0,突然发现找不到AFHTTPRequestOperationManager了。 刚开始以为是cocoapods没...

    剑行者
  • ES6之对象的扩展

    对象有一个描述对象,通过Object.getOwnPropertyDescriptor方法可以获取:

    wade
  • 简单的搜索引擎搭建

    CodeInHand
  • 文本挖掘| 到底什么是文本挖掘?

    你是否想过为什么图书馆的管理员能够将几千本几万本的书籍进行快速的管理?你是否好奇习近平总书记的政府工作报告,随着时间的推移,他传达的信息有什么变化?如何从海量的...

    黑妹的小屋
  • 海量短文本场景下的去重算法

    在大多数情况下,大量的重复文本一般不会是什么好事情,比如互相抄袭的新闻,群发的垃圾短信,铺天盖地的广告文案等,这些都会造成网络内容的同质化并加重数据库的存储负担...

    腾讯QQ大数据
  • 浙江大学和海康威视提出:视频场景文本定位算法SVST(集成检测,跟踪和识别于一体)

    【导读】本文分享一篇浙江大学和海康威视最新联合提出的视频场景文本定位(Video Scene Text Spotting)方向的算法:SVST(spotting...

    Amusi
  • 锚文本具体有那些作用?

    很多人都知道锚文本,但是很多人都不确切锚文本究竟改看看,一般做锚文本分为车站内做锚文本和站外锚文本,锚文本只不过是链接的一种方式,那么明确锚文本有那些作用呢?上...

    小白程序猿

扫码关注云+社区

领取腾讯云代金券