Skip to content

Commit f756b27

Browse files
committed
[docs add&update]完善网络面试题+新增 DNS 域名系统详解
1 parent 932a7b0 commit f756b27

File tree

8 files changed

+304
-24
lines changed

8 files changed

+304
-24
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
151151
- [HTTP vs HTTPS(应用层)](./docs/cs-basics/network/http&https.md)
152152
- [HTTP 1.0 vs HTTP 1.1(应用层)](./docs/cs-basics/network/http1.0&http1.1.md)
153153
- [HTTP 常见状态码(应用层)](./docs/cs-basics/network/http-status-codes.md)
154+
- [DNS 域名系统详解(应用层)](./docs/cs-basics/network/dns.md)
154155
- [TCP 三次握手和四次挥手(传输层)](./docs/cs-basics/network/tcp-connection-and-disconnection.md)
155156
- [TCP 传输可靠性保障(传输层)](./docs/cs-basics/network/tcp-reliability-guarantee.md)
156157
- [ARP 协议详解(网络层)](./docs/cs-basics/network/arp.md)

docs/.vuepress/sidebar.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ export const sidebarConfig = sidebar({
176176
"http&https",
177177
"http1.0&http1.1",
178178
"http-status-codes",
179+
"dns",
179180
"tcp-connection-and-disconnection",
180181
"tcp-reliability-guarantee",
181182
"arp",

docs/cs-basics/network/application-layer-protocol.md

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,23 @@ tag:
77

88
## HTTP:超文本传输协议
99

10-
**超文本传输协议(HTTP,HyperText Transfer Protocol)** 主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的,整个过程如下图所示
10+
**超文本传输协议(HTTP,HyperText Transfer Protocol)** 是一种用于传输超文本和多媒体内容的协议,主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的。
1111

12-
![](https://oss.javaguide.cn/github/javaguide/450px-HTTP-Header.png)
12+
HTTP 使用客户端-服务器模型,客户端向服务器发送 HTTP Request(请求),服务器响应请求并返回 HTTP Response(响应),整个过程如下图所示。
1313

14-
HTTP 协是基于 TCP协议,发送 HTTP 请求之前首先要建立 TCP 连接也就是要经历 3 次握手。目前使用的 HTTP 协议大部分都是 1.1。在 1.1 的协议里面,默认是开启了 Keep-Alive 的,这样的话建立的连接就可以在多次请求中被复用了。
14+
![](https://oss.javaguide.cn/github/javaguide/450px-HTTP-Header.png)
1515

16+
HTTP 协议基于 TCP 协议,发送 HTTP 请求之前首先要建立 TCP 连接也就是要经历 3 次握手。目前使用的 HTTP 协议大部分都是 1.1。在 1.1 的协议里面,默认是开启了 Keep-Alive 的,这样的话建立的连接就可以在多次请求中被复用了。
1617

1718
另外, HTTP 协议是”无状态”的协议,它无法记录客户端用户的状态,一般我们都是通过 Session 来记录客户端用户的状态。
1819

1920
## SMTP:简单邮件传输(发送)协议
2021

21-
**简单邮件传输(发送)协议(SMTP,Simple Mail Transfer Protocol)** 基于 TCP 协议,用来发送电子邮件。
22+
**简单邮件传输(发送)协议(SMTP,Simple Mail Transfer Protocol)** 基于 TCP 协议,是一种用于发送电子邮件的协议
2223

2324
![SMTP 协议](https://oss.javaguide.cn/github/javaguide/cs-basics/network/what-is-smtp.png)
2425

25-
注意⚠️:**接受邮件的协议不是 SMTP 而是 POP3 协议。**
26+
注意 ⚠️:**接受邮件的协议不是 SMTP 而是 POP3 协议。**
2627

2728
SMTP 协议这块涉及的内容比较多,下面这两个问题比较重要:
2829

@@ -33,15 +34,15 @@ SMTP 协议这块涉及的内容比较多,下面这两个问题比较重要:
3334

3435
比如我的邮箱是“dabai@cszhinan.com”,我要向“xiaoma@qq.com”发送邮件,整个过程可以简单分为下面几步:
3536

36-
1. 通过 **SMTP** 协议,我将我写好的邮件交给163邮箱服务器(邮局)。
37-
2. 163邮箱服务器发现我发送的邮箱是qq邮箱,然后它使用 SMTP协议将我的邮件转发到 qq邮箱服务器
38-
3. qq邮箱服务器接收邮件之后就通知邮箱为xiaoma@qq.com”的用户来收邮件,然后用户就通过 **POP3/IMAP** 协议将邮件取出。
37+
1. 通过 **SMTP** 协议,我将我写好的邮件交给 163 邮箱服务器(邮局)。
38+
2. 163 邮箱服务器发现我发送的邮箱是 qq 邮箱,然后它使用 SMTP 协议将我的邮件转发到 qq 邮箱服务器
39+
3. qq 邮箱服务器接收邮件之后就通知邮箱为xiaoma@qq.com”的用户来收邮件,然后用户就通过 **POP3/IMAP** 协议将邮件取出。
3940

4041
**如何判断邮箱是真正存在的?**
4142

4243
很多场景(比如邮件营销)下面我们需要判断我们要发送的邮箱地址是否真的存在,这个时候我们可以利用 SMTP 协议来检测:
4344

44-
1. 查找邮箱域名对应的 SMTP 服务器地址
45+
1. 查找邮箱域名对应的 SMTP 服务器地址
4546
2. 尝试与服务器建立连接
4647
3. 连接成功后尝试向需要验证的邮箱发送邮件
4748
4. 根据返回结果判定邮箱地址的真实性
@@ -54,13 +55,13 @@ SMTP 协议这块涉及的内容比较多,下面这两个问题比较重要:
5455

5556
## POP3/IMAP:邮件接收的协议
5657

57-
这两个协议没必要多做阐述,只需要了解 **POP3 和 IMAP 两者都是负责邮件接收的协议**即可。另外,需要注意不要将这两者和 SMTP 协议搞混淆了。**SMTP 协议只负责邮件的发送,真正负责接收的协议是POP3/IMAP。**
58+
这两个协议没必要多做阐述,只需要了解 **POP3 和 IMAP 两者都是负责邮件接收的协议** 即可(二者也是基于 TCP 协议)。另外,需要注意不要将这两者和 SMTP 协议搞混淆了。**SMTP 协议只负责邮件的发送,真正负责接收的协议是 POP3/IMAP。**
5859

59-
IMAP 协议相比于POP3更新一点,为用户提供的可选功能也更多一点,几乎所有现代电子邮件客户端和服务器都支持IMAP。大部分网络邮件服务提供商都支持POP3和IMAP
60+
IMAP 协议是比 POP3 更新的协议,它在功能和性能上都更加强大。IMAP 支持邮件搜索、标记、分类、归档等高级功能,而且可以在多个设备之间同步邮件状态。几乎所有现代电子邮件客户端和服务器都支持 IMAP
6061

6162
## FTP:文件传输协议
6263

63-
**FTP 协议** 主要提供文件传输服务,基于 TCP 实现可靠的传输。使用 FTP 传输文件的好处是可以屏蔽操作系统和文件存储方式
64+
**FTP 协议** 基于 TCP 协议,是一种用于在计算机之间传输文件的协议,可以屏蔽操作系统和文件存储方式
6465

6566
FTP 是基于客户—服务器(C/S)模型而设计的,在客户端与 FTP 服务器之间建立两个连接。如果我们要基于 FTP 协议开发一个文件传输的软件的话,首先需要搞清楚 FTP 的原理。关于 FTP 的原理,很多书籍上已经描述的非常详细了:
6667

@@ -73,15 +74,40 @@ FTP 是基于客户—服务器(C/S)模型而设计的,在客户端与 FTP
7374
7475
![FTP工作过程](https://oss.javaguide.cn/github/javaguide/cs-basics/network/ftp.png)
7576

77+
注意 ⚠️:FTP 是一种不安全的协议,因为它在传输过程中不会对数据进行加密。因此,FTP 传输的文件可能会被窃听或篡改。建议在传输敏感数据时使用更安全的协议,如 SFTP(一种基于 SSH 协议的安全文件传输协议,用于在网络上安全地传输文件)。
7678

7779
## Telnet:远程登陆协议
7880

79-
**Telnet 协议** 通过一个终端登陆到其他服务器,建立在可靠的传输协议 TCP 之上。Telnet 协议的最大缺点之一是所有数据(包括用户名和密码)均以明文形式发送,这有潜在的安全风险。这就是为什么如今很少使用Telnet并被一种称为SSH的非常安全的协议所取代的主要原因。
81+
**Telnet 协议** 基于 TCP 协议,用于通过一个终端登陆到其他服务器。Telnet 协议的最大缺点之一是所有数据(包括用户名和密码)均以明文形式发送,这有潜在的安全风险。这就是为什么如今很少使用 Telnet,而是使用一种称为 SSH 的非常安全的网络传输协议的主要原因。
82+
83+
![Telnet:远程登陆协议](https://oss.javaguide.cn/github/javaguide/cs-basics/network/Telnet_is_vulnerable_to_eavesdropping-2.png)
8084

8185
## SSH:安全的网络传输协议
8286

83-
**SSH( Secure Shell)** 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH 建立在可靠的传输协议 TCP 之上。
87+
**SSH(Secure Shell)** 基于 TCP 协议,通过加密和认证机制实现安全的访问和文件传输等业务。
88+
89+
SSH 的经典用途是登录到远程电脑中执行命令。除此之外,SSH 也支持隧道协议、端口映射和 X11 连接。借助 SFTP 或 SCP 协议,SSH 还可以传输文件。
90+
91+
SSH 使用客户端-服务器模型,默认端口是 22。SSH 是一个守护进程,负责实时监听客户端请求,并进行处理。大多数现代操作系统都提供了 SSH。
92+
93+
![SSH:安全的网络传输协议](https://oss.javaguide.cn/github/javaguide/cs-basics/network/ssh-client-server.png)
94+
95+
## RTP:实时传输协议
96+
97+
RTP(Real-time Transport Protocol,实时传输协议)通常基于 UDP 协议,但也支持 TCP 协议。它提供了端到端的实时传输数据的功能,但不包含资源预留存、不保证实时传输质量,这些功能由 WebRTC 实现。
98+
99+
RTP 协议分为两种子协议:
100+
101+
- **RTP(Real-time Transport Protocol,实时传输协议)** :传输具有实时特性的数据。
102+
- **RTCP(RTP Control Protocol,RTP 控制协议)** :提供实时传输过程中的统计信息(如网络延迟、丢包率等),WebRTC 正是根据这些信息处理丢包
103+
104+
## DNS:域名系统
105+
106+
DNS(Domain Name System,域名管理系统)基于 UDP 协议,用于解决域名和 IP 地址的映射问题。
107+
108+
![DNS:域名系统](https://oss.javaguide.cn/github/javaguide/cs-basics/network/dns-overview.png)
84109

85-
**Telnet 和 SSH 之间的主要区别在于 SSH 协议会对传输的数据进行加密保证数据安全性。**
110+
## 参考
86111

87-
![](https://oss.javaguide.cn/github/javaguide/cs-basics/network/tcp-udp-overview.png)
112+
- 《计算机网络自顶向下方法》(第七版)
113+
- RTP 协议介绍:https://mthli.xyz/rtp-introduction/

docs/cs-basics/network/dns.md

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
---
2+
title: DNS 域名系统详解(应用层)
3+
category: 计算机基础
4+
tag:
5+
- 计算机网络
6+
---
7+
8+
DNS(Domain Name System)域名管理系统,是当用户使用浏览器访问网址之后,使用的第一个重要协议。DNS 要解决的是**域名和 IP 地址的映射问题**
9+
10+
![DNS:域名系统](https://oss.javaguide.cn/github/javaguide/cs-basics/network/dns-overview.png)
11+
12+
在实际使用中,有一种情况下,浏览器是可以不必动用 DNS 就可以获知域名和 IP 地址的映射的。浏览器在本地会维护一个`hosts`列表,一般来说浏览器要先查看要访问的域名是否在`hosts`列表中,如果有的话,直接提取对应的 IP 地址记录,就好了。如果本地`hosts`列表内没有域名-IP 对应记录的话,那么 DNS 就闪亮登场了。
13+
14+
目前 DNS 的设计采用的是分布式、层次数据库结构,**DNS 是应用层协议,基于 UDP 协议之上,端口为 53**
15+
16+
![TCP/IP 各层协议概览](https://oss.javaguide.cn/github/javaguide/cs-basics/network/network-protocol-overview.png)
17+
18+
DNS 服务器自底向上可以依次分为以下几个层级(所有 DNS 服务器都属于以下四个类别之一):
19+
20+
- 根 DNS 服务器。根 DNS 服务器提供 TLD 服务器的 IP 地址。目前世界上只有 13 组根服务器,我国境内目前仍没有根服务器。
21+
- 顶级域 DNS 服务器(TLD 服务器)。顶级域是指域名的后缀,如`com``org``net``edu`等。国家也有自己的顶级域,如`uk``fr``ca`。TLD 服务器提供了权威 DNS 服务器的 IP 地址。
22+
- 权威 DNS 服务器。在因特网上具有公共可访问主机的每个组织机构必须提供公共可访问的 DNS 记录,这些记录将这些主机的名字映射为 IP 地址。
23+
- 本地 DNS 服务器。每个 ISP(互联网服务提供商)都有一个自己的本地 DNS 服务器。当主机发出 DNS 请求时,该请求被发往本地 DNS 服务器,它起着代理的作用,并将该请求转发到 DNS 层次结构中。严格说来,不属于 DNS 层级结构。
24+
25+
## DNS 工作流程
26+
27+
以下图为例,介绍 DNS 的查询解析过程。DNS 的查询解析过程分为两种模式:
28+
29+
- **迭代**
30+
- **递归**
31+
32+
下图是实践中常采用的方式,从请求主机到本地 DNS 服务器的查询是递归的,其余的查询时迭代的。
33+
34+
![](https://oss.javaguide.cn/github/javaguide/cs-basics/network/DNS-process.png)
35+
36+
现在,主机`cis.poly.edu`想知道`gaia.cs.umass.edu`的 IP 地址。假设主机`cis.poly.edu`的本地 DNS 服务器为`dns.poly.edu`,并且`gaia.cs.umass.edu`的权威 DNS 服务器为`dns.cs.umass.edu`
37+
38+
1. 首先,主机`cis.poly.edu`向本地 DNS 服务器`dns.poly.edu`发送一个 DNS 请求,该查询报文包含被转换的域名`gaia.cs.umass.edu`
39+
2. 本地 DNS 服务器`dns.poly.edu`检查本机缓存,发现并无记录,也不知道`gaia.cs.umass.edu`的 IP 地址该在何处,不得不向根服务器发送请求。
40+
3. 根服务器注意到请求报文中含有`edu`顶级域,因此告诉本地 DNS,你可以向`edu`的 TLD DNS 发送请求,因为目标域名的 IP 地址很可能在那里。
41+
4. 本地 DNS 获取到了`edu`的 TLD DNS 服务器地址,向其发送请求,询问`gaia.cs.umass.edu`的 IP 地址。
42+
5. `edu`的 TLD DNS 服务器仍不清楚请求域名的 IP 地址,但是它注意到该域名有`umass.edu`前缀,因此返回告知本地 DNS,`umass.edu`的权威服务器可能记录了目标域名的 IP 地址。
43+
6. 这一次,本地 DNS 将请求发送给权威 DNS 服务器`dns.cs.umass.edu`
44+
7. 终于,由于`gaia.cs.umass.edu`向权威 DNS 服务器备案过,在这里有它的 IP 地址记录,权威 DNS 成功地将 IP 地址返回给本地 DNS。
45+
8. 最后,本地 DNS 获取到了目标域名的 IP 地址,将其返回给请求主机。
46+
47+
除了迭代式查询,还有一种递归式查询如下图,具体过程和上述类似,只是顺序有所不同。
48+
49+
![](https://oss.javaguide.cn/github/javaguide/cs-basics/network/DNS-process2.png)
50+
51+
另外,DNS 的缓存位于本地 DNS 服务器。由于全世界的根服务器甚少,只有 400 多台,分为 13 组,且顶级域的数量也在一个可数的范围内,因此本地 DNS 通常已经缓存了很多 TLD DNS 服务器,所以在实际查找过程中,无需访问根服务器。根服务器通常是被跳过的,不请求的。
52+
53+
## DNS 报文格式
54+
55+
DNS 的报文格式如下图所示:
56+
57+
![](https://oss.javaguide.cn/github/javaguide/cs-basics/network/DNS-packet.png)
58+
59+
DNS 报文分为查询和回答报文,两种形式的报文结构相同。
60+
61+
- 标识符。16 比特,用于标识该查询。这个标识符会被复制到对查询的回答报文中,以便让客户用它来匹配发送的请求和接收到的回答。
62+
- 标志。1 比特的”查询/回答“标识位,`0`表示查询报文,`1`表示回答报文;1 比特的”权威的“标志位(当某 DNS 服务器是所请求名字的权威 DNS 服务器时,且是回答报文,使用”权威的“标志);1 比特的”希望递归“标志位,显式地要求执行递归查询;1 比特的”递归可用“标志位,用于回答报文中,表示 DNS 服务器支持递归查询。
63+
- 问题数、回答 RR 数、权威 RR 数、附加 RR 数。分别指示了后面 4 类数据区域出现的数量。
64+
- 问题区域。包含正在被查询的主机名字,以及正被询问的问题类型。
65+
- 回答区域。包含了对最初请求的名字的资源记录。**在回答报文的回答区域中可以包含多条 RR,因此一个主机名能够有多个 IP 地址。**
66+
- 权威区域。包含了其他权威服务器的记录。
67+
- 附加区域。包含了其他有帮助的记录。
68+
69+
## DNS 记录
70+
71+
DNS 服务器在响应查询时,需要查询自己的数据库,数据库中的条目被称为**资源记录(Resource Record,RR)**。RR 提供了主机名到 IP 地址的映射。RR 是一个包含了`Name`, `Value`, `Type`, `TTL`四个字段的四元组。
72+
73+
![](https://oss.javaguide.cn/github/javaguide/cs-basics/network/20210506174303797.png)
74+
75+
`TTL`是该记录的生存时间,它决定了资源记录应当从缓存中删除的时间。
76+
77+
`Name``Value`字段的取值取决于`Type`
78+
79+
![](https://oss.javaguide.cn/github/javaguide/cs-basics/network/20210506170307897.png)
80+
81+
- 如果`Type=A`,则`Name`是主机名信息,`Value` 是该主机名对应的 IP 地址。这样的 RR 记录了一条主机名到 IP 地址的映射。
82+
- 如果 `Type=AAAA` (与 `A` 记录非常相似),唯一的区别是 A 记录使用的是 IPv4,而 `AAAA` 记录使用的是 IPv6。
83+
- 如果`Type=CNAME` (Canonical Name Record,真实名称记录) ,则`Value`是别名为`Name`的主机对应的规范主机名。`Value`值才是规范主机名。`CNAME` 记录将一个主机名映射到另一个主机名。`CNAME` 记录用于为现有的 `A` 记录创建别名。下文有示例。
84+
- 如果`Type=NS`,则`Name`是个域,而`Value`是个知道如何获得该域中主机 IP 地址的权威 DNS 服务器的主机名。通常这样的 RR 是由 TLD 服务器发布的。
85+
- 如果`Type=MX` ,则`Value`是个别名为`Name`的邮件服务器的规范主机名。既然有了 `MX` 记录,那么邮件服务器可以和其他服务器使用相同的别名。为了获得邮件服务器的规范主机名,需要请求 `MX` 记录;为了获得其他服务器的规范主机名,需要请求 `CNAME` 记录。
86+
87+
`CNAME`记录总是指向另一则域名,而非 IP 地址。假设有下述 DNS zone:
88+
89+
```
90+
NAME TYPE VALUE
91+
--------------------------------------------------
92+
bar.example.com. CNAME foo.example.com.
93+
foo.example.com. A 192.0.2.23
94+
```
95+
96+
当用户查询 `bar.example.com` 的时候,DNS Server 实际返回的是 `foo.example.com` 的 IP 地址。
97+
98+
## 参考
99+
100+
- DNS 服务器类型:https://www.cloudflare.com/zh-cn/learning/dns/dns-server-types/
101+
- DNS Message Resource Record Field Formats:http://www.tcpipguide.com/free/t_DNSMessageResourceRecordFieldFormats-2.htm
102+
- Understanding Different Types of Record in DNS Server:https://www.mustbegeek.com/understanding-different-types-of-record-in-dns-server/

0 commit comments

Comments
 (0)