Skip to content

Commit

Permalink
完善 UDP 协议。
Browse files Browse the repository at this point in the history
  • Loading branch information
jacky committed Mar 25, 2024
1 parent b96d9cf commit df7f3b5
Show file tree
Hide file tree
Showing 9 changed files with 37 additions and 23 deletions.
36 changes: 18 additions & 18 deletions .obsidian/workspace.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"state": {
"type": "markdown",
"state": {
"file": "docs/Network/运输层:UDP.md",
"file": "docs/Network/Network Tips.md",
"mode": "source",
"source": false
}
Expand Down Expand Up @@ -48,8 +48,8 @@
"state": {
"type": "search",
"state": {
"query": "PG",
"matchingCase": false,
"query": "",
"matchingCase": true,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
Expand Down Expand Up @@ -85,7 +85,7 @@
"state": {
"type": "backlink",
"state": {
"file": "docs/Network/运输层:UDP.md",
"file": "docs/Network/Network Tips.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
Expand All @@ -102,7 +102,7 @@
"state": {
"type": "outgoing-link",
"state": {
"file": "docs/Network/运输层:UDP.md",
"file": "docs/Network/Network Tips.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
}
Expand All @@ -125,7 +125,7 @@
"state": {
"type": "outline",
"state": {
"file": "docs/Network/运输层:UDP.md"
"file": "docs/Network/Network Tips.md"
}
}
}
Expand All @@ -138,48 +138,48 @@
},
"left-ribbon": {
"hiddenItems": {
"vscode-editor:新建代码文件": false,
"switcher:打开快速切换": false,
"graph:查看关系图谱": false,
"canvas:新建白板": false,
"daily-notes:打开/创建今天的日记": false,
"templates:插入模板": false,
"command-palette:打开命令面板": false
"command-palette:打开命令面板": false,
"vscode-editor:新建代码文件": false
}
},
"active": "044546147249fa2a",
"lastOpenFiles": [
"docs/Network/网络层:IP.md",
"docs/Network/Network Tips.md",
"docs/Network/网络层:TCP.md",
"docs/Network/运输层:介绍.md",
"docs/Network/运输层:UDP.md",
"docs/Network/网络层:ICMP.md",
"docs/MySQL/MySQL Tips.md",
"mkdocs.yml",
"docs/index.md",
"docs/Linux/网络.md",
"docs/Linux/curl.md",
"docs/Linux/磁盘分区挂载.md",
"docs/OS/汇编——介绍.md",
"docs/OS/并发——锁.md",
"docs/OS/并发——多线程.md",
"docs/OS/OS Tips.md",
"docs/Algorithms/数据结构:图.md",
"docs/Algorithms/Base64 算法.md",
"docs/Algorithms/求解算数表达式的值.md",
"docs/Network/网络层:ICMP.md",
"docs/Network/运输层:介绍.md",
"docs/ML/Keras 入门.md",
"docs/DM/达梦安装.md",
"docs/Reading/读书计划.md",
"docs/Reading/2023.md",
"docs/Reading/2022.md",
"docs/Reading/2021.md",
"docs/Network/网络层:IP.md",
"docs/MySQL/MySQL Tips.md",
"docs/MySQL/MySQL 配置主从.md",
"docs/MySQL/备份 MySQL.md",
"docs/MySQL/安装 MySQL.md",
"docs/MySQL/忘记 root 用户密码.md",
"mkdocs.yml",
"docs/Docker/安装 Docker.md",
"overrides/partials/footer.html",
"overrides/partials/comments.html",
"docs/index.md",
"docs/index.html",
"docs/stylesheets/extra.css",
"docs/Java/Tips.md",
"docs/LocalFile/Picture/用户数据报的格式.png",
"docs/LocalFile/favicon.svg",
"template",
Expand Down
3 changes: 3 additions & 0 deletions docs/Network/Network Tips.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
1.为甚正常情况下计算出的校验和的值永远不会全是 1?

2.为什么校验和的计算要用反码,求和之后再取反码?
10 changes: 5 additions & 5 deletions docs/Network/网络层:ICMP.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ IP 协议尽最大努力的服务,把数据从源点交付到终点。但是

ICMP 的设计就是为了弥补上述两个缺憾的。ICMP 协议位于网络层,但是它的报文并不直接传输给数据链路层。实际上 ICMP 报文要首先封装成 IP 数据报,然后才被传递到下一层。

![](ICMP的封装.png)
![](../LocalFile/Picture/ICMP的封装.png)
## 报文格式

ICMP 报文由一个 **8 字节**的首部和可变长的数据部分组成。对于每种类型的报文,首部的格式一般都是不同的,但是前 4 个字节对所有的类型来说都是相同的。
Expand Down Expand Up @@ -38,7 +38,7 @@ ICMP 报文由一个 **8 字节**的首部和可变长的数据部分组成。
`echo-request``echo-reply` 报文是为了诊断而设计的。`echo-request``echo-reply` 组合起来确定了两个系统(主机或路由器)之间能否彼此通信。

echo-request 和 echo-reply 报文可以用来确定两台机器在 IP 级能够彼此通信。因为 ICMP 报文被封装成数据报,发送 echo-request 的机器在收到 echo-reply 回到报文时,就证明了发送方和接收方之间能够用 IP 数据报进行通信。此外,这还证明了中间的路由器能够接收、处理和转发数据报。通常使用 ping 命令来测试主机的可达性。
![](echo-reques和echo-reply报文.png)
![](../LocalFile/Picture/echo-reques和echo-reply报文.png)
标识符和序号字段在协议中没有正式定义,有意由发送方任意使用。标识符通常与发起请求的的进程ID是一致的。

echo-request 可以包含可选数据,这个数据必须由 echo-reply 在报文中一摸一样的重复一遍。
Expand All @@ -62,11 +62,11 @@ D:\suomea-note>ping baidu.com
```

wireshark 抓包过滤 icmp 能够看到对应的 echo-request 和 echo-reply 请求。
![[Pasted image 20240226202646.png]]
![](../LocalFile/Picture/PastedImage20240226202646.png)

第一个 echo-request 第一个 echo-reply 报文,对比能够发现两个报文的可选数据部分是一样的,均为 32 个字节。
![[Pasted image 20240226202811.png]]
![[Pasted image 20240226202900.png]]
![](../LocalFile/Picture/PastedImage20240226202811.png)
![](../LocalFile/Picture/PastedImage20240226202900.png)


### 时间戳请求和时间戳回答
Expand Down
2 changes: 2 additions & 0 deletions docs/Network/网络层:IP.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ IP 协议使用了一个计数器来为数据报生成标识,初始值为正

IP 分组中的校验和仅覆盖首部,而不管数据。两个原因,首先,将数据封装在 IP 数据包中的所有高层协议都有一个涉及整合分组的校验和字段。因此,IP 数据报的校验和就不必再检验所封装的数据。其次,每经过一个路由器,IP 数据报的首部都要发生变化,但数据部分保持不变。因此校验和只对发生变化的部分进行检验。

!!! note "IP 协议主要是为了路由和转发数据包,至于端到端的数据完整性校验交由上层的协议处理。"

发送方按照以下步骤计算:
1.把校验和字段置为零。

Expand Down
7 changes: 7 additions & 0 deletions docs/Network/运输层:UDP.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,10 @@ UDP 没有流量控制。

## 差错控制

除了校验和之外,UDP 没有提供其他差错控制机制。这就表示发送方并不知道报文是丢失了还是重复交付了。当接收方通过校验和检测出差错时,就直接丢掉这个用户数据报,缺少差错控制机制就意味着在必要时应当由使用 UDP 的进程来提供这种服务。

校验和的计算校验算法和 IP 协议类似。

UDP 校验和的计算包括三个部分:伪首部、UDP 首部以及应用层的数据。

UDP 分组的发送方可以选择不计算校验和。若不计算校验和,则在发送之前把校验和字段全部填入0。
2 changes: 2 additions & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ nav:
- OS/汇编——介绍.md
- OS/汇编——环境搭建.md
- OS/汇编——寄存器介绍.md
- Network/网络层:IP.md
- Network/网络层:ICMP.md
# - OS/并发——可视性的问题.md
# - OS/并发——条件变量.md
# - OS/并发——信号量.md
Expand Down

0 comments on commit df7f3b5

Please sign in to comment.