arplab report finished

This commit is contained in:
2026-01-21 08:35:01 +08:00
parent 579791e177
commit 8d6c7c923f
2 changed files with 9379 additions and 10106 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -242,19 +242,19 @@ ARP层、IP层和ICMP层之间需要正确地交互特别是IP层需要调用
- *抓包工具*Wireshark 4.6.3,网络协议分析工具,用于捕获和分析网络数据包,验证协议实现的正确性
- *文本编辑器*:支持语法高亮的代码编辑器,用于编写和调试代码
开发环境配置简单只需安装GCC、CMake和Npcap即可开始开发。Npcap提供了类似libpcap的接口使得代码可以在Windows和Linux平台上移植。
开发环境配置简单只需安装GCC、CMake和Npcap即可开始开发。Npcap提供了类似libpcap的接口使得代码可以在Windows和Linux平台上移植。本程序在Linux和Windows均完成过测试本报告以Windows实验验证环境为主进行说明。
= 实验步骤
== 环境配置
=== 网络配置
在`port_pcap.c`和`xnet_tiny.c`中配置了本机的IP地址。在本实验中本机的IP地址被配置为`192.168.43.70`,网关地址为`192.168.43.1`。
目标机器被Ping机器的IP地址在`app.c`中定义为`192.168.43.146`。
在`port_pcap.c`和`xnet_tiny.c`中配置了本机的IP地址。在本实验中本机的IP地址被配置为`192.168.254.1`,网关地址为`192.168.254.3`。
目标机器被Ping机器的IP地址在`app.c`中定义为`192.168.254.3`。
```c
// xnet_tiny.c
const uint8_t my_ip_addr[] = {192, 168, 43, 70};
const uint8_t my_ip_addr[] = {192, 168, 254, 1};
// app.c
const uint8_t target_ip[] = {192, 168, 43, 146};
const uint8_t target_ip[] = {192, 168, 254, 3};
```
使用Npcap作为底层的抓包和发包驱动。在`port_pcap.c`中打开指定的网卡设备:
@@ -684,7 +684,7 @@ ICMP Echo Request的处理流程包含以下步骤
1. *报文验证*检查报文长度是否满足ICMP头部最小要求验证校验和是否正确
2. *类型判断*检查ICMP类型字段是否为Echo Request8
3. *特殊处理*当源IP为192.168.43.146时,调用 `do_traceroute` 函数打印路由信息(用于实验演示)
3. *特殊处理*当源IP为192.168.254.3时,调用 `do_traceroute` 函数打印路由信息(用于实验演示)
4. *构造响应*分配发送缓冲区填充IP头部和ICMP头部
5. *类型转换*将ICMP类型字段从Echo Request8修改为Echo Reply0
6. *地址交换*将IP头部的源地址和目的地址互换实现响应报文的正确路由
@@ -699,10 +699,10 @@ ICMP Echo Request的处理流程包含以下步骤
== 网络拓扑与测试环境
本次实验采用简单的局域网拓扑结构,包含两台主机:
- *主机A本机*IP地址为192.168.43.70运行xnet_tiny协议栈
- *主机B目标主机*IP地址为192.168.43.146,运行标准操作系统
- *主机A本机*IP地址为192.168.254.1运行xnet_tiny协议栈
- *主机B目标主机*IP地址为192.168.254.3,运行标准操作系统
两台主机通过同一个Wi-Fi接入点连接处于同一个局域网内可以直接进行二层通信。网关地址为192.168.43.1
两台主机通过同一个Wi-Fi接入点连接处于同一个局域网内可以直接进行二层通信。网关地址为192.168.254.3
#figure(image("环境配置ping测试.png",format: "png",width: 100%,fit: "stretch"),caption: "实验网络拓扑与测试环境")
@@ -780,5 +780,5 @@ ARP协议的设计体现了网络协议中的几个重要原则。首先是"简
// #h(0.5em)
#it.body
]
#pagebreak()
#bibliography("ref.yml",full: true,title: "参考文献",style:"gb-7714-2015-numeric")
//#pagebreak()
//#bibliography("ref.yml",full: true,title: "参考文献",style:"gb-7714-2015-numeric")