1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

update&fix:基于TCP/UDP 的协议的协议完善&Redis跳表描述修正

This commit is contained in:
Guide 2025-05-12 16:48:50 +08:00
parent b1867d3f44
commit 8745a28fa1
2 changed files with 52 additions and 31 deletions

View File

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

View File

@ -283,33 +283,39 @@ public void add(int value) {
查询逻辑比较简单,从跳表最高级的索引开始定位找到小于要查的 value 的最大值,以下图为例,我们希望查找到节点 8
1. 跳表的 3 级索引首先找找到 5 的索引5 的 3 级索引 **forwards[3]** 指向空,索引直接向下。
2. 来到 5 的 2 级索引,其后继 **forwards[2]** 指向 8继续向下。
3. 5 的 1 级索引 **forwards[1]** 指向索引 6继续向前。
4. 索引 6 的 **forwards[1]** 指向索引 8继续向下。
5. 我们在原始节点向前找到节点 7。
6. 节点 7 后续就是节点 8继续向前为节点 8无法继续向下结束搜寻。
7. 判断 7 的前驱,等于 8查找结束。
![](https://oss.javaguide.cn/javaguide/database/redis/skiplist/202401222005323.png)
- **从最高层级开始 (3 级索引)** :查找指针 `p` 从头节点开始。在 3 级索引上,`p` 的后继 `forwards[2]`(假设最高 3 层,索引从 0 开始)指向节点 `5`。由于 `5 < 8`,指针 `p` 向右移动到节点 `5`。节点 `5` 在 3 级索引上的后继 `forwards[2]``null`(或指向一个大于 `8` 的节点,图中未画出)。当前层级向右查找结束,指针 `p` 保持在节点 `5`**向下移动到 2 级索引**。
- **在 2 级索引**:当前指针 `p` 为节点 `5``p` 的后继 `forwards[1]` 指向节点 `8`。由于 `8` 不小于 `8`(即 `8 < 8``false`),当前层级向右查找结束(`p` 不会移动到节点 `8`)。指针 `p` 保持在节点 `5`**向下移动到 1 级索引**。
- **在 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` 循环结束。
- **最终定位与检查** :经过所有层级的查找,指针 `p` 最终停留在最底层0 级索引)的节点 `7`。这个节点是整个跳表中值小于目标值 `8` 的那个最大的节点。检查节点 `7` 的**后继节点**(即 `p.forwards[0]``p.forwards[0]` 指向节点 `8`。判断 `p.forwards[0].data`(即节点 `8` 的值)是否等于目标值 `8`。条件满足(`8 == 8`**查找成功,找到节点 `8`**。
所以我们的代码实现也很上述步骤差不多,从最高级索引开始向前查找,如果不为空且小于要查找的值,则继续向前搜寻,遇到不小于的节点则继续向下,如此往复,直到得到当前跳表中小于查找值的最大节点,查看其前驱是否等于要查找的值:
```java
public Node get(int value) {
Node p = h;
//找到小于value的最大值
Node p = h; // 从头节点开始
// 从最高层级索引开始,逐层向下
for (int i = levelCount - 1; i >= 0; i--) {
// 在当前层级向右查找,直到 p.forwards[i] 为 null
// 或者 p.forwards[i].data 大于等于目标值 value
while (p.forwards[i] != null && p.forwards[i].data < value) {
p = p.forwards[i];
p = p.forwards[i]; // 向右移动
}
}
//如果p的前驱节点等于value则直接返回
if (p.forwards[0] != null && p.forwards[0].data == value) {
return p.forwards[0];
// 此时 p.forwards[i] 为 null或者 p.forwards[i].data >= value
// 或者 p 是当前层级中小于 value 的最大节点(如果存在这样的节点)
}
return null;
// 经过所有层级的查找p 现在是原始链表0级索引
// 小于目标值 value 的最大节点(或者头节点,如果所有元素都大于等于 value
// 检查 p 在原始链表中的下一个节点是否是目标值
if (p.forwards[0] != null && p.forwards[0].data == value) {
return p.forwards[0]; // 找到了,返回该节点
}
return null; // 未找到
}
```