diff --git a/README.md b/README.md index 3132178f..26e60f83 100755 --- a/README.md +++ b/README.md @@ -131,13 +131,20 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle ### 网络 -1. [计算机网络常见知识点&面试题总结](./docs/cs-basics/network/other-network-questions.md) -2. [OSI 和 TCP/IP 网络分层模型详解(基础)](./docs/cs-basics/network/osi&tcp-ip-model.md) -3. [HTTP vs HTTPS(应用层)](./docs/cs-basics/network/http&https.md) -4. [HTTP 1.0 vs HTTP 1.1(应用层)](./docs/cs-basics/network/http1.0&http1.1.md) -5. [HTTP 常见状态码(应用层)](./docs/cs-basics/network/http-status-codes.md) -6. [TCP 三次握手和四次挥手(传输层)](./docs/cs-basics/network/tcp-connection-and-disconnection.md) -7. [谢希仁老师的《计算机网络》内容总结(补充)](docs/cs-basics/network/谢希仁老师的《计算机网络》内容总结.md) +**知识点/面试题总结** : + +- [计算机网络常见知识点&面试题总结](./docs/cs-basics/network/other-network-questions.md) +- [谢希仁老师的《计算机网络》内容总结(补充)](docs/cs-basics/network/谢希仁老师的《计算机网络》内容总结.md) + +**重要知识点详解** : + +- [OSI 和 TCP/IP 网络分层模型详解(基础)](./docs/cs-basics/network/osi&tcp-ip-model.md) +- [应用层常见协议总结(应用层)](./docs/cs-basics/network/application-layer-protocol.md) +- [HTTP vs HTTPS(应用层)](./docs/cs-basics/network/http&https.md) +- [HTTP 1.0 vs HTTP 1.1(应用层)](./docs/cs-basics/network/http1.0&http1.1.md) +- [HTTP 常见状态码(应用层)](./docs/cs-basics/network/http-status-codes.md) +- [TCP 三次握手和四次挥手(传输层)](./docs/cs-basics/network/tcp-connection-and-disconnection.md) +- [TCP 传输可靠性保障(传输层)](./docs/cs-basics/network/tcp-reliability-guarantee.md) ### 数据结构 diff --git a/docs/.vuepress/sidebar.ts b/docs/.vuepress/sidebar.ts index 4150322e..ad310c06 100644 --- a/docs/.vuepress/sidebar.ts +++ b/docs/.vuepress/sidebar.ts @@ -170,10 +170,12 @@ export const sidebarConfig = defineSidebarConfig({ collapsable: true, children: [ "osi&tcp-ip-model", + "application-layer-protocol", "http&https", "http1.0&http1.1", "http-status-codes", "tcp-connection-and-disconnection", + "tcp-reliability-guarantee", ], }, ], diff --git a/docs/cs-basics/network/application-layer-protocol.md b/docs/cs-basics/network/application-layer-protocol.md new file mode 100644 index 00000000..05080def --- /dev/null +++ b/docs/cs-basics/network/application-layer-protocol.md @@ -0,0 +1,85 @@ +--- +title: 应用层常见协议总结(应用层) +category: 计算机基础 +tag: + - 计算机网络 +--- + +## HTTP:超文本传输协议 + +**超文本传输协议(HTTP,HyperText Transfer Protocol)** 主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的,整个过程如下图所示。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/450px-HTTP-Header.png) + +HTTP 协是基于 TCP协议,发送 HTTP 请求之前首先要建立 TCP 连接也就是要经历 3 次握手。目前使用的 HTTP 协议大部分都是 1.1。在 1.1 的协议里面,默认是开启了 Keep-Alive 的,这样的话建立的连接就可以在多次请求中被复用了。 + + +另外, HTTP 协议是”无状态”的协议,它无法记录客户端用户的状态,一般我们都是通过 Session 来记录客户端用户的状态。 + +## SMTP:简单邮件传输(发送)协议 + +**简单邮件传输(发送)协议(SMTP,Simple Mail Transfer Protocol)** 基于 TCP 协议,用来发送电子邮件。 + +注意⚠️:**接受邮件的协议不是 SMTP 而是 POP3 协议。** + +SMTP 协议这块涉及的内容比较多,下面这两个问题比较重要: + +1. 电子邮件的发送过程 +2. 如何判断邮箱是真正存在的? + +**电子邮件的发送过程?** + +比如我的邮箱是“dabai@cszhinan.com”,我要向“xiaoma@qq.com”发送邮件,整个过程可以简单分为下面几步: + +1. 通过 **SMTP** 协议,我将我写好的邮件交给163邮箱服务器(邮局)。 +2. 163邮箱服务器发现我发送的邮箱是qq邮箱,然后它使用 SMTP协议将我的邮件转发到 qq邮箱服务器。 +3. qq邮箱服务器接收邮件之后就通知邮箱为“xiaoma@qq.com”的用户来收邮件,然后用户就通过 **POP3/IMAP** 协议将邮件取出。 + +**如何判断邮箱是真正存在的?** + +很多场景(比如邮件营销)下面我们需要判断我们要发送的邮箱地址是否真的存在,这个时候我们可以利用 SMTP 协议来检测: + +1. 查找邮箱域名对应的 SMTP 服务器地址 +2. 尝试与服务器建立连接 +3. 连接成功后尝试向需要验证的邮箱发送邮件 +4. 根据返回结果判定邮箱地址的真实性 + +推荐几个在线邮箱是否有效检测工具: + +1. https://verify-email.org/ +2. http://tool.chacuo.net/mailverify +3. https://www.emailcamel.com/ + +## POP3/IMAP:邮件接收的协议 + +这两个协议没必要多做阐述,只需要了解 **POP3 和 IMAP 两者都是负责邮件接收的协议**即可。另外,需要注意不要将这两者和 SMTP 协议搞混淆了。**SMTP 协议只负责邮件的发送,真正负责接收的协议是POP3/IMAP。** + +IMAP 协议相比于POP3更新一点,为用户提供的可选功能也更多一点,几乎所有现代电子邮件客户端和服务器都支持IMAP。大部分网络邮件服务提供商都支持POP3和IMAP。 + +## FTP:文件传输协议 + +**FTP 协议** 主要提供文件传输服务,基于 TCP 实现可靠的传输。使用 FTP 传输文件的好处是可以屏蔽操作系统和文件存储方式。 + +FTP 是基于客户—服务器(C/S)模型而设计的,在客户端与 FTP 服务器之间建立两个连接。如果我们要基于 FTP 协议开发一个文件传输的软件的话,首先需要搞清楚 FTP 的原理。关于 FTP 的原理,很多书籍上已经描述的非常详细了: + +> FTP 的独特的优势同时也是与其它客户服务器程序最大的不同点就在于它在两台通信的主机之间使用了两条 TCP 连接(其它客户服务器应用程序一般只有一条 TCP 连接): +> +> 1. 控制连接:用于传送控制信息(命令和响应) +> 2. 数据连接:用于数据传送; +> +> 这种将命令和数据分开传送的思想大大提高了 FTP 的效率。 + +![FTP工作过程](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E6%80%BB%E7%BB%93/ftp.png) + + +## Telnet:远程登陆协议 + +**Telnet 协议** 通过一个终端登陆到其他服务器,建立在可靠的传输协议 TCP 之上。Telnet 协议的最大缺点之一是所有数据(包括用户名和密码)均以明文形式发送,这有潜在的安全风险。这就是为什么如今很少使用Telnet并被一种称为SSH的非常安全的协议所取代的主要原因。 + +## SSH:安全的网络传输协议 + +**SSH( Secure Shell)** 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH 建立在可靠的传输协议 TCP 之上。 + +**Telnet 和 SSH 之间的主要区别在于 SSH 协议会对传输的数据进行加密保证数据安全性。** + +![TCP和UDP](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E6%80%BB%E7%BB%93/TCP%E5%92%8CUDP.png) \ No newline at end of file diff --git a/docs/cs-basics/network/http-status-codes.md b/docs/cs-basics/network/http-status-codes.md index 9ae2c931..95ffaaf5 100644 --- a/docs/cs-basics/network/http-status-codes.md +++ b/docs/cs-basics/network/http-status-codes.md @@ -1,5 +1,5 @@ --- -title: HTTP 常见状态码(应用层) +title: HTTP 常见状态码总结(应用层) category: 计算机基础 tag: - 计算机网络 diff --git a/docs/cs-basics/network/images/tcp&udp/tcp-receive-window.drawio b/docs/cs-basics/network/images/tcp&udp/tcp-receive-window.drawio new file mode 100644 index 00000000..6c98a359 --- /dev/null +++ b/docs/cs-basics/network/images/tcp&udp/tcp-receive-window.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/docs/cs-basics/network/images/tcp&udp/tcp-send-window.drawio b/docs/cs-basics/network/images/tcp&udp/tcp-send-window.drawio new file mode 100644 index 00000000..8b20b5a6 --- /dev/null +++ b/docs/cs-basics/network/images/tcp&udp/tcp-send-window.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/docs/cs-basics/network/other-network-questions.md b/docs/cs-basics/network/other-network-questions.md index d2d9fe13..1fbee1af 100644 --- a/docs/cs-basics/network/other-network-questions.md +++ b/docs/cs-basics/network/other-network-questions.md @@ -5,7 +5,9 @@ tag: - 计算机网络 --- -## OSI 和 TCP/IP 网络分层模型 +## 网路基础 + +### OSI 和 TCP/IP 网络分层模型 **相关面试题** : @@ -15,86 +17,9 @@ tag: **参考答案** :[OSI 和 TCP/IP 网络分层模型详解(基础)](./osi&tcp-ip-model.md)。 -## 应用层有哪些常见的协议? +### 应用层有哪些常见的协议? -### HTTP:超文本传输协议 - -**超文本传输协议(HTTP,HyperText Transfer Protocol)** 主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的,整个过程如下图所示。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/450px-HTTP-Header.png) - -HTTP 协是基于 TCP协议,发送 HTTP 请求之前首先要建立 TCP 连接也就是要经历 3 次握手。目前使用的 HTTP 协议大部分都是 1.1。在 1.1 的协议里面,默认是开启了 Keep-Alive 的,这样的话建立的连接就可以在多次请求中被复用了。 - - -另外, HTTP 协议是”无状态”的协议,它无法记录客户端用户的状态,一般我们都是通过 Session 来记录客户端用户的状态。 - -### SMTP:简单邮件传输(发送)协议 - -**简单邮件传输(发送)协议(SMTP,Simple Mail Transfer Protocol)** 基于 TCP 协议,用来发送电子邮件。 - -注意⚠️:**接受邮件的协议不是 SMTP 而是 POP3 协议。** - -SMTP 协议这块涉及的内容比较多,下面这两个问题比较重要: - -1. 电子邮件的发送过程 -2. 如何判断邮箱是真正存在的? - -**电子邮件的发送过程?** - -比如我的邮箱是“dabai@cszhinan.com”,我要向“xiaoma@qq.com”发送邮件,整个过程可以简单分为下面几步: - -1. 通过 **SMTP** 协议,我将我写好的邮件交给163邮箱服务器(邮局)。 -2. 163邮箱服务器发现我发送的邮箱是qq邮箱,然后它使用 SMTP协议将我的邮件转发到 qq邮箱服务器。 -3. qq邮箱服务器接收邮件之后就通知邮箱为“xiaoma@qq.com”的用户来收邮件,然后用户就通过 **POP3/IMAP** 协议将邮件取出。 - -**如何判断邮箱是真正存在的?** - -很多场景(比如邮件营销)下面我们需要判断我们要发送的邮箱地址是否真的存在,这个时候我们可以利用 SMTP 协议来检测: - -1. 查找邮箱域名对应的 SMTP 服务器地址 -2. 尝试与服务器建立连接 -3. 连接成功后尝试向需要验证的邮箱发送邮件 -4. 根据返回结果判定邮箱地址的真实性 - -推荐几个在线邮箱是否有效检测工具: - -1. https://verify-email.org/ -2. http://tool.chacuo.net/mailverify -3. https://www.emailcamel.com/ - -### POP3/IMAP:邮件接收的协议 - -这两个协议没必要多做阐述,只需要了解 **POP3 和 IMAP 两者都是负责邮件接收的协议**即可。另外,需要注意不要将这两者和 SMTP 协议搞混淆了。**SMTP 协议只负责邮件的发送,真正负责接收的协议是POP3/IMAP。** - -IMAP 协议相比于POP3更新一点,为用户提供的可选功能也更多一点,几乎所有现代电子邮件客户端和服务器都支持IMAP。大部分网络邮件服务提供商都支持POP3和IMAP。 - -### FTP:文件传输协议 - -**FTP 协议** 主要提供文件传输服务,基于 TCP 实现可靠的传输。使用 FTP 传输文件的好处是可以屏蔽操作系统和文件存储方式。 - -FTP 是基于客户—服务器(C/S)模型而设计的,在客户端与 FTP 服务器之间建立两个连接。如果我们要基于 FTP 协议开发一个文件传输的软件的话,首先需要搞清楚 FTP 的原理。关于 FTP 的原理,很多书籍上已经描述的非常详细了: - -> FTP 的独特的优势同时也是与其它客户服务器程序最大的不同点就在于它在两台通信的主机之间使用了两条 TCP 连接(其它客户服务器应用程序一般只有一条 TCP 连接): -> -> 1. 控制连接:用于传送控制信息(命令和响应) -> 2. 数据连接:用于数据传送; -> -> 这种将命令和数据分开传送的思想大大提高了 FTP 的效率。 - -![FTP工作过程](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E6%80%BB%E7%BB%93/ftp.png) - - -### Telnet:远程登陆协议 - -**Telnet 协议** 通过一个终端登陆到其他服务器,建立在可靠的传输协议 TCP 之上。Telnet 协议的最大缺点之一是所有数据(包括用户名和密码)均以明文形式发送,这有潜在的安全风险。这就是为什么如今很少使用Telnet并被一种称为SSH的非常安全的协议所取代的主要原因。 - -### SSH:安全的网络传输协议 - -**SSH( Secure Shell)** 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH 建立在可靠的传输协议 TCP 之上。 - -**Telnet 和 SSH 之间的主要区别在于 SSH 协议会对传输的数据进行加密保证数据安全性。** - -![TCP和UDP](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E6%80%BB%E7%BB%93/TCP%E5%92%8CUDP.png) +[应用层常见协议总结(应用层)](./application-layer-protocol.md) ## TCP 与 UDP @@ -165,6 +90,10 @@ FTP 是基于客户—服务器(C/S)模型而设计的,在客户端与 FTP **参考答案** :[TCP 三次握手和四次挥手(传输层)](./tcp-connection-and-disconnection.md) 。 +### TCP 如何保证传输的可靠性? + +[TCP 传输可靠性保障(传输层)](./tcp-reliability-guarantee.md) + ## HTTP ### 从输入URL 到页面展示到底发生了什么? @@ -188,7 +117,7 @@ FTP 是基于客户—服务器(C/S)模型而设计的,在客户端与 FTP 具体可以参考下面这两篇文章: -- [[从输入URL到页面加载发生了什么?](https://segmentfault.com/a/1190000006879700)](https://segmentfault.com/a/1190000006879700) +- [从输入URL到页面加载发生了什么?](https://segmentfault.com/a/1190000006879700) - [浏览器从输入网址到页面展示的过程](https://cloud.tencent.com/developer/article/1879758) ### HTTP 状态码有哪些? @@ -229,14 +158,14 @@ HTTP 是一种不保存状态,即无状态(stateless)协议。也就是说 ![HTTP是无状态协议](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/HTTP是无状态的.png) -## URI 和 URL 的区别是什么? +### URI 和 URL 的区别是什么? * URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。 * URL(Uniform Resource Locator) 是统一资源定位符,可以提供该资源的路径。它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。 URI 的作用像身份证号一样,URL 的作用更像家庭住址一样。URL 是一种具体的 URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。 -## 建议 +## 复习建议 非常推荐大家看一下 《图解 HTTP》 这本书,这本书页数不多,但是内容很是充实,不管是用来系统的掌握网络方面的一些知识还是说纯粹为了应付面试都有很大帮助。下面的一些文章只是参考。大二学习这门课程的时候,我们使用的教材是 《计算机网络第七版》(谢希仁编著),不推荐大家看这本教材,书非常厚而且知识偏理论,不确定大家能不能心平气和的读完。 diff --git a/docs/cs-basics/network/tcp-reliability-guarantee.md b/docs/cs-basics/network/tcp-reliability-guarantee.md new file mode 100644 index 00000000..6da98f3a --- /dev/null +++ b/docs/cs-basics/network/tcp-reliability-guarantee.md @@ -0,0 +1,119 @@ +--- +title: TCP 传输可靠性保障(传输层) +category: 计算机基础 +tag: + - 计算机网络 +--- + +## TCP 如何保证传输的可靠性? + +1. **基于数据快传输** :应用数据被分割成 TCP 认为最适合发送的数据块,再传输给网络层,数据块被称为报文段或段。 +2. **对失序数据包重新排序以及去重**:TCP 为了保证不发生丢包,就给每个包一个序列号,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据就可以实现数据包去重。 +3. **校验和** : TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。 +4. **超时重传** : 当发送方发送数据之后,它启动一个定时器,等待目的端确认收到这个报文段。接收端实体对已成功收到的包发回一个相应的确认信息(ACK)。如果发送端实体在合理的往返时延(RTT)内未收到确认消息,那么对应的数据包就被假设为[已丢失](https://zh.wikipedia.org/wiki/丢包 )并进行重传。 +5. **流量控制** : TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议(TCP 利用滑动窗口实现流量控制)。 +6. **拥塞控制** : 当网络拥塞时,减少数据的发送。 + +## TCP 如何实现流量控制? + +**TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。** 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。 + +**为什么需要流量控制?** 这是因为双方在通信的时候,发送方的速率与接收方的速率是不一定相等,如果发送方的发送速率太快,会导致接收方处理不过来。如果接收方处理不过来的话,就只能把处理不过来的数据存在 **接收缓冲区(Receiving Buffers)** 里(失序的数据包也会被存放在缓存区里)。如果缓存区满了发送方还在狂发数据的话,接收方只能把收到的数据包丢掉。出现丢包问题的同时又疯狂浪费着珍贵的网络资源。因此,我们需要控制发送方的发送速率,让接收方与发送方处于一种动态平衡才好。 + +这里需要注意的是(常见误区): + +- 发送端不等同于客户端 +- 接收端不等同于服务端 + +TCP 为全双工(Full-Duplex, FDX)通信,双方可以进行双向通信,客户端和服务端既可能是发送端又可能是服务端。因此,两端各有一个发送缓冲区与接收缓冲区,两端都各自维护一个发送窗口和一个接收窗口。接收窗口大小取决于应用、系统、硬件的限制(TCP传输速率不能大于应用的数据处理速率)。通信双方的发送窗口和接收窗口的要求相同 + +**TCP 发送窗口可以划分成四个部分** : + +1. 已经发送并且确认的TCP段(已经发送并确认); +2. 已经发送但是没有确认的TCP段(已经发送未确认); +3. 未发送但是接收方准备接收的TCP段(可以发送); +4. 未发送并且接收方也并未准备接受的TCP段(不可发送)。 + +**TCP发送窗口结构图示** : + +![TCP发送窗口结构](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/cs-basics/network/tcp-send-window.png) + +- **SND.WND** :发送窗口。 +- **SND.UNA**:Send Unacknowledged 指针,指向发送窗口的第一个字节。 +- **SND.NXT**:Send Next 指针,指向可用窗口的第一个字节。 + +**可用窗口大小** = `SND.UNA + SND.WND - SND.NXT` 。 + +**TCP 接收窗口可以划分成三个部分** : + +1. 已经接收并且已经确认的 TCP 段(已经接收并确认); +2. 等待接收且允许发送方发送 TCP 段(可以接收未确认); +3. 不可接收且不允许发送方发送TCP段(不可接收)。 + +**TCP 接收窗口结构图示** : + +![TCP接收窗口结构](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/cs-basics/network/tcp-receive-window.png) + +**接收窗口的大小是根据接收端处理数据的速度动态调整的。** 如果接收端读取数据快,接收窗口可能会扩大。 否则,它可能会缩小。 + +另外,这里的滑动窗口大小只是为了演示使用,实际窗口大小通常会远远大于这个值。 + +## TCP 的拥塞控制是怎么实现的? + + +在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫拥塞。拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是点对点通信量的控制,是个端到端的问题。流量控制所要做到的就是抑制发送端发送数据的速率,以便使接收端来得及接收。 + +![TCP的拥塞控制](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/cs-basics/network/tcp-congestion-control.png) + +为了进行拥塞控制,TCP 发送方要维持一个 **拥塞窗口(cwnd)** 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。 + +TCP 的拥塞控制采用了四种算法,即 **慢开始** 、 **拥塞避免** 、**快重传** 和 **快恢复**。在网络层也可以使路由器采用适当的分组丢弃策略(如主动队列管理 AQM),以减少网络拥塞的发生。 + +- **慢开始:** 慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd 初始值为 1,每经过一个传播轮次,cwnd 加倍。 +- **拥塞避免:** 拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送放的 cwnd 加 1. +- **快重传与快恢复:** 在 TCP/IP 中,快速重传和恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包。没有 FRR,如果数据包丢失了,TCP 将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。有了 FRR,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。有了 FRR,就不会因为重传时要求的暂停被耽误。  当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。 + +## ARQ 协议了解吗? + +**自动重传请求**(Automatic Repeat-reQuest,ARQ)是 OSI 模型中数据链路层和传输层的错误纠正协议之一。它通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认信息(Acknoledgements,就是我们常说的 ACK),它通常会重新发送,直到收到确认或者重试超过一定的次数。 + +ARQ 包括停止等待 ARQ 协议和连续 ARQ 协议。 + +### 停止等待 ARQ 协议 + +停止等待协议是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认(回复 ACK)。如果过了一段时间(超时时间后),还是没有收到 ACK 确认,说明没有发送成功,需要重新发送,直到收到确认后再发下一个分组; + +在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认。 + +**1) 无差错情况:** + +发送方发送分组,接收方在规定时间内收到,并且回复确认.发送方再次发送。 + +**2) 出现差错情况(超时重传):** + +停止等待协议中超时重传是指只要超过一段时间仍然没有收到确认,就重传前面发送过的分组(认为刚才发送过的分组丢失了)。因此每发送完一个分组需要设置一个超时计时器,其重传时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为 **自动重传请求 ARQ** 。另外在停止等待协议中若收到重复分组,就丢弃该分组,但同时还要发送确认。 + +**3) 确认丢失和确认迟到** + +- **确认丢失** :确认消息在传输过程丢失。当 A 发送 M1 消息,B 收到后,B 向 A 发送了一个 M1 确认消息,但却在传输过程中丢失。而 A 并不知道,在超时计时过后,A 重传 M1 消息,B 再次收到该消息后采取以下两点措施:1. 丢弃这个重复的 M1 消息,不向上层交付。 2. 向 A 发送确认消息。(不会认为已经发送过了,就不再发送。A 能重传,就证明 B 的确认消息丢失)。 +- **确认迟到** :确认消息在传输过程中迟到。A 发送 M1 消息,B 收到并发送确认。在超时时间内没有收到确认消息,A 重传 M1 消息,B 仍然收到并继续发送确认消息(B 收到了 2 份 M1)。此时 A 收到了 B 第二次发送的确认消息。接着发送其他数据。过了一会,A 收到了 B 第一次发送的对 M1 的确认消息(A 也收到了 2 份确认消息)。处理如下:1. A 收到重复的确认后,直接丢弃。2. B 收到重复的 M1 后,也直接丢弃重复的 M1。 + +### 连续 ARQ 协议 + + +连续 ARQ 协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。 + +**优点:** 信道利用率高,容易实现,即使确认丢失,也不必重传。 + +**缺点:** 不能向发送方反映出接收方已经正确收到的所有分组的信息。 比如:发送方发送了 5 条 消息,中间第三条丢失(3 号),这时接收方只能对前两个发送确认。发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。这也叫 Go-Back-N(回退 N),表示需要退回来重传已经发送过的 N 个消息。 + +## Reference + + +1. 《计算机网络(第 7 版)》 +2. 《图解 HTTP》 +3. [https://www.9tut.com/tcp-and-udp-tutorial](https://www.9tut.com/tcp-and-udp-tutorial ) +4. [https://github.com/wolverinn/Waking-Up/blob/master/Computer%20Network.md](https://github.com/wolverinn/Waking-Up/blob/master/Computer%20Network.md ) +5. TCP Flow Control—[https://www.brianstorti.com/tcp-flow-control/](https://www.brianstorti.com/tcp-flow-control/ ) +6. TCP 流量控制(Flow Control):https://notfalse.net/24/tcp-flow-control +7. TCP之滑动窗口原理 : https://cloud.tencent.com/developer/article/1857363 \ No newline at end of file diff --git a/docs/high-performance/load-balancing.md b/docs/high-performance/load-balancing.md index a215b3ff..af6de2be 100644 --- a/docs/high-performance/load-balancing.md +++ b/docs/high-performance/load-balancing.md @@ -1,5 +1,5 @@ --- -title: 负载均衡 +title: 负载均衡(付费) category: 高性能 head: - - meta