level-icmp(ping)详细过程_6
TCP/IP协议栈将地址信息和协议分解标识符相结合, 以决定一个数据报是否被正确接收, 以及哪个实体将会处理该数据报。有几层还会检测数值( 例如校验和) , 以保证内容在传输中没有损坏
1、TCP/lP中的复用、分解和封装
虽然它不是TCP/IP协议族的真实部分, 但我们也能自底向上地说明从链路层开始如何进行分解, 这里使用以太网作为例子。我们在第3章讨论几种链路层协议。以太网帧包含一48位的目的地址(又称为链路层或介质访问控制( MAC ) 地址) 和一个16位的以太网类型字段0x0800(十六进制) 表示这个帧包含IPv4数据报。0x0806和0x 86DD分别表示ARP和IP v6假设目的地址与接收方的一个地址匹配, 这个帧将被接收并校验差错, 以太网类型字段用于选择处理它的网络层协议。
如果接收到的帧包含一个IP数据报, 以太网头部和尾部信息将被清除, 并将剩余字节(包含帧的有效载荷) 交给IP层来处理。IP层检测一系列的字段, 包括数据报中的目标IP地址。如果目标地址与自已的一个IP地址匹配, 并且数据报头部( I P不检测有效载荷) 没有错误, 则检测8 位的IPv4协议字段( 在IPv6中称为下一个头部字段) , 以决定接下来调用哪个协议来处理。常见的值包括1 ( ICMP)、2 ( IGMP)、4 (IPv4)、6(TCP) 和17(UDP)。数值4 (41 ,表示IPv6 ) 的含义是有趣的, 因为它表示一个IP数据报可能出现在另一个IP数据报的有效载荷中。它违反了分层和封装的原有概念, 但是作为隧道投术的基础, 我们在第3 章进行更多讨论。
如果网络层( IPv4或IPv6)认为传入的数据报有效, 并且已确定正确的传输层协议, 则将数据报(必要时由分片重组而成) 交给传输层处理。在传输层中, 大部分协议(包括TCP和UDP) 通过端口号将复用分解到适当的应用。
2、Tcp/ip协议栈四层结构
Tcp/ip协议栈分为四层,分别是
应用层(HTTP、FTP 等)
传输层(TCP、UDP)
网络层(IP、ICMP)
链路层(以太网、ARP)
3、ping操作在level-ip中的处理流程
3.1 netdev_receive() 链路层(Link Layer),也称为网络接口层(Network Interface Layer)
核心职责:
处理从物理网络设备(如网卡)接收到的原始数据帧
链路层操作:
解析以太网帧头(如 MAC 地址、协议类型 EtherType)。
校验数据完整性(如 CRC 校验)。
剥离链路层头部,将有效载荷(如IP数据包传递给上层协议栈(网络层)
数据流路径:
网卡接收数据帧 → DMA 写入内核缓冲区。
触发中断 → 调用网卡驱动接收函数(链路层处理)。
netif_receive_skb(或类似函数)解析以太网头部,确定上层协议(如 IPv4/IPv6)。
将数据包递交给网络层(IP 协议处理)。
3.2 ip_rcv() 属于网络层(Network Layer)即IP层
核心职责:
处理从链路层(如以太网、Wi-Fi)传递上来的 IP 数据包。
网络层操作:
IP 头部校验:验证 IP 数据包的完整性(如校验和、版本号)。
路由决策:判断数据包是发往本机、需要转发,还是应丢弃。
分片重组:若IP数据包在传输过程中被分片(Fragment),在此重组为完整数据包。
协议分发:根据 IP 头部的 Protocol 字段(如 TCP=6、UDP=17、ICMP=1),将数
据包递交给传输层或 ICMP 层处理。
3.3 icmpv4_incoming (icmp_rcv) ICMPv4 属于网络层Network Layer,与IP协议协同工作
核心功能:
错误报告(如 Destination Unreachable、Time Exceeded)。
诊断与控制(如 Echo Request/Reply(ping)、Timestamp Request/Reply)。
路径控制(如 Redirect 消息)。
处理 Destination Unreachable(目标不可达)
流程:
解析不可达原因(如网络不可达、端口不可达)。
提取原始触发报文(触发错误的数据包头部)。
通知上层协议(如 TCP 触发超时重传)。
3.4 ip_output
下次继续分解。测试效果如下:
tap0的mac是临时虚拟的。
欢迎关注:
往期相关:
level-ip connect详细过程_5
Linux下level-ip安装及测试_4
Linux下tun/tap ping操作代码例子_3
Linux虚拟网卡设备tun/tap介绍_2
linux下安装tun模块详细教程
3_TCP/IP连接三次握手与断开四次挥手