arplab report initilized
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -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
|
||||
|
||||
@@ -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. 总结
|
||||
|
||||
|
||||
154
network/arpicmplab/labtemplate.typ
Executable file
154
network/arpicmplab/labtemplate.typ
Executable file
@@ -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))
|
||||
|
||||
180
network/arpicmplab/main.typ
Executable file
180
network/arpicmplab/main.typ
Executable file
@@ -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")
|
||||
44
network/arpicmplab/ref.yml
Executable file
44
network/arpicmplab/ref.yml
Executable file
@@ -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服务器。"
|
||||
Reference in New Issue
Block a user