From 4ddbc07f08905f2573d3ae6e14b7c3491113089e Mon Sep 17 00:00:00 2001 From: Guide Date: Thu, 13 Apr 2023 19:00:22 +0800 Subject: [PATCH] =?UTF-8?q?[docs=20update]=E8=AE=A1=E7=AE=97=E6=9C=BA?= =?UTF-8?q?=E7=BD=91=E7=BB=9C=E5=B8=B8=E8=A7=81=E9=9D=A2=E8=AF=95=E9=A2=98?= =?UTF-8?q?=E6=80=BB=E7=BB=93=E6=8B=86=E5=88=86=E4=B8=BA=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E4=B8=A4=E7=AF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- docs/.vuepress/sidebar.ts | 12 +- docs/.vuepress/themeConfig.ts | 2 +- docs/cs-basics/network/osi&tcp-ip-model.md | 24 +- .../network/other-network-questions.md | 215 +++++------------- .../network/other-network-questions2.md | 177 ++++++++++++++ docs/home.md | 3 +- 7 files changed, 261 insertions(+), 175 deletions(-) create mode 100644 docs/cs-basics/network/other-network-questions2.md diff --git a/README.md b/README.md index 4d29ec6a..9154fb18 100755 --- a/README.md +++ b/README.md @@ -141,7 +141,8 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle **知识点/面试题总结** : -- [计算机网络常见知识点&面试题总结](./docs/cs-basics/network/other-network-questions.md) +- [计算机网络常见知识点&面试题总结(上)](./docs/cs-basics/network/other-network-questions.md) +- - [计算机网络常见知识点&面试题总结(下)](./docs/cs-basics/network/other-network-questions2.md) - [谢希仁老师的《计算机网络》内容总结(补充)](./docs/cs-basics/network/computer-network-xiexiren-summary.md) **重要知识点详解** : diff --git a/docs/.vuepress/sidebar.ts b/docs/.vuepress/sidebar.ts index 28e32633..872610db 100644 --- a/docs/.vuepress/sidebar.ts +++ b/docs/.vuepress/sidebar.ts @@ -165,6 +165,7 @@ export const sidebarConfig = sidebar({ icon: "network", children: [ "other-network-questions", + "other-network-questions2", "computer-network-xiexiren-summary", { text: "重要知识点", @@ -192,8 +193,15 @@ export const sidebarConfig = sidebar({ children: [ "operating-system-basic-questions-01", "operating-system-basic-questions-02", - "linux-intro", - "shell-intro", + { + text: "Linux", + collapsible: true, + icon: "linux", + children: [ + "linux-intro", + "shell-intro", + ], + }, ], }, { diff --git a/docs/.vuepress/themeConfig.ts b/docs/.vuepress/themeConfig.ts index b2745194..bfa575b9 100644 --- a/docs/.vuepress/themeConfig.ts +++ b/docs/.vuepress/themeConfig.ts @@ -11,7 +11,7 @@ export const themeConfig = hopeTheme({ }, repo: "https://github.com/Snailclimb/JavaGuide", docsDir: "docs", - iconAssets: "//at.alicdn.com/t/c/font_2922463_9ir10garej4.css", + iconAssets: "//at.alicdn.com/t/c/font_2922463_9aayheyb3v7.css", navbar: navbarConfig, sidebar: sidebarConfig, pageInfo: [ diff --git a/docs/cs-basics/network/osi&tcp-ip-model.md b/docs/cs-basics/network/osi&tcp-ip-model.md index 562318f7..91d22e7b 100644 --- a/docs/cs-basics/network/osi&tcp-ip-model.md +++ b/docs/cs-basics/network/osi&tcp-ip-model.md @@ -124,12 +124,14 @@ OSI 七层模型虽然失败了,但是却提供了很多不错的理论基础 **应用层协议** : -- HTTP 协议(超文本传输协议,网页浏览常用的协议) -- DHCP 协议(动态主机配置) -- DNS 系统原理(域名系统) -- FTP 协议(文件传输协议) -- Telnet 协议(远程登陆协议) -- 电子邮件协议等(SMTP、POP3、IMAP) +- HTTP(Hypertext Transfer Protocol,超文本传输协议) +- SMTP(Simple Mail Transfer Protocol,简单邮件发送协议) +- POP3/IMAP(邮件接收协议) +- FTP(File Transfer Protocol,文件传输协议) +- Telnet(远程登陆协议) +- SSH(Secure Shell Protocol,安全的网络传输协议) +- RTP(Real-time Transport Protocol,实时传输协议) +- DNS(Domain Name System,域名管理系统) - ...... **传输层协议** : @@ -145,11 +147,13 @@ OSI 七层模型虽然失败了,但是却提供了很多不错的理论基础 **网络层协议** : -- IP 协议(TCP/IP 协议的基础,分为 IPv4 和 IPv6) -- ARP 协议(地址解析协议,用于解析 IP 地址和 MAC 地址之间的映射) +- IP(Internet Protocol,网际协议) +- ARP(Address Resolution Protocol,地址解析协议) - ICMP 协议(控制报文协议,用于发送控制消息) -- NAT 协议(网络地址转换协议) -- RIP 协议、OSPF 协议、BGP 协议(路由选择协议) +- NAT(Network Address Translation,网络地址转换协议) +- OSPF(Open Shortest Path First,开放式最短路径优先) +- RIP(Routing Information Protocol,路由信息协议) +- BGP(Border Gateway Protocol,边界网关协议) - ...... **网络接口层** : diff --git a/docs/cs-basics/network/other-network-questions.md b/docs/cs-basics/network/other-network-questions.md index 929559eb..0d807549 100644 --- a/docs/cs-basics/network/other-network-questions.md +++ b/docs/cs-basics/network/other-network-questions.md @@ -1,23 +1,68 @@ --- -title: 计算机网络常见面试题总结 +title: 计算机网络常见面试题总结(上) category: 计算机基础 tag: - 计算机网络 --- +上篇主要是计算机网络基础和应用层相关的内容。 + ## 计算机网络基础 -### OSI 和 TCP/IP 网络分层模型 +### 网络分层模型 -**相关面试题** : +#### OSI 七层模型是什么?每一层的作用是什么? -- OSI 七层模型是什么?每一层的作用是什么? -- TCP/IP 四层模型是什么?每一层的作用是什么? -- 为什么网络要分层? +**OSI 七层模型** 是国际标准化组织提出一个网络分层模型,其大体结构以及每一层提供的功能如下图所示: -**参考答案** :[OSI 和 TCP/IP 网络分层模型详解(基础)](./osi&tcp-ip-model.md)。 +![OSI 七层模型](https://oss.javaguide.cn/github/javaguide/cs-basics/network/osi-7-model.png) -### 应用层有哪些常见的协议? +每一层都专注做一件事情,并且每一层都需要使用下一层提供的功能比如传输层需要使用网络层提供的路由和寻址功能,这样传输层才知道把数据传输到哪里去。 + +**OSI 的七层体系结构概念清楚,理论也很完整,但是它比较复杂而且不实用,而且有些功能在多个层中重复出现。** + +上面这种图可能比较抽象,再来一个比较生动的图片。下面这个图片是我在国外的一个网站上看到的,非常赞! + +![osi七层模型2](https://oss.javaguide.cn/github/javaguide/osi七层模型2.png) + +#### TCP/IP 四层模型是什么?每一层的作用是什么? + +**TCP/IP 四层模型** 是目前被广泛采用的一种模型,我们可以将 TCP / IP 模型看作是 OSI 七层模型的精简版本,由以下 4 层组成: + +1. 应用层 +2. 传输层 +3. 网络层 +4. 网络接口层 + +需要注意的是,我们并不能将 TCP/IP 四层模型 和 OSI 七层模型完全精确地匹配起来,不过可以简单将两者对应起来,如下图所示: + +![TCP/IP 四层模型](https://oss.javaguide.cn/github/javaguide/cs-basics/network/tcp-ip-4-model.png) + +关于每一层作用的详细介绍,请看 [OSI 和 TCP/IP 网络分层模型详解(基础)](https://javaguide.cn/cs-basics/network/osi&tcp-ip-model.html) 这篇文章。 + +#### 为什么网络要分层? + +说到分层,我们先从我们平时使用框架开发一个后台程序来说,我们往往会按照每一层做不同的事情的原则将系统分为三层(复杂的系统分层会更多): + +1. Repository(数据库操作) +2. Service(业务操作) +3. Controller(前后端数据交互) + +**复杂的系统需要分层,因为每一层都需要专注于一类事情。网络分层的原因也是一样,每一层只专注于做一类事情。** + +好了,再来说回:“为什么网络要分层?”。我觉得主要有 3 方面的原因: + +1. **各层之间相互独立**:各层之间相互独立,各层之间不需要关心其他层是如何实现的,只需要知道自己如何调用下层提供好的功能就可以了(可以简单理解为接口调用)**。这个和我们对开发时系统进行分层是一个道理。** +2. **提高了整体灵活性** :每一层都可以使用最适合的技术来实现,你只需要保证你提供的功能以及暴露的接口的规则没有改变就行了。**这个和我们平时开发系统的时候要求的高内聚、低耦合的原则也是可以对应上的。** +3. **大问题化小** : 分层可以将复杂的网络问题分解为许多比较小的、界线比较清晰简单的小问题来处理和解决。这样使得复杂的计算机网络系统变得易于设计,实现和标准化。 **这个和我们平时开发的时候,一般会将系统功能分解,然后将复杂的问题分解为容易理解的更小的问题是相对应的,这些较小的问题具有更好的边界(目标和接口)定义。** + +我想到了计算机世界非常非常有名的一句话,这里分享一下: + +> 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决,计算机整个体系从上到下都是按照严格的层次结构设计的。 + +### 常见网络协议 + +#### 应用层有哪些常见的协议? ![应用层常见协议](https://oss.javaguide.cn/github/javaguide/cs-basics/network/application-layer-protocol.png) @@ -32,14 +77,14 @@ tag: 关于这些协议的详细介绍请看 [应用层常见协议总结(应用层)](./application-layer-protocol.md) 这篇文章。 -### 传输层有哪些常见的协议? +#### 传输层有哪些常见的协议? ![传输层常见协议](https://oss.javaguide.cn/github/javaguide/cs-basics/network/transport-layer-protocol.png) - **TCP(Transmisson Control Protocol,传输控制协议 )**:提供 **面向连接** 的,**可靠** 的数据传输服务。 - **UDP(User Datagram Protocol,用户数据协议)**:提供 **无连接** 的,**尽最大努力** 的数据传输服务(不保证数据传输的可靠性),简单高效。 -### 网络层有哪些常见的协议? +#### 网络层有哪些常见的协议? ![网络层常见协议](https://oss.javaguide.cn/github/javaguide/cs-basics/network/nerwork-layer-protocol.png) @@ -256,159 +301,9 @@ DNS 服务器自底向上可以依次分为以下几个层级(所有 DNS 服务 整个过程的步骤比较多,我单独写了一篇文章详细介绍:[DNS 域名系统详解(应用层)](./dns.md) 。 -## TCP 与 UDP - -### TCP 与 UDP 的区别(重要) - -1. **是否面向连接** :UDP 在传送数据之前不需要先建立连接。而 TCP 提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。 -2. **是否是可靠传输**:远地主机在收到 UDP 报文后,不需要给出任何确认,并且不保证数据不丢失,不保证是否顺序到达。TCP 提供可靠的传输服务,TCP 在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制。通过 TCP 连接传输的数据,无差错、不丢失、不重复、并且按序到达。 -3. **是否有状态** :这个和上面的“是否可靠传输”相对应。TCP 传输是有状态的,这个有状态说的是 TCP 会去记录自己发送消息的状态比如消息是否发送了、是否被接收了等等。为此 ,TCP 需要维持复杂的连接状态表。而 UDP 是无状态服务,简单来说就是不管发出去之后的事情了(**这很渣男!**)。 -4. **传输效率** :由于使用 TCP 进行传输的时候多了连接、确认、重传等机制,所以 TCP 的传输效率要比 UDP 低很多。 -5. **传输形式** : TCP 是面向字节流的,UDP 是面向报文的。 -6. **首部开销** :TCP 首部开销(20 ~ 60 字节)比 UDP 首部开销(8 字节)要大。 -7. **是否提供广播或多播服务** :TCP 只支持点对点通信,UDP 支持一对一、一对多、多对一、多对多; -8. ...... - -我把上面总结的内容通过表格形式展示出来了!确定不点个赞嘛? - -| | TCP | UDP | -| ---------------------- | -------------- | ---------- | -| 是否面向连接 | 是 | 否 | -| 是否可靠 | 是 | 否 | -| 是否有状态 | 是 | 否 | -| 传输效率 | 较慢 | 较快 | -| 传输形式 | 字节流 | 数据报文段 | -| 首部开销 | 20 ~ 60 bytes | 8 bytes | -| 是否提供广播或多播服务 | 否 | 是 | - -### 什么时候选择 TCP,什么时候选 UDP? - -- **UDP 一般用于即时通信**,比如: 语音、 视频 、直播等等。这些场景对传输数据的准确性要求不是特别高,比如你看视频即使少个一两帧,实际给人的感觉区别也不大。 -- **TCP 用于对传输准确性要求特别高的场景**,比如文件传输、发送和接收邮件、远程登录等等。 - -### HTTP 基于 TCP 还是 UDP? - -~~**HTTP 协议是基于 TCP 协议的**,所以发送 HTTP 请求之前首先要建立 TCP 连接也就是要经历 3 次握手。~~ - -🐛 修正(参见 [issue#1915](https://github.com/Snailclimb/JavaGuide/issues/1915)):HTTP/3.0 之前是基于 TCP 协议的,而 HTTP/3.0 将弃用 TCP,改用 **基于 UDP 的 QUIC 协议** 。此变化解决了 HTTP/2 中存在的队头阻塞问题。由于 HTTP/2 在单个 TCP 连接上使用了多路复用,受到 TCP 拥塞控制的影响,少量的丢包就可能导致整个 TCP 连接上的所有流被阻塞。另外,HTTP/2.0 需要经过经典的 TCP 三次握手过程(一般是 3 个 RTT)。由于 QUIC 协议的特性,HTTP/3.0 可以避免 TCP 三次握手的延迟,允许在第一次连接时发送数据(0 个 RTT ,零往返时间)。 - -相关证明可以参考下面这两个链接: - -- https://zh.wikipedia.org/zh/HTTP/3 -- https://datatracker.ietf.org/doc/rfc9114/ - -### 使用 TCP 的协议有哪些?使用 UDP 的协议有哪些? - -**运行于 TCP 协议之上的协议** : - -1. **HTTP 协议** :超文本传输协议(HTTP,HyperText Transfer Protocol)是一种用于传输超文本和多媒体内容的协议,主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的。 -2. **HTTPS 协议** :更安全的超文本传输协议(HTTPS,Hypertext Transfer Protocol Secure),身披 SSL 外衣的 HTTP 协议 -3. **FTP 协议**:文件传输协议 FTP(File Transfer Protocol)是一种用于在计算机之间传输文件的协议,可以屏蔽操作系统和文件存储方式。注意 ⚠️:FTP 是一种不安全的协议,因为它在传输过程中不会对数据进行加密。建议在传输敏感数据时使用更安全的协议,如 SFTP。 -4. **SMTP 协议**:简单邮件传输协议(SMTP,Simple 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. ...... - -**运行于 UDP 协议之上的协议** : - -1. **DHCP 协议**:动态主机配置协议,动态配置 IP 地址 -2. **DNS** : **域名系统(DNS,Domain Name System)将人类可读的域名 (例如,www.baidu.com) 转换为机器可读的 IP 地址 (例如,220.181.38.148)。** 我们可以将其理解为专为互联网设计的电话薄。实际上 DNS 同时支持 UDP 和 TCP 协议。 -3. ...... - -### TCP 三次握手和四次挥手(非常重要) - -**相关面试题** : - -- 为什么要三次握手? -- 第 2 次握手传回了 ACK,为什么还要传回 SYN? -- 为什么要四次挥手? -- 为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手? -- 如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样? -- 为什么第四次挥手客户端需要等待 2\*MSL(报文段最长寿命)时间后才进入 CLOSED 状态? - -**参考答案** :[TCP 三次握手和四次挥手(传输层)](./tcp-connection-and-disconnection.md) 。 - -### TCP 如何保证传输的可靠性?(重要) - -[TCP 传输可靠性保障(传输层)](./tcp-reliability-guarantee.md) - -## IP - -### IP 协议的作用是什么? - -**IP(Internet Protocol,网际协议)** 是 TCP/IP 协议中最重要的协议之一,属于网络层的协议,主要作用是定义数据包的格式、对数据包进行路由和寻址,以便它们可以跨网络传播并到达正确的目的地。 - -目前 IP 协议主要分为两种,一种是过去的 IPv4,另一种是较新的 IPv6,目前这两种协议都在使用,但后者已经被提议来取代前者。 - -### 什么是 IP 地址?IP 寻址如何工作? - -每个连入互联网的设备或域(如计算机、服务器、路由器等)都被分配一个 IP 地址,作为唯一标识符。每个 IP 地址都是一个字符序列,如 192.168.1.1。每个 IP 数据包都同时包含发送数据包的设备或域的 IP 地址以及预期接收方的 IP 地址,这与一封邮件中同时包含目的地地址和回邮地址一样。 - -![IP 地址使数据包到达其目的地](https://oss.javaguide.cn/github/javaguide/cs-basics/network/internet_protocol_ip_address_diagram.png) - -### IPv4 和 IPv6 有什么区别? - -**IPv4(Internet 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) - -这么少当然不够用啦!为了解决 IP 地址耗尽的问题,最根本的办法是采用具有更大地址空间的新版本 IP 协议 - **IPv6(Internet Protocol version 6)**。IPv6 地址使用更复杂的格式,该格式使用由单或双冒号分隔的一组数字和字母,例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334 。IPv4 使用 128 位互联网地址,这意味着越有 2^128(3 开头的 39 位数字,恐怖如斯) 个可用 IP 地址。 - -![IPv6](https://oss.javaguide.cn/github/javaguide/cs-basics/network/Figure-2-IPv6Addressformatwithhexadecimalnotation-7da3a419bd81627a9b2cef3b0efb4940.png) - -除了更大的地址空间之外,IPv6 的优势还包括: - -- **无状态地址自动配置(Stateless Address Autoconfiguration,简称 SLAAC)** :主机可以直接通过根据接口标识和网络前缀生成全局唯一的 IPv6 地址,而无需依赖 DHCP(Dynamic Host Configuration Protocol)服务器,简化了网络配置和管理。 -- **NAT(Network Address Translation,网络地址转换) 成为可选项** :IPv6 地址资源充足,可以给全球每个设备一个独立的地址。 -- **对标头结构进行了改进** :IPv6 标头结构相较于 IPv4 更加简化和高效,减少了处理开销,提高了网络性能。 -- **可选的扩展头** :允许在 IPv6 标头中添加不同的扩展头(Extension Headers),用于实现不同类型的功能和选项。 -- **ICMPv6(Internet Control Message Protocol for IPv6)** :IPv6 中的 ICMPv6 相较于 IPv4 中的 ICMP 有了一些改进,如邻居发现、路径 MTU 发现等功能的改进,从而提升了网络的可靠性和性能。 -- ...... - -### NAT 的作用是什么? - -**NAT(Network 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) - -## 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》 - 《计算机网络自顶向下方法》(第七版) - 详解 HTTP/2.0 及 HTTPS 协议:https://juejin.cn/post/7034668672262242318 - HTTP 请求头字段大全| HTTP Request Headers:https://www.flysnow.org/tools/table/http-request-headers/ -- 什么是 Internet 协议(IP)?:https://www.cloudflare.com/zh-cn/learning/network-layer/internet-protocol/ -- 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 diff --git a/docs/cs-basics/network/other-network-questions2.md b/docs/cs-basics/network/other-network-questions2.md new file mode 100644 index 00000000..7572fa63 --- /dev/null +++ b/docs/cs-basics/network/other-network-questions2.md @@ -0,0 +1,177 @@ +--- +title: 计算机网络常见面试题总结(下) +category: 计算机基础 +tag: + - 计算机网络 +--- + +下篇主要是传输层和网络层相关的内容。 + +## TCP 与 UDP + +### TCP 与 UDP 的区别(重要) + +1. **是否面向连接** :UDP 在传送数据之前不需要先建立连接。而 TCP 提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。 +2. **是否是可靠传输**:远地主机在收到 UDP 报文后,不需要给出任何确认,并且不保证数据不丢失,不保证是否顺序到达。TCP 提供可靠的传输服务,TCP 在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制。通过 TCP 连接传输的数据,无差错、不丢失、不重复、并且按序到达。 +3. **是否有状态** :这个和上面的“是否可靠传输”相对应。TCP 传输是有状态的,这个有状态说的是 TCP 会去记录自己发送消息的状态比如消息是否发送了、是否被接收了等等。为此 ,TCP 需要维持复杂的连接状态表。而 UDP 是无状态服务,简单来说就是不管发出去之后的事情了(**这很渣男!**)。 +4. **传输效率** :由于使用 TCP 进行传输的时候多了连接、确认、重传等机制,所以 TCP 的传输效率要比 UDP 低很多。 +5. **传输形式** : TCP 是面向字节流的,UDP 是面向报文的。 +6. **首部开销** :TCP 首部开销(20 ~ 60 字节)比 UDP 首部开销(8 字节)要大。 +7. **是否提供广播或多播服务** :TCP 只支持点对点通信,UDP 支持一对一、一对多、多对一、多对多; +8. ...... + +我把上面总结的内容通过表格形式展示出来了!确定不点个赞嘛? + +| | TCP | UDP | +| ---------------------- | -------------- | ---------- | +| 是否面向连接 | 是 | 否 | +| 是否可靠 | 是 | 否 | +| 是否有状态 | 是 | 否 | +| 传输效率 | 较慢 | 较快 | +| 传输形式 | 字节流 | 数据报文段 | +| 首部开销 | 20 ~ 60 bytes | 8 bytes | +| 是否提供广播或多播服务 | 否 | 是 | + +### 什么时候选择 TCP,什么时候选 UDP? + +- **UDP 一般用于即时通信**,比如: 语音、 视频 、直播等等。这些场景对传输数据的准确性要求不是特别高,比如你看视频即使少个一两帧,实际给人的感觉区别也不大。 +- **TCP 用于对传输准确性要求特别高的场景**,比如文件传输、发送和接收邮件、远程登录等等。 + +### HTTP 基于 TCP 还是 UDP? + +~~**HTTP 协议是基于 TCP 协议的**,所以发送 HTTP 请求之前首先要建立 TCP 连接也就是要经历 3 次握手。~~ + +🐛 修正(参见 [issue#1915](https://github.com/Snailclimb/JavaGuide/issues/1915)):HTTP/3.0 之前是基于 TCP 协议的,而 HTTP/3.0 将弃用 TCP,改用 **基于 UDP 的 QUIC 协议** 。此变化解决了 HTTP/2 中存在的队头阻塞问题。由于 HTTP/2 在单个 TCP 连接上使用了多路复用,受到 TCP 拥塞控制的影响,少量的丢包就可能导致整个 TCP 连接上的所有流被阻塞。另外,HTTP/2.0 需要经过经典的 TCP 三次握手过程(一般是 3 个 RTT)。由于 QUIC 协议的特性,HTTP/3.0 可以避免 TCP 三次握手的延迟,允许在第一次连接时发送数据(0 个 RTT ,零往返时间)。 + +相关证明可以参考下面这两个链接: + +- https://zh.wikipedia.org/zh/HTTP/3 +- https://datatracker.ietf.org/doc/rfc9114/ + +### 使用 TCP 的协议有哪些?使用 UDP 的协议有哪些? + +**运行于 TCP 协议之上的协议** : + +1. **HTTP 协议** :超文本传输协议(HTTP,HyperText Transfer Protocol)是一种用于传输超文本和多媒体内容的协议,主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的。 +2. **HTTPS 协议** :更安全的超文本传输协议(HTTPS,Hypertext Transfer Protocol Secure),身披 SSL 外衣的 HTTP 协议 +3. **FTP 协议**:文件传输协议 FTP(File Transfer Protocol)是一种用于在计算机之间传输文件的协议,可以屏蔽操作系统和文件存储方式。注意 ⚠️:FTP 是一种不安全的协议,因为它在传输过程中不会对数据进行加密。建议在传输敏感数据时使用更安全的协议,如 SFTP。 +4. **SMTP 协议**:简单邮件传输协议(SMTP,Simple 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. ...... + +**运行于 UDP 协议之上的协议** : + +1. **DHCP 协议**:动态主机配置协议,动态配置 IP 地址 +2. **DNS** : **域名系统(DNS,Domain Name System)将人类可读的域名 (例如,www.baidu.com) 转换为机器可读的 IP 地址 (例如,220.181.38.148)。** 我们可以将其理解为专为互联网设计的电话薄。实际上 DNS 同时支持 UDP 和 TCP 协议。 +3. ...... + +### TCP 三次握手和四次挥手(非常重要) + +**相关面试题** : + +- 为什么要三次握手? +- 第 2 次握手传回了 ACK,为什么还要传回 SYN? +- 为什么要四次挥手? +- 为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手? +- 如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样? +- 为什么第四次挥手客户端需要等待 2\*MSL(报文段最长寿命)时间后才进入 CLOSED 状态? + +**参考答案** :[TCP 三次握手和四次挥手(传输层)](./tcp-connection-and-disconnection.md) 。 + +### TCP 如何保证传输的可靠性?(重要) + +[TCP 传输可靠性保障(传输层)](./tcp-reliability-guarantee.md) + +## IP + +### IP 协议的作用是什么? + +**IP(Internet Protocol,网际协议)** 是 TCP/IP 协议中最重要的协议之一,属于网络层的协议,主要作用是定义数据包的格式、对数据包进行路由和寻址,以便它们可以跨网络传播并到达正确的目的地。 + +目前 IP 协议主要分为两种,一种是过去的 IPv4,另一种是较新的 IPv6,目前这两种协议都在使用,但后者已经被提议来取代前者。 + +### 什么是 IP 地址?IP 寻址如何工作? + +每个连入互联网的设备或域(如计算机、服务器、路由器等)都被分配一个 **IP 地址(Internet Protocol address)**,作为唯一标识符。每个 IP 地址都是一个字符序列,如 192.168.1.1(IPv4)、2001:0db8:85a3:0000:0000:8a2e:0370:7334(IPv6) 。 + +当网络设备发送IP数据包时,数据包中包含了 **源IP地址** 和 **目的IP地址** 。源IP地址用于标识数据包的发送方设备或域,而目的IP地址则用于标识数据包的接收方设备或域。这类似于一封邮件中同时包含了目的地地址和回邮地址。 + +网络设备根据目的IP地址来判断数据包的目的地,并将数据包转发到正确的目的地网络或子网络,从而实现了设备间的通信。 + +这种基于IP地址的寻址方式是互联网通信的基础,它允许数据包在不同的网络之间传递,从而实现了全球范围内的网络互联互通。IP地址的唯一性和全局性保证了网络中的每个设备都可以通过其独特的IP地址进行标识和寻址。 + +![IP 地址使数据包到达其目的地](https://oss.javaguide.cn/github/javaguide/cs-basics/network/internet_protocol_ip_address_diagram.png) + + + +### 什么是 IP 地址过滤? + +**IP 地址过滤(IP Address Filtering)** 简单来说就是限制或阻止特定IP地址或IP地址范围的访问。例如,你有一个图片服务突然被某一个 IP 地址攻击,那我们就可以禁止这个 IP 地址访问图片服务。 + +IP地址过滤是一种简单的网络安全措施,实际应用中一般会结合其他网络安全措施,如认证、授权、加密等一起使用。单独使用 IP地址过滤并不能完全保证网络的安全。 + +### IPv4 和 IPv6 有什么区别? + +**IPv4(Internet 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) + +这么少当然不够用啦!为了解决 IP 地址耗尽的问题,最根本的办法是采用具有更大地址空间的新版本 IP 协议 - **IPv6(Internet Protocol version 6)**。IPv6 地址使用更复杂的格式,该格式使用由单或双冒号分隔的一组数字和字母,例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334 。IPv4 使用 128 位互联网地址,这意味着越有 2^128(3 开头的 39 位数字,恐怖如斯) 个可用 IP 地址。 + +![IPv6](https://oss.javaguide.cn/github/javaguide/cs-basics/network/Figure-2-IPv6Addressformatwithhexadecimalnotation-7da3a419bd81627a9b2cef3b0efb4940.png) + +除了更大的地址空间之外,IPv6 的优势还包括: + +- **无状态地址自动配置(Stateless Address Autoconfiguration,简称 SLAAC)** :主机可以直接通过根据接口标识和网络前缀生成全局唯一的 IPv6 地址,而无需依赖 DHCP(Dynamic Host Configuration Protocol)服务器,简化了网络配置和管理。 +- **NAT(Network Address Translation,网络地址转换) 成为可选项** :IPv6 地址资源充足,可以给全球每个设备一个独立的地址。 +- **对标头结构进行了改进** :IPv6 标头结构相较于 IPv4 更加简化和高效,减少了处理开销,提高了网络性能。 +- **可选的扩展头** :允许在 IPv6 标头中添加不同的扩展头(Extension Headers),用于实现不同类型的功能和选项。 +- **ICMPv6(Internet Control Message Protocol for IPv6)** :IPv6 中的 ICMPv6 相较于 IPv4 中的 ICMP 有了一些改进,如邻居发现、路径 MTU 发现等功能的改进,从而提升了网络的可靠性和性能。 +- ...... + +### NAT 的作用是什么? + +**NAT(Network 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) + +## 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》 +- 《计算机网络自顶向下方法》(第七版) +- 什么是 Internet 协议(IP)?:https://www.cloudflare.com/zh-cn/learning/network-layer/internet-protocol/ +- 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 \ No newline at end of file diff --git a/docs/home.md b/docs/home.md index 3c8213ec..db1853e1 100644 --- a/docs/home.md +++ b/docs/home.md @@ -142,7 +142,8 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle **知识点/面试题总结** : -- [计算机网络常见知识点&面试题总结](./cs-basics/network/other-network-questions.md) +- [计算机网络常见知识点&面试题总结(上)](./cs-basics/network/other-network-questions.md) +- - [计算机网络常见知识点&面试题总结(下)](./cs-basics/network/other-network-questions2.md) - [谢希仁老师的《计算机网络》内容总结(补充)](./cs-basics/network/computer-network-xiexiren-summary.md) **重要知识点详解** :