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

211 lines
18 KiB
Markdown
Raw Permalink Normal View History

---
title: 计算机网络常见面试题总结(下)
category: 计算机基础
tag:
- 计算机网络
---
下篇主要是传输层和网络层相关的内容。
## TCP 与 UDP
### TCP 与 UDP 的区别(重要)
2023-05-05 12:39:01 +08:00
1. **是否面向连接**UDP 在传送数据之前不需要先建立连接。而 TCP 提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。
2. **是否是可靠传输**:远地主机在收到 UDP 报文后不需要给出任何确认并且不保证数据不丢失不保证是否顺序到达。TCP 提供可靠的传输服务TCP 在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制。通过 TCP 连接传输的数据,无差错、不丢失、不重复、并且按序到达。
2023-05-05 12:39:01 +08:00
3. **是否有状态**这个和上面的“是否可靠传输”相对应。TCP 传输是有状态的,这个有状态说的是 TCP 会去记录自己发送消息的状态比如消息是否发送了、是否被接收了等等。为此 TCP 需要维持复杂的连接状态表。而 UDP 是无状态服务,简单来说就是不管发出去之后的事情了(**这很渣男!**)。
4. **传输效率**:由于使用 TCP 进行传输的时候多了连接、确认、重传等机制,所以 TCP 的传输效率要比 UDP 低很多。
5. **传输形式**TCP 是面向字节流的UDP 是面向报文的。
6. **首部开销**TCP 首部开销20 60 字节)比 UDP 首部开销8 字节)要大。
7. **是否提供广播或多播服务**TCP 只支持点对点通信UDP 支持一对一、一对多、多对一、多对多;
2023-10-10 14:43:53 +08:00
8. ……
我把上面总结的内容通过表格形式展示出来了!确定不点个赞嘛?
| | TCP | UDP |
| ---------------------- | -------------- | ---------- |
| 是否面向连接 | 是 | 否 |
| 是否可靠 | 是 | 否 |
| 是否有状态 | 是 | 否 |
| 传输效率 | 较慢 | 较快 |
| 传输形式 | 字节流 | 数据报文段 |
| 首部开销 | 20 60 bytes | 8 bytes |
| 是否提供广播或多播服务 | 否 | 是 |
### 什么时候选择 TCP什么时候选 UDP?
2023-05-05 12:33:52 +08:00
- **UDP 一般用于即时通信**,比如:语音、 视频、直播等等。这些场景对传输数据的准确性要求不是特别高,比如你看视频即使少个一两帧,实际给人的感觉区别也不大。
- **TCP 用于对传输准确性要求特别高的场景**,比如文件传输、发送和接收邮件、远程登录等等。
### HTTP 基于 TCP 还是 UDP
~~**HTTP 协议是基于 TCP 协议的**,所以发送 HTTP 请求之前首先要建立 TCP 连接也就是要经历 3 次握手。~~
2023-07-06 16:44:53 +08:00
🐛 修正(参见 [issue#1915](https://github.com/Snailclimb/JavaGuide/issues/1915)
HTTP/3.0 之前是基于 TCP 协议的,而 HTTP/3.0 将弃用 TCP改用 **基于 UDP 的 QUIC 协议**
此变化解决了 HTTP/2 中存在的队头阻塞问题。队头阻塞是指在 HTTP/2.0 中,多个 HTTP 请求和响应共享一个 TCP 连接,如果其中一个请求或响应因为网络拥塞或丢包而被阻塞,那么后续的请求或响应也无法发送,导致整个连接的效率降低。这是由于 HTTP/2.0 在单个 TCP 连接上使用了多路复用,受到 TCP 拥塞控制的影响,少量的丢包就可能导致整个 TCP 连接上的所有流被阻塞。HTTP/3.0 在一定程度上解决了队头阻塞问题,一个连接建立多个不同的数据流,这些数据流之间独立互不影响,某个数据流发生丢包了,其数据流不受影响(本质上是多路复用+轮询)。
除了解决队头阻塞问题HTTP/3.0 还可以减少握手过程的延迟。在 HTTP/2.0 中,如果要建立一个安全的 HTTPS 连接,需要经过 TCP 三次握手和 TLS 握手:
1. TCP 三次握手:客户端和服务器交换 SYN 和 ACK 包,建立一个 TCP 连接。这个过程需要 1.5 个 RTTround-trip time即一个数据包从发送到接收的时间。
2. TLS 握手:客户端和服务器交换密钥和证书,建立一个 TLS 加密层。这个过程需要至少 1 个 RTTTLS 1.3)或者 2 个 RTTTLS 1.2)。
所以HTTP/2.0 的连接建立就至少需要 2.5 个 RTTTLS 1.3)或者 3.5 个 RTTTLS 1.2)。而在 HTTP/3.0 中,使用的 QUIC 协议TLS 1.3TLS 1.3 除了支持 1 个 RTT 的握手,还支持 0 个 RTT 的握手)连接建立仅需 0-RTT 或者 1-RTT。这意味着 QUIC 在最佳情况下不需要任何的额外往返时间就可以建立新连接。
相关证明可以参考下面这两个链接:
2023-12-30 17:14:13 +08:00
- <https://zh.wikipedia.org/zh/HTTP/3>
- <https://datatracker.ietf.org/doc/rfc9114/>
### 使用 TCP 的协议有哪些?使用 UDP 的协议有哪些?
2023-05-05 12:39:01 +08:00
**运行于 TCP 协议之上的协议**
1. **HTTP 协议HTTP/3.0 之前)**超文本传输协议HTTPHyperText Transfer Protocol)是一种用于传输超文本和多媒体内容的协议,主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的。
2023-05-05 12:39:01 +08:00
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 协议。
2023-05-05 12:33:52 +08:00
5. **POP3/IMAP 协议**两者都是负责邮件接收的协议。IMAP 协议是比 POP3 更新的协议它在功能和性能上都更加强大。IMAP 支持邮件搜索、标记、分类、归档等高级功能,而且可以在多个设备之间同步邮件状态。几乎所有现代电子邮件客户端和服务器都支持 IMAP。
6. **Telnet 协议**用于通过一个终端登陆到其他服务器。Telnet 协议的最大缺点之一是所有数据(包括用户名和密码)均以明文形式发送,这有潜在的安全风险。这就是为什么如今很少使用 Telnet而是使用一种称为 SSH 的非常安全的网络传输协议的主要原因。
7. **SSH 协议** : SSH Secure Shell是目前较可靠专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH 建立在可靠的传输协议 TCP 之上。
2023-10-10 14:43:53 +08:00
8. ……
2023-05-05 12:39:01 +08:00
**运行于 UDP 协议之上的协议**
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. ……
### TCP 三次握手和四次挥手(非常重要)
2023-05-05 12:39:01 +08:00
**相关面试题**
- 为什么要三次握手?
- 第 2 次握手传回了 ACK为什么还要传回 SYN
- 为什么要四次挥手?
- 为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?
- 如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样?
- 为什么第四次挥手客户端需要等待 2\*MSL报文段最长寿命时间后才进入 CLOSED 状态?
2023-05-05 12:39:01 +08:00
**参考答案**[TCP 三次握手和四次挥手(传输层)](./tcp-connection-and-disconnection.md) 。
### TCP 如何保证传输的可靠性?(重要)
[TCP 传输可靠性保障(传输层)](./tcp-reliability-guarantee.md)
## IP
### IP 协议的作用是什么?
**IPInternet Protocol网际协议** 是 TCP/IP 协议中最重要的协议之一,属于网络层的协议,主要作用是定义数据包的格式、对数据包进行路由和寻址,以便它们可以跨网络传播并到达正确的目的地。
目前 IP 协议主要分为两种,一种是过去的 IPv4另一种是较新的 IPv6目前这两种协议都在使用但后者已经被提议来取代前者。
### 什么是 IP 地址IP 寻址如何工作?
每个连入互联网的设备或域(如计算机、服务器、路由器等)都被分配一个 **IP 地址Internet Protocol address**,作为唯一标识符。每个 IP 地址都是一个字符序列,如 192.168.1.1IPv4、2001:0db8:85a3:0000:0000:8a2e:0370:7334IPv6
2023-04-28 17:31:44 +08:00
当网络设备发送 IP 数据包时,数据包中包含了 **源 IP 地址****目的 IP 地址** 。源 IP 地址用于标识数据包的发送方设备或域,而目的 IP 地址则用于标识数据包的接收方设备或域。这类似于一封邮件中同时包含了目的地地址和回邮地址。
2023-04-28 17:31:44 +08:00
网络设备根据目的 IP 地址来判断数据包的目的地,并将数据包转发到正确的目的地网络或子网络,从而实现了设备间的通信。
2023-04-28 17:31:44 +08:00
这种基于 IP 地址的寻址方式是互联网通信的基础它允许数据包在不同的网络之间传递从而实现了全球范围内的网络互联互通。IP 地址的唯一性和全局性保证了网络中的每个设备都可以通过其独特的 IP 地址进行标识和寻址。
![IP 地址使数据包到达其目的地](https://oss.javaguide.cn/github/javaguide/cs-basics/network/internet_protocol_ip_address_diagram.png)
### 什么是 IP 地址过滤?
2023-04-28 17:31:44 +08:00
**IP 地址过滤IP Address Filtering** 简单来说就是限制或阻止特定 IP 地址或 IP 地址范围的访问。例如,你有一个图片服务突然被某一个 IP 地址攻击,那我们就可以禁止这个 IP 地址访问图片服务。
2023-04-28 17:31:44 +08:00
IP 地址过滤是一种简单的网络安全措施,实际应用中一般会结合其他网络安全措施,如认证、授权、加密等一起使用。单独使用 IP 地址过滤并不能完全保证网络的安全。
### IPv4 和 IPv6 有什么区别?
**IPv4Internet Protocol version 4** 是目前广泛使用的 IP 地址版本其格式是四组由点分隔的数字例如123.89.46.72。IPv4 使用 32 位地址作为其 Internet 地址,这意味着共有约 42 亿( 2^32个可用 IP 地址。
![IPv4](https://oss.javaguide.cn/github/javaguide/cs-basics/network/Figure-1-IPv4Addressformatwithdotteddecimalnotation-29c824f6a451d48d8c27759799f0c995.png)
2023-07-14 11:26:02 +08:00
这么少当然不够用啦!为了解决 IP 地址耗尽的问题,最根本的办法是采用具有更大地址空间的新版本 IP 协议 - **IPv6Internet Protocol version 6**。IPv6 地址使用更复杂的格式该格式使用由单或双冒号分隔的一组数字和字母例如2001:0db8:85a3:0000:0000:8a2e:0370:7334 。IPv6 使用 128 位互联网地址,这意味着越有 2^1283 开头的 39 位数字,恐怖如斯) 个可用 IP 地址。
![IPv6](https://oss.javaguide.cn/github/javaguide/cs-basics/network/Figure-2-IPv6Addressformatwithhexadecimalnotation-7da3a419bd81627a9b2cef3b0efb4940.png)
除了更大的地址空间之外IPv6 的优势还包括:
2023-05-05 12:39:01 +08:00
- **无状态地址自动配置Stateless Address Autoconfiguration简称 SLAAC**:主机可以直接通过根据接口标识和网络前缀生成全局唯一的 IPv6 地址,而无需依赖 DHCPDynamic Host Configuration Protocol服务器简化了网络配置和管理。
- **NATNetwork Address Translation网络地址转换 成为可选项**IPv6 地址资源充足,可以给全球每个设备一个独立的地址。
- **对标头结构进行了改进**IPv6 标头结构相较于 IPv4 更加简化和高效,减少了处理开销,提高了网络性能。
- **可选的扩展头**:允许在 IPv6 标头中添加不同的扩展头Extension Headers用于实现不同类型的功能和选项。
- **ICMPv6Internet Control Message Protocol for IPv6**IPv6 中的 ICMPv6 相较于 IPv4 中的 ICMP 有了一些改进,如邻居发现、路径 MTU 发现等功能的改进,从而提升了网络的可靠性和性能。
2023-10-10 14:43:53 +08:00
- ……
### 如何获取客户端真实 IP
获取客户端真实 IP 的方法有多种,主要分为应用层方法、传输层方法和网络层方法。
**应用层方法**
通过 [X-Forwarded-For](https://en.wikipedia.org/wiki/X-Forwarded-For) 请求头获取,简单方便。不过,这种方法无法保证获取到的是真实 IP这是因为 X-Forwarded-For 字段可能会被伪造。如果经过多个代理服务器X-Forwarded-For 字段可能会有多个值(附带了整个请求链中的所有代理服务器 IP 地址)。并且,这种方法只适用于 HTTP 和 SMTP 协议。
**传输层方法**
利用 TCP Options 字段承载真实源 IP 信息。这种方法适用于任何基于 TCP 的协议,不受应用层的限制。不过,这并非是 TCP 标准所支持的,所以需要通信双方都进行改造。也就是:对于发送方来说,需要有能力把真实源 IP 插入到 TCP Options 里面。对于接收方来说,需要有能力把 TCP Options 里面的 IP 地址读取出来。
也可以通过 Proxy Protocol 协议来传递客户端 IP 和 Port 信息。这种方法可以利用 Nginx 或者其他支持该协议的反向代理服务器来获取真实 IP 或者在业务服务器解析真实 IP。
**网络层方法**
隧道 +DSR 模式。这种方法可以适用于任何协议,就是实施起来会比较麻烦,也存在一定限制,实际应用中一般不会使用这种方法。
### NAT 的作用是什么?
**NATNetwork Address Translation网络地址转换** 主要用于在不同网络之间转换 IP 地址。它允许将私有 IP 地址(如在局域网中使用的 IP 地址)映射为公有 IP 地址(在互联网中使用的 IP 地址)或者反向映射,从而实现局域网内的多个设备通过单一公有 IP 地址访问互联网。
NAT 不光可以缓解 IPv4 地址资源短缺的问题,还可以隐藏内部网络的实际拓扑结构,使得外部网络无法直接访问内部网络中的设备,从而提高了内部网络的安全性。
![NAT 实现 IP地址转换](https://oss.javaguide.cn/github/javaguide/cs-basics/network/network-address-translation.png)
2023-05-03 12:53:12 +08:00
相关阅读:[NAT 协议详解(网络层)](./nat.md)。
## ARP
### 什么是 Mac 地址?
MAC 地址的全称是 **媒体访问控制地址Media Access Control Address**。如果说,互联网中每一个资源都由 IP 地址唯一标识IP 协议内容),那么一切网络设备都由 MAC 地址唯一标识。
![路由器的背面就会注明 MAC 位址](./images/arp/2008410143049281.png)
可以理解为MAC 地址是一个网络设备真正的身份证号IP 地址只是一种不重复的定位方式(比如说住在某省某市某街道的张三,这种逻辑定位是 IP 地址,他的身份证号才是他的 MAC 地址),也可以理解为 MAC 地址是身份证号IP 地址是邮政地址。MAC 地址也有一些别称,如 LAN 地址、物理地址、以太网地址等。
> 还有一点要知道的是,不仅仅是网络资源才有 IP 地址,网络设备也有 IP 地址,比如路由器。但从结构上说,路由器等网络设备的作用是组成一个网络,而且通常是内网,所以它们使用的 IP 地址通常是内网 IP内网的设备在与内网以外的设备进行通信时需要用到 NAT 协议。
MAC 地址的长度为 6 字节48 比特),地址空间大小有 280 万亿之多($2^{48}$MAC 地址由 IEEE 统一管理与分配,理论上,一个网络设备中的网卡上的 MAC 地址是永久的。不同的网卡生产商从 IEEE 那里购买自己的 MAC 地址空间MAC 的前 24 比特),也就是前 24 比特由 IEEE 统一管理,保证不会重复。而后 24 比特,由各家生产商自己管理,同样保证生产的两块网卡的 MAC 地址不会重复。
MAC 地址具有可携带性、永久性,身份证号永久地标识一个人的身份,不论他到哪里都不会改变。而 IP 地址不具有这些性质,当一台设备更换了网络,它的 IP 地址也就可能发生改变,也就是它在互联网中的定位发生了变化。
最后记住MAC 地址有一个特殊地址FF-FF-FF-FF-FF-FF全 1 地址),该地址表示广播地址。
### ARP 协议解决了什么问题?
ARP 协议,全称 **地址解析协议Address Resolution Protocol**,它解决的是网络层地址和链路层地址之间的转换问题。因为一个 IP 数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但 IP 地址属于逻辑地址,而 MAC 地址才是物理地址ARP 协议解决了 IP 地址转 MAC 地址的一些问题。
### ARP 协议的工作原理?
[ARP 协议详解(网络层)](./arp.md)
## 复习建议
非常推荐大家看一下 《图解 HTTP》 这本书,这本书页数不多,但是内容很是充实,不管是用来系统的掌握网络方面的一些知识还是说纯粹为了应付面试都有很大帮助。下面的一些文章只是参考。大二学习这门课程的时候,我们使用的教材是 《计算机网络第七版》(谢希仁编著),不推荐大家看这本教材,书非常厚而且知识偏理论,不确定大家能不能心平气和的读完。
## 参考
- 《图解 HTTP》
- 《计算机网络自顶向下方法》(第七版)
2023-07-06 16:44:53 +08:00
- 什么是 Internet 协议IP<https://www.cloudflare.com/zh-cn/learning/network-layer/internet-protocol/>
- 透传真实源 IP 的各种方法 - 极客时间:<https://time.geekbang.org/column/article/497864>
2023-07-06 16:44:53 +08:00
- What Is NAT and What Are the Benefits of NAT Firewalls?<https://community.fs.com/blog/what-is-nat-and-what-are-the-benefits-of-nat-firewalls.html>
2023-10-27 06:44:02 +08:00
<!-- @include: @article-footer.snippet.md -->