Skip to content

Commit 8745a28

Browse files
committed
update&fix:基于TCP/UDP 的协议的协议完善&Redis跳表描述修正
1 parent b1867d3 commit 8745a28

File tree

2 files changed

+54
-33
lines changed

2 files changed

+54
-33
lines changed

docs/cs-basics/network/other-network-questions2.md

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -101,25 +101,40 @@ HTTP/3.0 之前是基于 TCP 协议的,而 HTTP/3.0 将弃用 TCP,改用 **
101101
- <https://zh.wikipedia.org/zh/HTTP/3>
102102
- <https://datatracker.ietf.org/doc/rfc9114/>
103103

104-
### 使用 TCP 的协议有哪些?使用 UDP 的协议有哪些?
105-
106-
**运行于 TCP 协议之上的协议**
107-
108-
1. **HTTP 协议(HTTP/3.0 之前)**:超文本传输协议(HTTP,HyperText Transfer Protocol)是一种用于传输超文本和多媒体内容的协议,主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的。
109-
2. **HTTPS 协议**:更安全的超文本传输协议(HTTPS,Hypertext Transfer Protocol Secure),身披 SSL 外衣的 HTTP 协议
110-
3. **FTP 协议**:文件传输协议 FTP(File Transfer Protocol)是一种用于在计算机之间传输文件的协议,可以屏蔽操作系统和文件存储方式。注意 ⚠️:FTP 是一种不安全的协议,因为它在传输过程中不会对数据进行加密。建议在传输敏感数据时使用更安全的协议,如 SFTP。
111-
4. **SMTP 协议**:简单邮件传输协议(SMTP,Simple Mail Transfer Protocol)的缩写,是一种用于发送电子邮件的协议。注意 ⚠️:SMTP 协议只负责邮件的发送,而不是接收。要从邮件服务器接收邮件,需要使用 POP3 或 IMAP 协议。
112-
5. **POP3/IMAP 协议**:两者都是负责邮件接收的协议。IMAP 协议是比 POP3 更新的协议,它在功能和性能上都更加强大。IMAP 支持邮件搜索、标记、分类、归档等高级功能,而且可以在多个设备之间同步邮件状态。几乎所有现代电子邮件客户端和服务器都支持 IMAP。
113-
6. **Telnet 协议**:用于通过一个终端登陆到其他服务器。Telnet 协议的最大缺点之一是所有数据(包括用户名和密码)均以明文形式发送,这有潜在的安全风险。这就是为什么如今很少使用 Telnet,而是使用一种称为 SSH 的非常安全的网络传输协议的主要原因。
114-
7. **SSH 协议** : SSH( Secure Shell)是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH 建立在可靠的传输协议 TCP 之上。
115-
8. ……
116-
117-
**运行于 UDP 协议之上的协议**
118-
119-
1. **HTTP 协议(HTTP/3.0 )**: HTTP/3.0 弃用 TCP,改用基于 UDP 的 QUIC 协议 。
120-
2. **DHCP 协议**:动态主机配置协议,动态配置 IP 地址
121-
3. **DNS**:域名系统(DNS,Domain Name System)将人类可读的域名 (例如,www.baidu.com) 转换为机器可读的 IP 地址 (例如,220.181.38.148)。 我们可以将其理解为专为互联网设计的电话薄。实际上,DNS 同时支持 UDP 和 TCP 协议。
122-
4. ……
104+
### 你知道哪些基于 TCP/UDP 的协议?
105+
106+
TCP (传输控制协议) 和 UDP (用户数据报协议) 是互联网传输层的两大核心协议,它们为各种应用层协议提供了基础的通信服务。以下是一些常见的、分别构建在 TCP 和 UDP 之上的应用层协议:
107+
108+
**运行于 TCP 协议之上的协议 (强调可靠、有序传输):**
109+
110+
| 中文全称 (缩写) | 英文全称 | 主要用途 | 说明与特性 |
111+
| -------------------------- | ---------------------------------- | ---------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
112+
| 超文本传输协议 (HTTP) | HyperText Transfer Protocol | 传输网页、超文本、多媒体内容 | **HTTP/1.x 和 HTTP/2 基于 TCP**。早期版本不加密,是 Web 通信的基础。 |
113+
| 安全超文本传输协议 (HTTPS) | HyperText Transfer Protocol Secure | 加密的网页传输 | 在 HTTP 和 TCP 之间增加了 SSL/TLS 加密层,确保数据传输的机密性和完整性。 |
114+
| 文件传输协议 (FTP) | File Transfer Protocol | 文件传输 | 传统的 FTP **明文传输**,不安全。推荐使用其安全版本 **SFTP (SSH File Transfer Protocol)****FTPS (FTP over SSL/TLS)**|
115+
| 简单邮件传输协议 (SMTP) | Simple Mail Transfer Protocol | **发送**电子邮件 | 负责将邮件从客户端发送到服务器,或在邮件服务器之间传递。可通过 **STARTTLS** 升级到加密传输。 |
116+
| 邮局协议第 3 版 (POP3) | Post Office Protocol version 3 | **接收**电子邮件 | 通常将邮件从服务器**下载到本地设备后删除服务器副本** (可配置保留)。**POP3S** 是其 SSL/TLS 加密版本。 |
117+
| 互联网消息访问协议 (IMAP) | Internet Message Access Protocol | **接收和管理**电子邮件 | 邮件保留在服务器,支持多设备同步邮件状态、文件夹管理、在线搜索等。**IMAPS** 是其 SSL/TLS 加密版本。现代邮件服务首选。 |
118+
| 远程终端协议 (Telnet) | Teletype Network | 远程终端登录 | **明文传输**所有数据 (包括密码),安全性极差,基本已被 SSH 完全替代。 |
119+
| 安全外壳协议 (SSH) | Secure Shell | 安全远程管理、加密数据传输 | 提供了加密的远程登录和命令执行,以及安全的文件传输 (SFTP) 等功能,是 Telnet 的安全替代品。 |
120+
121+
**运行于 UDP 协议之上的协议 (强调快速、低开销传输):**
122+
123+
| 中文全称 (缩写) | 英文全称 | 主要用途 | 说明与特性 |
124+
| ----------------------- | ------------------------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------ |
125+
| 超文本传输协议 (HTTP/3) | HyperText Transfer Protocol version 3 | 新一代网页传输 | 基于 **QUIC** 协议 (QUIC 本身构建于 UDP 之上),旨在减少延迟、解决 TCP 队头阻塞问题,支持 0-RTT 连接建立。 |
126+
| 动态主机配置协议 (DHCP) | Dynamic Host Configuration Protocol | 动态分配 IP 地址及网络配置 | 客户端从服务器自动获取 IP 地址、子网掩码、网关、DNS 服务器等信息。 |
127+
| 域名系统 (DNS) | Domain Name System | 域名到 IP 地址的解析 | **通常使用 UDP** 进行快速查询。当响应数据包过大或进行区域传送 (AXFR) 时,会**切换到 TCP** 以保证数据完整性。 |
128+
| 实时传输协议 (RTP) | Real-time Transport Protocol | 实时音视频数据流传输 | 常用于 VoIP、视频会议、直播等。追求低延迟,允许少量丢包。通常与 RTCP 配合使用。 |
129+
| RTP 控制协议 (RTCP) | RTP Control Protocol | RTP 流的质量监控和控制信息 | 配合 RTP 工作,提供丢包、延迟、抖动等统计信息,辅助流量控制和拥塞管理。 |
130+
| 简单文件传输协议 (TFTP) | Trivial File Transfer Protocol | 简化的文件传输 | 功能简单,常用于局域网内无盘工作站启动、网络设备固件升级等小文件传输场景。 |
131+
| 简单网络管理协议 (SNMP) | Simple Network Management Protocol | 网络设备的监控与管理 | 允许网络管理员查询和修改网络设备的状态信息。 |
132+
| 网络时间协议 (NTP) | Network Time Protocol | 同步计算机时钟 | 用于在网络中的计算机之间同步时间,确保时间的一致性。 |
133+
134+
**总结一下:**
135+
136+
- **TCP** 更适合那些对数据**可靠性、完整性和顺序性**要求高的应用,如网页浏览 (HTTP/HTTPS)、文件传输 (FTP/SFTP)、邮件收发 (SMTP/POP3/IMAP)。
137+
- **UDP** 则更适用于那些对**实时性要求高、能容忍少量数据丢失**的应用,如域名解析 (DNS)、实时音视频 (RTP)、在线游戏、网络管理 (SNMP) 等。
123138

124139
### TCP 三次握手和四次挥手(非常重要)
125140

docs/database/redis/redis-skiplist.md

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -283,33 +283,39 @@ public void add(int value) {
283283

284284
查询逻辑比较简单,从跳表最高级的索引开始定位找到小于要查的 value 的最大值,以下图为例,我们希望查找到节点 8:
285285

286-
1. 跳表的 3 级索引首先找找到 5 的索引,5 的 3 级索引 **forwards[3]** 指向空,索引直接向下。
287-
2. 来到 5 的 2 级索引,其后继 **forwards[2]** 指向 8,继续向下。
288-
3. 5 的 1 级索引 **forwards[1]** 指向索引 6,继续向前。
289-
4. 索引 6 的 **forwards[1]** 指向索引 8,继续向下。
290-
5. 我们在原始节点向前找到节点 7。
291-
6. 节点 7 后续就是节点 8,继续向前为节点 8,无法继续向下,结束搜寻。
292-
7. 判断 7 的前驱,等于 8,查找结束。
293-
294286
![](https://oss.javaguide.cn/javaguide/database/redis/skiplist/202401222005323.png)
295287

288+
- **从最高层级开始 (3 级索引)** :查找指针 `p` 从头节点开始。在 3 级索引上,`p` 的后继 `forwards[2]`(假设最高 3 层,索引从 0 开始)指向节点 `5`。由于 `5 < 8`,指针 `p` 向右移动到节点 `5`。节点 `5` 在 3 级索引上的后继 `forwards[2]``null`(或指向一个大于 `8` 的节点,图中未画出)。当前层级向右查找结束,指针 `p` 保持在节点 `5`**向下移动到 2 级索引**
289+
- **在 2 级索引**:当前指针 `p` 为节点 `5``p` 的后继 `forwards[1]` 指向节点 `8`。由于 `8` 不小于 `8`(即 `8 < 8``false`),当前层级向右查找结束(`p` 不会移动到节点 `8`)。指针 `p` 保持在节点 `5`**向下移动到 1 级索引**
290+
- **在 1 级索引** :当前指针 `p` 为节点 `5``p` 的后继 `forwards[0]` 指向最底层的节点 `5`。由于 `5 < 8`,指针 `p` 向右移动到最底层的节点 `5`。此时,当前指针 `p` 为最底层的节点 `5`。其后继 `forwards[0]` 指向最底层的节点 `6`。由于 `6 < 8`,指针 `p` 向右移动到最底层的节点 `6`。当前指针 `p` 为最底层的节点 `6`。其后继 `forwards[0]` 指向最底层的节点 `7`。由于 `7 < 8`,指针 `p` 向右移动到最底层的节点 `7`。当前指针 `p` 为最底层的节点 `7`。其后继 `forwards[0]` 指向最底层的节点 `8`。由于 `8` 不小于 `8`(即 `8 < 8``false`),当前层级向右查找结束。此时,已经遍历完所有层级,`for` 循环结束。
291+
- **最终定位与检查** :经过所有层级的查找,指针 `p` 最终停留在最底层(0 级索引)的节点 `7`。这个节点是整个跳表中值小于目标值 `8` 的那个最大的节点。检查节点 `7`**后继节点**(即 `p.forwards[0]`):`p.forwards[0]` 指向节点 `8`。判断 `p.forwards[0].data`(即节点 `8` 的值)是否等于目标值 `8`。条件满足(`8 == 8`),**查找成功,找到节点 `8`**
292+
296293
所以我们的代码实现也很上述步骤差不多,从最高级索引开始向前查找,如果不为空且小于要查找的值,则继续向前搜寻,遇到不小于的节点则继续向下,如此往复,直到得到当前跳表中小于查找值的最大节点,查看其前驱是否等于要查找的值:
297294

298295
```java
299296
public Node get(int value) {
300-
Node p = h;
301-
//找到小于value的最大值
297+
Node p = h; // 从头节点开始
298+
299+
// 从最高层级索引开始,逐层向下
302300
for (int i = levelCount - 1; i >= 0; i--) {
301+
// 在当前层级向右查找,直到 p.forwards[i] 为 null
302+
// 或者 p.forwards[i].data 大于等于目标值 value
303303
while (p.forwards[i] != null && p.forwards[i].data < value) {
304-
p = p.forwards[i];
304+
p = p.forwards[i]; // 向右移动
305305
}
306+
// 此时 p.forwards[i] 为 null,或者 p.forwards[i].data >= value
307+
// 或者 p 是当前层级中小于 value 的最大节点(如果存在这样的节点)
306308
}
307-
//如果p的前驱节点等于value则直接返回
309+
310+
// 经过所有层级的查找,p 现在是原始链表(0级索引)中
311+
// 小于目标值 value 的最大节点(或者头节点,如果所有元素都大于等于 value)
312+
313+
// 检查 p 在原始链表中的下一个节点是否是目标值
308314
if (p.forwards[0] != null && p.forwards[0].data == value) {
309-
return p.forwards[0];
315+
return p.forwards[0]; // 找到了,返回该节点
310316
}
311317

312-
return null;
318+
return null; // 未找到
313319
}
314320
```
315321

0 commit comments

Comments
 (0)