1.icmp数据包的源码过滤主要基于
2.[源码和文档分享]基于Libpcap实现的局域网嗅探抓包发包解析工具
3.TCP/IP详解卷1:协议目录
4.正点原子lwIP学习笔记——ICMP协议
5.ping命令全链路分析(3)-用户态数据包构造与传递
6.ping命令全链路分析(2)
icmp数据包的过滤主要基于
icmp数据包的过滤主要基于消息源代码。ICMP是解析“InternetControlMessageProtocol”(因特网控制消息协议)的缩写。它是源码TCP/IP协议族的一个子协议,用于在IP主机、解析路由器之间传递控制消息。源码控制消息是解析gecko源码指网络通不通、主机是源码否可达、路由是解析否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,源码但是解析对于用户数据的传递起着重要的作用。
ICMP协议是源码一种面向连接的协议,用于传输出错报告控制信息。解析它是源码一个非常重要的协议,它对于网络安全具有极其重要的解析意义。它是源码TCP/IP协议族的一个子协议,属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。
icmp数据包的重要性
Internet控制信息协议(ICMP)是IP组的一个整合部分。通过IP包传送的ICMP信息主要用于涉及网络操作或错误操作的不可达信息。ICMP包发送是不可靠的,所以主机不能依靠接收ICMP包解决任何网络问题。ICMP协议对于网络安全具有极其重要的意义。ICMP协议本身的特点决定了它非常容易被用于攻击网络上的路由器和主机。
例如,在年8月海信集团测试防火墙的过程中,其防火墙遭受到的ICMP攻击达次之多,占整个攻击总数的%以上!可见,ICMP的重要性绝不可以忽视!
比如,可以利用操作系统规定的ICMP数据包最大尺寸不超过KB这一规定,向主机发起“Ping of Death”(死亡之Ping)攻击。“Ping of Death”攻击的百万读写驱动源码原理是:如果ICMP数据包的尺寸超过KB上限时,主机就会出现内存分配错误,导致TCP/IP堆栈崩溃,致使主机死机。此外,向目标主机长时间、连续、大量地发送ICMP数据包,也会最终使系统瘫痪。
以上内容参考百度百科-因特网控制消息协议
[源码和文档分享]基于Libpcap实现的局域网嗅探抓包发包解析工具
完成一个基于Libpcap的网络数据包解析软件,其设计目的是构建一个易于使用、界面美观的网络监控工具。该软件主要功能包括局域网数据包捕获、分析、图形化显示及统计分析等。具体功能如下:
1. 数据包捕获:利用Libpcap,软件能够扫描并选取不同类型的网卡(如WiFi/以太)进行局域网数据包监听与捕获。用户可选择混杂模式或非混杂模式,混杂模式下,软件接收并分析整个局域网的数据包。
2. 数据包分析:捕获的数据包被分类整理并提取内容进行分析。软件解析数据包版本、头长度、服务类型、总长度、标识、分段标志、分段偏移值、生存时间、上层协议类型、校验和、源IP地址及目的IP地址等信息,以规范形式展示。对于HTTP、ARP等特定协议,wpe的recv源码能深入解析内容。
3. 图形化显示:通过表格组件,直观展示数据包信息,用户可方便查看并交换数据以获取更深层内容。
4. 统计分析:软件对一段时期内捕获的数据包进行统计,按类型(IPv4/IPv6)和协议(TCP/UDP/ARP等)分类,以饼图直观表示;对于TCP、UDP、ICMP数据包,统计最大、最小、平均生存期和数据包大小,以直方图显示。
5. 数据包清空:提供功能清除所有已捕获的数据包。
6. Ping功能:实现与目标主机的连通性测试。
7. TraceRoute功能:了解从本机到互联网另一端主机的路径。
8. ARP-Attack功能:在局域网内实现ARP攻击,测试并断开指定IP地址主机的网络连接。通过欺骗目标主机的网关地址,使ARP缓存表错误,导致无法正常发送数据包。若将欺骗的MAC地址设置为自己的MAC地址,则截获目标机器发送的数据包。
详细参考文档和源码下载地址:write-bug.com/article/1...
TCP/IP详解卷1:协议目录
译者序
前言
第1章 概述1
第2章 链路层
第3章 IP:网际协议
第4章 ARP:地址解析协议
第5章 RARP:逆地址解析协议
第6章 ICMP:Internet控制报文协议
第7章 Ping程序
第8章 Traceroute程序
第9章 IP选路
第章 动态选路协议
第章 UDP:用户数据报协议
第章 广播和多播
第章 IGMP:Internet组管理协议
第章 DNS:域名系统
第章 TFTP:简单文件传送协议
第章 BOOTP: 引导程序协议
第章 TCP:传输控制协议
第章 TCP连接的建立与终止
第章 TCP的交互数据流
第章 TCP的成块数据流
第章 TCP的超时与重传
第章 TCP的坚持定时器
第章 TCP的保活定时器
第章 TCP的未来和性能
第章 SNMP:简单网络管理协议
第章 Telnet和Rlogin:远程登录
第章 FTP:文件传送协议
第章 SMTP:简单邮件传送协议
第章 网络文件系统
第章 其他的TCP/IP应用程序
附录A tcpdump程序
附录B 计算机时钟
附录C sock程序
附录D 部分习题的解答
附录E 配置选项
附录F 可以免费获得的源代码
参考文献
缩略语
正点原子lwIP学习笔记——ICMP协议
ICMP协议是一个网络层协议。一个新搭建好的网络,通常需要先进行一个基本的测试,以验证网络是否畅通;但IP协议并不提供可靠传输。如果数据包丢失了,IP协议并不能通知传输层是否丢失以及丢失的原因。因此,我们需要ICMP协议来完成这样的功能。
总结来说,为了更有效地转发IP数据报和提高交付成功机会。
ICMP协议类型与结构:对于ICMP协议中的自动回复python源码差错报告报文,在lwIP中实现的是目的不可达以及超时的报文;对于超时报文,又分为两种,一种是生存时间TTL(在IP首部中),另一种是分片传输中,接收到一个分片后的超时等待时间超时;ICMP协议中的询问报文,lwIP实现的则是回送请求/应答报文。
无论是差错还是询问报文,前4个字节是一样的:第一个是类型,第二个是代码,例如超时就是0/1,0代表生存时间为0、1则是超时等待时间为0;后两个是校验和;之后的4个字节则是取决于ICMP报文的类型;整个ICMP的数据部分,长度取决于类型;整个ICMP报文是在网络层,可以说IP数据包包含了IP首部以及ICMP报文。
ICMP差错报文用于检测IP数据报在传输过程中的异常信息(目的不可达、源站抑制、重定向、超时、参数错误)。
ICMP类型为3,则代表了是目的不可达;lwIP实现了代码值2、3、4的差错;ICMP类型为则代表了是超时错误;代码值0代表传输期间生存时间为0,1代表数据报组装期间生存时间为0。
ICMP查询报文用于诊断两个网络设备之间是否能够通信。
lwIP只处理ICMP类型0/8,代表了回显请求/应答;目的主机收到ICMP回送请求报文后立即回送应答报文,若源主机能收到ICMP回送应答报文,则说明到达该主机的网络正常(PING)。
ICMP报文数据结构:以上结构体位于icmp.h中;包括有ICMP的类型、代码、校验和、标志符以及序号五个变量。
差错报文中,前4个字节是苹果手机源码包类型、代码和校验后;后4个字节全为0;然后传输的数据就是因其差错的IP首部以及他的pbuf的前8个字节的数据;查询报文的前4个字节与差错报文一样;后4个字节中,2格式标识符,2个事序号;数据部分则是请求报文发送和应答报文重复(就是类型为8,就是回送请求,直接把类型改为0,变成回送应答)。
lwIP只实现目的不可达、超时差错报文,它们分别为icmp_dest_unreach和icmp_time_exceeded函数;这两种差错报文都是调用icmp_send_response发送;其源码和注释如下:
以上源码的逻辑,就是根据当前的type和code判断处理方式,判断得到是差错报文,就把被丢弃数据包的pbuf中的IP首部和前8个字节数据拷贝到差错报文中(同样也是一个pbuf)。
请求报文发送,应答报文重复。简单来讲,应答包是在请求包的基础上修改得来;查询报文的源码和注释如下:
总结来说,ICMP的回送请求,把ICMP结构体的type从8改成0,然后把pbuf的payload上移个字节,添加IP首部,就变成了回送应答包。
这一篇的源码还是比较简单易懂的,没有太多要F跳转的内容,总的原理也比较清晰。
至此,lwIP的大部分协议都学完了,还剩下TCP和UDP协议,现在的lwIP框架如下:
ping命令全链路分析(3)-用户态数据包构造与传递
在Linux系统中,ping命令等网络工具基于inetutils包中的应用层网络工具。本文将探讨ping命令在Linux内核网络协议栈及驱动层面的实现方式。
应用层ping通过socket与内核层交互,程序首先初始化数据结构,创建socket连接,然后构造icmp数据包发送,并对返回的ICMP响应报文进行处理。初始化过程由ping_init()函数完成,创建socket连接,分配数据结构存储空间。数据包构造、发送和返回报文处理由ping_echo()函数完成,其中设置了协议类型、包长度和目的地址,并注册了接收回调函数。
数据包发送过程在ping_run()函数中的send_echo()函数完成,将icmp报文数据部分复制到buf中,并通过socket_fd发送。当目的端返回ping命令的响应报文被网卡接收后,通过内核网络协议栈处理后返回给应用程序。ping应用程序采用IO复用中的select()方式来处理响应报文,当监控到对应socket连接中有数据包到来时,调用ping_recv()函数处理ICMP响应数据包。
应用层软件ping通过socket接口与内核通信,实现数据包发送和接收。数据包发送sendto()的实现代码在linux源码${ linux_src}/net/socket.c中,先检查数据区域是可读的,然后构造待发送消息,并将数据填充到消息中。数据包接收recvfrom()与发送相反,是从内核协议栈中读取数据包到应用层中,实现代码也在${ linux_src}/net/socket.c中。
本文主要分析了用户态程序ping如何构造ICMP请求报文,并通过socket接口实现数据在内核态与用户态之间的搬移。后续将继续分析内核态网络协议栈对数据包的处理,以及内核驱动与硬件的交互实现。
ping命令全链路分析(2)
本文使用 Zhihu On VSCode 创作并发布
上篇文章对开源网络协议栈实现 tapip 触发进行了分析,探讨了执行 ping 命令时,数据包是如何到达网络协议栈的。本文将继续探讨 ping 命令与网络协议栈的联系。目前广泛使用的网络协议栈是五层协议划分:应用层、传输层、网络层、链路层和物理层。ping 命令采用的 ICMP 协议位于网络层,但特别之处在于 ICMP 报文是封装在 IP 报文之内的。下文将从 ICMP 协议开始分析。
ICMP 协议
ping 命令的执行过程实际上包含了源端向目的端发送 ICMP 请求报文和目的端向源端发送 ICMP 回复报文的过程。ICMP 报文头包含了 ICMP type、code、id、seq 等字段,报文头部为 字节,payload 部分数据长度为可变长度。
ICMP 报文头部包含 8bit 类型码 type、8bit 代码 code 和 bit 校验和 checksum,其余部分内容和类型码 type 相关。ICMP 报文中定义 type 字段包含以下几种,type 字段与 code 的详细对应关系见附录 1:
其中,ping 命令使用的报文类型为响应请求和响应应答,其报文格式如图:
ICMP 响应请求
在 tapip 中,ICMP 响应请求报文构造是在 ping.c:send_packet() 函数中完成的。ICMP 报文填充构建代码如下:
根据上一篇文章的分析,tapip 采用一个 tap 设备作为虚拟网卡,ICMP 数据报文最终通过 wirte() 接口写入 tap 设备文件中,最终被 Linux 内核中的网络协议栈处理。这里还是先从 tapip 出发,研究下网络协议栈中如何处理 ICMP 响应请求报文。在 tapip 源码中,处理 ICMP 响应请求报文在函数 icmp_echo_request() 中,其函数调用栈如下:
在 Linux 系统中,数据包到达网络设备后会触发中断,网卡驱动程序将对应数据包传递到内核网络协议栈处理,处理结果通过系统调用接口返回给应用程序(ping 应用)。
tapip 作为一种用户态实现,网络设备 net device 是通过 tap 设备模拟的,tap 设备文件描述符中被写入数据包就相当于网卡设备接收到网络数据包;
网卡驱动程序的工作对应 tapip 中 netdev_interrupt() 到 veth_rx() 之间的过程:首先在中断处理函数中调用 veth_poll() 函数采用轮询的方式检查 tap 设备的文件描述符是否有写入事件;当发生写入事件时,veth_rx() 函数被调用,从文件描述符中读取数据包,并传递到网络协议栈中处理,此时,网络协议栈处理的入口 net_in() 被调用。
网络协议栈按照网络分层模型进行处理:
ICMP 响应回复
ICMP 响应回复的处理过程与接收侧处理 ICMP 响应请求的流程基本一致,不同点在于最后 icmp 报文响应的处理,其 type 为 0,对应的处理函数为 icmp_echo_reply(),具体函数调用栈如下:
总结
本文主要分析了用户态网络协议栈 tapip 处理 ping 命令对应的 ICMP 报文的过程,后续将结合 Linux 内核分析这个过程在内核中是如何处理的,另外还会分析下 ARP 协议的实现。
学海无涯,感觉 tapip 的实现逻辑清晰,读起来非常舒服,非常推荐对网络感兴趣的同学学习参考。
(最近特别水逆,希望能早日走出困境,迎来光明吧。)
附录 1: ICMP 报文类型表
markdown
| 类型 Type | 代码 Code | 描述 |
| :------: | :------: | :--------------------------: |
| 0 | 0 | 回显应答(ping 应答) |
| 3 | 0 | 网络不可达 |
| 3 | 1 | 主机不可达 |
| 3 | 2 | 协议不可达 |
| 3 | 3 | 端口不可达 |
| ... | ... | ... |
TODO:
深度解析Linux内核协议栈探索网络通信的奥秘linux内核协议栈
近年来,随着互联网的普及和信息技术的不断发展,网络通信的重要性日益凸显。而在网络通信中,协议栈是至关重要的环节。Linux内核协议栈作为Linux操作系统的核心组成部分之一,是实现网络通信的关键组件。本文将详细介绍Linux内核协议栈的结构和工作原理,探索网络通信的奥秘。
一、Linux内核协议栈的结构
Linux内核协议栈主要由五个层次组成,分别是应用层、传输层、网络层、数据链路层和物理层。
(1)应用层
应用层是网络通信的最上层。在Linux内核中,应用层由一系列协议组成,例如HTTP协议、FTP协议、SMTP协议等。这些协议负责处理应用程序与网络的交互过程,将应用程序发送的数据转化为可传输的网络数据包。
(2)传输层
传输层是应用层下的一个子层。在Linux内核中,传输层主要由TCP协议和UDP协议组成。它们负责将应用程序转化的数据传输到网络层。
(3)网络层
网络层是传输层下的一个子层。在Linux内核中,网络层由IP协议、ICMP协议和IGMP协议组成。网络层负责将传输层传输的数据包进行路由和寻址,保证数据包传输到达目的地址。
(4)数据链路层
数据链路层是网络层下的一个子层。在Linux内核中,数据链路层由以太网协议、ARP协议和RARP协议组成。数据链路层负责将网络层传输的数据包进行分段和组装,以及实现局域网内计算机之间的通信。
(5)物理层
物理层是整个协议栈中最底层的一层。物理层负责将数字信号转化为模拟信号,通过物理媒介(例如光缆或者电缆)进行传输。
二、Linux内核协议栈的工作原理
Linux内核协议栈中各个层次之间的数据传输是通过TCP/IP协议进行的。当应用程序需要发送数据时,会将数据打包成数据包,然后通过传输层的TCP或UDP协议进行传输。传输层将数据包进行封装并加入TCP或UDP头部信息后,将数据包传输到网络层。在网络层,数据包的IP地址和端口号信息被加入IP头部,同时添加了用于检验数据完整性的校验和。然后,数据包被传输到数据链路层进行分段和组装,最终通过物理层传输到接收方计算机。
需要注意的是,Linux内核协议栈中的每个层次都需要进行协议处理和数据加工,这个过程需要消耗大量的系统资源。因此,在进行网络通信时,需要科学地配置协议栈,保证数据的快速传输。
三、深入学习Linux内核协议栈的方法
如果想要深入学习Linux内核协议栈,你需要掌握以下知识点:
(1)Linux内核协议栈的结构和工作原理;
(2)TCP/IP协议的基本原理和应用场景;
(3)Linux操作系统的基本知识和网络编程技能。
此外,还可以通过阅读相关的书籍和博客,以及参与开源社区中的Linux内核开发实践来深入学习。
参考文献:
1. Linux内核源代码解析.卷2:进程,内存和文件系统;
2. TCP/IP详解。
文章讲了怎样深入学习Linux内核协议栈,以及Linux内核协议栈的结构和工作原理,探索网络通信的奥秘。