从0到1用java再造tcpip协议栈:基于ICMP echo协议的ping应用原理

2024-04-30 22:08

本文主要是介绍从0到1用java再造tcpip协议栈:基于ICMP echo协议的ping应用原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如果你发现突然上不了网时,技术小白最常用的手段是重启一下,而有点技术范的人会打开控制台,然后输入:

ping www.baidu.com

然后观察控制台是否有相应的数据包信息显示。ping功能是我在机器上不了网时最常用的命令,它的作用是用于甄别到底是我要访问的网站挂了,还是网络出了问题,如果我连续ping几个对象,发现没有相应的回复数据包,那么我就知道我的网络出了问题,本节我们就看看如何从代码上实现ping 功能。

ping其实是ICMP协议控制信息的一个子功能。它的根本目的是检测两台设备之间是否能正常交换数据。ping的基本流程如下,假设设备A想看看它能否连接到设备B,它会发送一个ICMP echo 消息给B,B如果收到的话,它会放回一个ICMP echo reply消息给A,当A收到B的消息后,它知道它与B是能正常连接的。我们先看看echo消息的格式,ICMP数据包中的type字段值设置为1,code字段设置成0,此时有两个字段的校验值,接着是两字段的identifier用于辨识消息发出者和接收者,接着是两字节的Seuqence Number,用于将请求消息和回复消息对应起来,最后附带一系列而外数据,如下图:

屏幕快照 2019-01-10 下午4.59.57.png

这里有两个字段需要搞清楚,他们是identifier和sequence number,identifier用来辨别不同的ping流程,例如我们启动两个控制台窗口,分别输入ping命令,那么运行起来两个不同的ping进程,这两个ping进程就依靠不同的identifier来区分。而一次ping过程不止发送一个数据包,如果一次发送多个数据包,那么同一个ping流程内就用sequence number把不同的数据包给区分开来,这个字段一般都是递增的。

最后的optional Data 是发送者添加的额外数据,接收者回复时必须把这段数据也附带到回复数据包上。这些数据这些数据可要可不要,附带它们往往是为了检测当前可用带宽等其他目的。

我们在控制台使用ping命令,然后用wireshark抓包,看看包结构内容,我用ping 192.168.2.1 向路由器发出一个icmp echo请求,下面是我发出的数据包以及回应包的内容:

屏幕快照 2019-01-11 下午4.19.24.png

上面是我向路由器发出的ping请求包,注意看ICMP数据部分type=8, code = 0,identifier = 59457, sequence number = 0,这表明该包是ping程序发出的第一个数据包,我们再看看路由器的返回包:

屏幕快照 2019-01-11 下午4.22.48.png

注意看返回包与请求包唯一不同在于它的type=0,其他的都相同,特别是identifier与sequence number必须相同。接下来我们看看如何实现ping 程序,要注意ping是对协议的应用而不是协议本身,它利用协议提供的功能来完成一次通讯目的,因此ping只是利用了ICMP协议而不属于ICMP协议,由此我们将以下面架构来完成ping程序:

1.png

ping和QQ,BT,等这样网络应用程序属于同一类,他们都属于Application,它们需要依据某种传输协议来实现自己的通讯目的,于是他们从Protocol那里请求特定的协议构造传输包头,然后Protocol把构造的包头返回,应用程序把自己的数据和包头结合在一起传给DataLink发送出去,上图中Application 和 protocoal只是概念,在代码中并不一定对应有实体。

下一节我们看看具体代码如何实现。

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

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

这篇关于从0到1用java再造tcpip协议栈:基于ICMP echo协议的ping应用原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/950043

相关文章

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用

java内存泄漏排查过程及解决

《java内存泄漏排查过程及解决》公司某服务内存持续增长,疑似内存泄漏,未触发OOM,排查方法包括检查JVM配置、分析GC执行状态、导出堆内存快照并用IDEAProfiler工具定位大对象及代码... 目录内存泄漏内存问题排查1.查看JVM内存配置2.分析gc是否正常执行3.导出 dump 各种工具分析4.

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

Spring Boot 3.x 中 WebClient 示例详解析

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET... 目录Spring Boot 3.x 中 WebClient 全面详解及示例1. WebClient 简介2.

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分