From c993b78b6ddfeb1bcf313a4ab53918d943d1387f Mon Sep 17 00:00:00 2001 From: CGH0S7 <776459475@qq.com> Date: Tue, 20 Jan 2026 17:11:14 +0800 Subject: [PATCH] arplab report initilized --- .gitignore | 4 + network/arpicmplab/implementation_report.md | 2 +- network/arpicmplab/labtemplate.typ | 154 +++++++++++++++++ network/arpicmplab/main.typ | 180 ++++++++++++++++++++ network/arpicmplab/ref.yml | 44 +++++ 5 files changed, 383 insertions(+), 1 deletion(-) create mode 100755 network/arpicmplab/labtemplate.typ create mode 100755 network/arpicmplab/main.typ create mode 100755 network/arpicmplab/ref.yml diff --git a/.gitignore b/.gitignore index 2594633..c1d3b35 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,7 @@ tcp_server tcp_perf_server quic_server quic_perf_server +tcp_multi_client +tcp_multi_server +quic_multi_client +quic_multi_server diff --git a/network/arpicmplab/implementation_report.md b/network/arpicmplab/implementation_report.md index 3f43bc5..f6275b0 100644 --- a/network/arpicmplab/implementation_report.md +++ b/network/arpicmplab/implementation_report.md @@ -123,7 +123,7 @@ switch (swap_order16(hdr->protocol)) { 3. **运行与测试**: - 编译成功后,会在`build`目录下生成可执行文件`xnet.exe`。 - 使用`sudo ./xnet.exe`运行(需要root权限以访问网络接口)。 - - 在另一台处于同一局域网的主机上,执行`ping 192.168.254.2`,即可测试ICMP Echo功能。同时,可以通过`tcpdump`或`Wireshark`抓包观察ARP请求和响应过程。 + - 在另一台处于同一局域网的主机上,执行`ping`,即可测试ICMP Echo功能。同时,可以通过`tcpdump`或`Wireshark`抓包观察ARP请求和响应过程。 ## 6. 总结 diff --git a/network/arpicmplab/labtemplate.typ b/network/arpicmplab/labtemplate.typ new file mode 100755 index 0000000..2820bbe --- /dev/null +++ b/network/arpicmplab/labtemplate.typ @@ -0,0 +1,154 @@ +#let times = "Times LT Pro" +#let times = "Times New Roman" +#let song = (times, "Noto Serif CJK SC") +#let hei = (times, "Noto Sans CJK SC") +#let kai = (times, "Noto Serif CJK SC") +#let xbsong = (times, "Noto Serif CJK SC") +#let fsong = (times, "Noto Serif CJK SC") +#let code = (times, "JetBrains Mono") +#let nudtlabpaper(title: "", + author: "", + id: "", + training_type:"", + grade: "", + major: "", + department: "", + advisor: "", + jobtitle: "", + lab: "", + date: "", + header_str: "", + body) = { + // Set the document's basic properties. + set document(author: author, title: title) + set page( + + margin: (left: 30mm, right: 30mm, top: 30mm, bottom: 30mm), + ) + + // Title row. + v(158pt) + align(center)[ + #block(text(weight: 700, size: 30pt, font: hei, tracking: 15pt, "计算机网络")) + ] + align(center)[ + #block(text(weight: 700, size: 30pt, font: song, tracking: 15pt, "本科实验报告")) + ] + + v(103pt) + pad( + left: 1em, + right: 1em, + grid( + columns: (80pt, 1fr), + rows: (17pt, auto), + text(weight: 700, size: 16pt, font: song, "实验名称:"), + align(center, text(weight: "regular", size: 16pt, font: song, title)), + text(""), + line(length: 100%) + ) + // #block(text(weight: 700, 1.75em, title)) + // underline(text(weight: 700, size: 16pt, font: song, title)) + ) + + // Author information. + + v(82.5pt) + + grid( + columns: (0.25fr, 0.25fr, 0.25fr, 0.25fr), + rows: (15pt, 8pt, 15pt, 8pt, 15pt, 8pt, 15pt, 8pt, 15pt), + text(size: 14pt, font: song, tracking: 10pt, "学员姓名"), + align(center, text(size: 14pt, font: song, author)), + text(size: 14pt, font: song, tracking: 54pt, "学号"), + align(center, text(size: 14pt, font: times, id)), + text(""), + line(length: 100%), + text(""), + line(length: 100%), + text(size: 14pt, font: song, tracking: 9pt, "培养类型"), + align(center, text(size: 14pt, font: song, training_type)), + text(size: 14pt, font: song, tracking: 54pt, "年级"), + align(center, text(size: 14pt, font: times, grade)), + text(""), + line(length: 100%), + text(""), + line(length: 100%), + text(size: 14pt, font: song, tracking: 54pt, "专业"), + align(center, text(size: 14pt, font: song, major)), + text(size: 14pt, font: song, tracking: 9pt, "所属学院"), + align(center, text(size: 14pt, font: song, department)), + text(""), + line(length: 100%), + text(""), + line(length: 100%), + text(size: 14pt, font: song, tracking: 9pt, "指导教员"), + align(center, text(size: 14pt, font: song, advisor)), + text(size: 14pt, font: song, tracking: 54pt, "职称"), + align(center, text(size: 14pt, font: song, jobtitle)), + text(""), + line(length: 100%), + text(""), + line(length: 100%), + text(size: 14pt, font: song, tracking: 20pt, "实验室"), + align(center, text(size: 14pt, font: song, lab)), + text(size: 14pt, font: song, tracking: 9pt, "实验时间"), + align(center, text(size: 14pt, font: song, date)), + text(""), + line(length: 100%), + text(""), + line(length: 100%), + ) + + v(50.5pt) + align(center, text(font: hei, size: 15pt, "国防科技大学教育训练部制")) + + pagebreak() + + set page( + margin: (left: 30mm, right: 30mm, top: 30mm, bottom: 30mm), + numbering: "i", + number-align: center, + ) + + v(14pt) + align(center)[ + #block(text(font: hei, size: 14pt, "《本科实验报告》填写说明")) + ] + + v(14pt) + text("") + par(first-line-indent: 2em, text(font: song, size: 12pt, "实验报告内容编排应符合以下要求:")) + + par(first-line-indent: 2em, text(font: fsong, size: 12pt, "(1)采用A4(21cm×29.7cm)白色复印纸,单面黑字。上下左右各侧的页边距均为3cm;缺省文档网格:字号为小4号,中文为宋体,英文和阿拉伯数字为Times New Roman,每页30行,每行36字;页脚距边界为2.5cm,页码置于页脚、居中,采用小5号阿拉伯数字从1开始连续编排,封面不编页码。")) + + par(first-line-indent: 2em, text(font: fsong, size: 12pt, "(2)报告正文最多可设四级标题,字体均为黑体,第一级标题字号为4号,其余各级标题为小4号;标题序号第一级用“一、”、“二、”……,第二级用“(一)”、“(二)” ……,第三级用“1.”、“2.” ……,第四级用“(1)”、“(2)” ……,分别按序连续编排。")) + + par(first-line-indent: 2em, text(font: fsong, size: 12pt, "(3)正文插图、表格中的文字字号均为5号。")) + + pagebreak() + + set page( + margin: (left: 30mm, right: 30mm, top: 30mm, bottom: 30mm), + numbering: "1", + number-align: center, + ) + + set heading(numbering: "1.1") + // set text(font: hei, lang: "zh") + + show heading: it => box(width: 100%)[ + #v(0.50em) + #set text(font: hei) + #counter(heading).display() + // #h(0.5em) + #it.body + ] + // Main body. + set par(justify: true) + + body +} + +#let para(t) = par(first-line-indent: 2em, text(font: song, size: 10.5pt, t)) + diff --git a/network/arpicmplab/main.typ b/network/arpicmplab/main.typ new file mode 100755 index 0000000..bcb4715 --- /dev/null +++ b/network/arpicmplab/main.typ @@ -0,0 +1,180 @@ +#import "labtemplate.typ": * +#show: nudtlabpaper.with(title: "TCP/IP 协议栈 ARP 协议实现实验", + author: "程景愉", + id: "202302723005", + training_type: "无军籍", + grade: "2023", + major: "网络工程", + department: "计算机学院", + advisor: "逄德明", + jobtitle: "教授", + lab: "307-211", + date: "2026.1.10", + header_str: "《计算机网络》实验报告", +) + +#set page(header: [ + #set par(spacing: 6pt) + #align(center)[#text(size: 11pt)[《计算机网络》实验报告]] + #v(-0.3em) + #line(length: 100%, stroke: (thickness: 1pt)) +],) + + #show heading: it => box(width: 100%)[ + #v(0.50em) + #set text(font: hei) + #it.body + ] + +#outline(title: "目录",depth: 3, indent: 1em) +#pagebreak() +#outline( + title: [图目录], + target: figure.where(kind: image), +) + + #show heading: it => box(width: 100%)[ + #v(0.50em) + #set text(font: hei) + #counter(heading).display() + // #h(0.5em) + #it.body + ] +#set enum(indent: 0.5em,body-indent: 0.5em,) +#pagebreak() + + += 实验概要 +== 实验内容 +#para[ + 本次实验的主要内容 ARP 协议实现。本次实验包含基础任务和拓展任务两部分, + 具体任务要求如下: + + - 基础任务:编写程序,完善 TCP/IP 协议栈的 ARP 协议部分。围绕 ARP 的初始化、无回报 ARP 的生成、ARP 的输入处理,以及 ARP 的超时重新请 求几个部分完成。并且保证完成 ARP 协议的完整实现。 + + - 拓展任务:拓展任务是可选任务,在基础任务实现的 ARP 协议实现基础上 + + ARP 多个表项的实现; + + IP 层的输入输出处理。 +] +== 实验要求 +#para[ + 本实验的具体过程及对应要求如下: + - 实验开始前准备工作:在实验开始前,学员需要掌握 C语言 编程基础,理解 TCP/IP 协议栈的工作原理,尤其是 ARP 协议的功能和作用。同时,熟悉 MAC 地址与 IP 地址的转换原理,了解网络设备如何通过 ARP 请求与响应进行地址解析。 + - 实验过程中:按照实验要求,完成 ARP 协议的实现。具体步骤包括:具体而言,构造 ARP 请求和响应报文,实现报文格式的编码与解析。发送 ARP请求,构建并广播 ARP 请求,获取目标设备的 MAC 地址。处理 ARP 响应,在收到响应后,提取并记录目标 IP 与 MAC 地址的映射。管理 ARP 缓存,设计缓存机制,存储 IP-MAC 映射,并实现超时处理机制。 + - 实验结束后:总结 ARP 协议的实现过程,详细描述报文格式、缓存管理和通信流程,并根据实验要求撰写实验报告,分析实验结果。 +] +== 实验目的 +#para[ + 在现代网络环境中, ARP协议广泛应用于各种网络设备和系统,如计算机、路由器和交换机等。深入理解ARP的工作原理,有助于掌握网络设备之间的通信机制,理解数据在网络中的传输过程。特别是对于网络工程和网络安全领域,从协议层面了解ARP,有助于识别和防范诸如ARP欺骗等网络攻击,提高网络的安全防护能力。 + + 通过本次实验,学员将亲自动手实现ARP协议的核心功能,包括ARP请求与响应的构建与解析、ARP缓存表的管理等。这不仅加深了对TCP/IP协议栈的理解,也培养了实际编程和问题解决的能力。掌握ARP协议的实现,对后续学习更复杂的网络协议(如IP、ICMP、TCP和UDP)以及从事网络相关工作都有重要的意义。 +] +// Display inline code in a small box +// that retains the correct baseline. +#show raw.where(block: false): it => box( + text(font: ("Consolas","FangSong_GB2312"), it), + fill: luma(240), + inset: (x: 3pt, y: 0pt), + outset: (y: 3pt), + radius: 2pt, +) + +// Display block code in a larger block +// with more padding. +#show raw.where(block: true): it => block( + text(font: ("Consolas","FangSong_GB2312"), it), + fill: luma(240), + inset: 10pt, + radius: 4pt, + width: 100%, +) + += 实验原理及方案 +#para[ + ARP(地址解析协议)是 TCP/IP 协议族中用于将 IP 地址解析为 MAC 地址的重要协议。IP 通信依赖于数据链路层的硬件地址(MAC 地址),而 ARP 负责动态地将网络层的 IP 地址转换为对应的数据链路层 MAC 地址,从而实现设备间的通信。ARP 协议的实现主要包括发送 ARP 请求、接收并处理 ARP 响应、更新 ARP 缓存、以及缓存超时机制。 +] +== ARP的初始化 +#para[ + 在一个典型的局域网中,设备通过 IP 地址进行网络层通信,但 IP 地址并不能直接用于数据链路层传输。以太网等数据链路层协议使用 MAC 地址进行通信,因此,发送设备需要将目标 IP 地址解析为 MAC 地址才能发送数据帧。 + + 如果该设备的 ARP 缓存中没有目标设备的 MAC 地址映射,它会广播 ARP 请求,询问网络上哪个设备持有特定的 IP 地址。ARP 请求是一个以太网层的广播包,发送到子网内所有设备,只有持有目标 IP 地址的设备才会进行响应。 + + ARP 初始化的过程是设备发现并解析网络中其他设备的关键步骤。ARP 请求包含源设备的 IP 地址和 MAC 地址,而目标设备通过 ARP 响应提供其对应的 MAC 地址。这个机制确保设备能够通过网络层(IP 地址)和链路层(MAC 地址)之间建立正确的映射关系。 +] +== 无回报 ARP 的生成 +#para[ + 无回报 ARP(Gratuitous ARP),又称为“主动 ARP”或“自愿 ARP”,是一种特殊的 ARP 操作。与典型的 ARP 请求不同,无回报 ARP 并不是为了解析目标设备的 MAC 地址,而是设备主动向网络发送广播 ARP 包,通常用于更新网络中的 IP-MAC 映射关系、检测 IP 地址冲突等。 + +无回报 ARP 是设备主动广播自身的 IP 地址和 MAC 地址,不带有显式的 ARP 请求和响应互动。其主要目的是通知网络中其他设备更新其 ARP 缓存表中的信息。这种情况下,设备并不期待其他设备回应。它是单向广播的,通常被用于下列几种情况: + +- 更新网络中的 ARP 表:当设备的 MAC 地址或 IP 地址发生变动时,可以主动发送无回报 ARP,以便通知网络中其他设备更新其 ARP 缓存。 +- IP 冲突检测:设备在启动时,通过发送无回报 ARP 来检测是否有其他设备占用了相同的 IP 地址。如果另一台设备使用了相同的 IP 地址,它会回应此 ARP 广播,从而帮助设备检测到 IP 冲突。 +- 负载均衡器和高可用性系统:当系统切换主备设备时,备设备通常会发送无回报 ARP 来通知网络中的所有节点其 IP-MAC 映射已经改变,避免继续向已下线的设备发送数据。 + +无回报 ARP 的生成过程如下: + +1. 生成 ARP 广播包:设备在确定需要广播自身 IP-MAC 映射时,会生成一个 ARP 广播包。该包包含设备自身的 IP 地址和 MAC 地址,并且目标硬件地址设置为全 0,因为无回报 ARP 并不是请求对方设备的 MAC 地址,而是向网络中的所有设备广播自身的信息。 +2. 设置操作码为 ARP 请求:尽管无回报 ARP 是主动广播,但它在帧结构中被标记为 ARP 请求(操作码为 1),这使得网络中的其他设备会将其视为一种信息广播,用于更新 ARP 缓存。 +3. 发送广播:ARP 广播包通过以太网层进行传输,目标 MAC 地址为 FF:FF:FF:FF:FF:FF,即局域网内的所有设备都可以接收到此广播。 +4. 网络中的设备处理:网络中所有收到此广播的设备会检查 ARP 包中的发送方 IP 地址和 MAC 地址,并将其更新到本地的 ARP 缓存表中。这样,即使该 IP 地址之前未出现在这些设备的 ARP 表中,它们也会记录并更新新的映射。 +] +== ARP 的输入处理 +#para[ + ARP(地址解析协议)的输入处理指的是设备在接收到 ARP 请求或响应时,如何对该 ARP 报文进行解析和处理,并据此更新设备的 ARP 缓存,或进一步采取必要的网络行为。ARP 输入处理的核心任务是解析报文,更新 ARP 缓存,并根据报文类型采取不同的操作。 + + 在这部分有以下步骤: + + - 接收 ARP 报文:设备通过网络接口接收到 ARP 报文,无论是广播还是单播形式。这些 ARP 报文可以是 ARP 请求、ARP 响应,或者是无回报 ARP。 + - 解析 ARP 报文:设备对 ARP 报文进行解析,提取其中的关键信息。 + - 检查报文有效性:设备检查 ARP 报文的有效性,包括检查硬件类型是否为以太网、协议类型是否为 IPv4、操作码是否为合法的请求或响应。如果报文不符合 ARP 协议规定,设备将丢弃该报文。 + - 更新 ARP 缓存:根据 ARP 报文中的信息,设备更新自己的 ARP 缓存表。设备通常会把报文中的发送方 IP 地址和发送方 MAC 地址映射记录下来,以便将来进行快速的 IP 到 MAC 地址解析。 + - 据操作码进行处理:不同类型的 ARP 报文有不同的处理方式: + - 如果接收到的是 ARP 请求,设备需要检查目标 IP 地址是否与自身的 IP 地址匹配,如果匹配,则需要发送一个 ARP 响应包,告知请求设备自己的 MAC 地址。 + - 如果接收到的是 ARP 响应,设备会根据响应包中的信息,更新或添加到 ARP 缓存表,并不再发送进一步的响应。 + - 如果接收到的是无回报 ARP,设备会将报文中的 IP-MAC 映射记录下来,以更新其 ARP 缓存。 +] +== ARP 的超时重新请求机制 +#para[ + ARP(地址解析协议)的超时重新请求机制指的是设备在尝试解析某个 IP 地址到 MAC 地址时,若未能在设定的时间内收到响应,会采取的重发 ARP 请求的策略。这种机制旨在保证网络设备在通信中能够及时获取目标设备的 MAC 地址,并维持 ARP 缓存的准确性。 + + ARP 缓存存储的是 IP 地址与 MAC 地址之间的映射关系。在通信过程中,网络设备通常会先查询 ARP 缓存以查找目标设备的 MAC 地址。如果缓存中存在该 IP 地址的记录,设备会直接使用缓存中的 MAC 地址进行通信;如果没有找到相应记录,设备会发出 ARP 请求,广播请求目标 IP 地址对应的 MAC 地址。 + + 如果设备在发送 ARP 请求后,未能在指定的时间内收到 ARP 响应,它会认为该 ARP 请求失败。这时,设备会重新发送 ARP 请求,通常会进行一定次数的重发,以确保能够成功解析目标设备的 MAC 地址。 +] += 实验环境 +== 实验设备与软件 +#para[ +#align(center)[#table( + columns: (auto, auto), + rows:(auto,auto,auto), + inset: 10pt, + align: horizon+center, + table.header( + [*名称*], [*型号或版本*], + ), + "物理机", "联想ThinkPad T14", + "Wireshark", "Wireshark 4.6.3", + "CMake", "CMake 4.2.1" +)] +] += 实验步骤 +== 环境配置 +=== 网络配置 +#para[ +] += 实验总结 +== 内容总结 +#para[ +] +== 心得感悟 +#para[ +] +#show heading: it => box(width: 100%)[ + #v(0.50em) + #set text(font: hei) + // #counter(heading).display() + // #h(0.5em) + #it.body +] +#pagebreak() +#bibliography("ref.yml",full: true,title: "参考文献",style:"gb-7714-2015-numeric") diff --git a/network/arpicmplab/ref.yml b/network/arpicmplab/ref.yml new file mode 100755 index 0000000..07a4b20 --- /dev/null +++ b/network/arpicmplab/ref.yml @@ -0,0 +1,44 @@ +cmake_tutorial_csdn: + type: Web + title: "【一学就会】(一)C++编译工具链——基于VSCode的CMake、make与g++简单理解与应用示例" + author: "未知作者" + url: + value: "https://blog.csdn.net/weixin_46248871/article/details/137500744" + date: 2024-12-31 + abstract: "本文详细介绍了CMake、make与g++的基本概念、优劣比较以及应用示例,包括工具安装配置、CMake使用示例、g++使用教程等。" + +cmake_detailed_tutorial_csdn: + type: Web + title: "cmake使用详细教程(日常使用这一篇就足够了)" + author: "李吱恩" + url: + value: "https://blog.csdn.net/iuu77/article/details/129229361" + date: 2023-11-28 + abstract: "本文为博主原创文章,提供了cmake的详细使用教程,包括cmake安装、使用cmake配合程序编译的多种情况,如单个源文件程序编译、多个源文件、头文件在不同文件夹等场景。" + +rfc791_internet_protocol: + type: Web + title: "INTERNET PROTOCOL" + author: "Jon Postel" + url: + value: "https://www.rfc-editor.org/rfc/rfc791" + date: 1981-09 + abstract: "RFC 791 定义了互联网协议(IP),这是TCP/IP协议栈中的核心协议之一,负责在网络中传输数据包。文档详细介绍了IP协议的规范和操作。" + +windows_network_commands_cnblogs: + type: Web + title: "windows网络命令:ping、ipconfig、tracert、netstat、arp" + author: "刘玉坦" + url: + value: "https://www.cnblogs.com/liuyutan/p/13289747.html" + date: 2024-12-31 + abstract: "本文介绍了Windows系统中常用的网络诊断命令,包括ping、ipconfig、tracert、netstat和arp,以及它们的使用场景和参数说明。" + +bilibili_tcp_ip_stack: + type: Web + title: "c03.00 IP层的输入处理(2)" + author: "哔哩哔哩用户" + url: + value: "https://www.bilibili.com/video/BV1KL4y1P7vG" + date: 2024-12-31 + abstract: "视频教程,完全从0开始手写一个超轻量级的TCP/IP网络协议栈,支持以太网、ARP、IP、UDP、TCP协议,并实现了一个超小型的HTTP服务器。" \ No newline at end of file