This commit is contained in:
by931
2022-09-06 22:30:37 +08:00
parent 66970f3e38
commit 3d6528675a
796 changed files with 3382 additions and 3382 deletions

View File

@@ -268,7 +268,7 @@ function hide_canvas() {
<p>20 世纪 60 年代美国国防部高等研究计划署ARPA建立了 ARPA 网,它有四个分布在各地的节点,被认为是如今互联网的“始祖”。</p>
<p>然后在 70 年代,基于对 ARPA 网的实践和思考,研究人员发明出了著名的 TCP/IP 协议。由于具有良好的分层结构和稳定的性能TCP/IP 协议迅速战胜其他竞争对手流行起来,并在 80 年代中期进入了 UNIX 系统内核,促使更多的计算机接入了互联网。</p>
<h2>创世纪</h2>
<p><img src="assets/a2960d0e44ef6a8fedd4e9bb836e049a.jpg" alt="unpreview" /></p>
<p><img src="assets/a2960d0e44ef6a8fedd4e9bb836e049a.jpg" alt="png" /></p>
<p>蒂姆·伯纳斯 - 李</p>
<p>1989 年任职于欧洲核子研究中心CERN的蒂姆·伯纳斯 - 李Tim Berners-Lee发表了一篇论文提出了在互联网上构建超链接文档系统的构想。这篇论文中他确立了三项关键技术。</p>
<ol>
@@ -299,7 +299,7 @@ function hide_canvas() {
<p>所以 HTTP/1.0 的发布对于当时正在蓬勃发展的互联网来说并没有太大的实际意义,各方势力仍然按照自己的意图继续在市场上奋力拼杀。</p>
<h2>HTTP/1.1</h2>
<p>1995 年,网景的 Netscape Navigator 和微软的 Internet Explorer 开始了著名的“浏览器大战”,都希望在互联网上占据主导地位。</p>
<p><img src="assets/9470d41cab80f36438ebb06a71672242.png" alt="unpreview" /></p>
<p><img src="assets/9470d41cab80f36438ebb06a71672242.png" alt="png" /></p>
<p>这场战争的结果你一定早就知道了,最终微软的 IE 取得了决定性的胜利,而网景则“败走麦城”(但后来却凭借 Mozilla Firefox 又扳回一局)。</p>
<p>“浏览器大战”的是非成败我们放在一边暂且不管,不可否认的是,它再一次极大地推动了 Web 的发展HTTP/1.0 也在这个过程中经受了实践检验。于是在“浏览器大战”结束之后的 1999 年HTTP/1.1 发布了 RFC 文档,编号为 2616正式确立了延续十余年的传奇。</p>
<p>从版本号我们就可以看到HTTP/1.1 是对 HTTP/1.0 的小幅度修正。但一个重要的区别是:它是一个“正式的标准”,而不是一份可有可无的“参考文档”。这意味着今后互联网上所有的浏览器、服务器、网关、代理等等,只要用到 HTTP 协议,就必须严格遵守这个标准,相当于是互联网世界的一个“立法”。</p>
@@ -352,7 +352,7 @@ function hide_canvas() {
</ol>
<p>欢迎你把自己的答案写在留言区,与我和其他同学一起讨论。暂时回答不出来也不要紧,你可以带着这些问题在后续的课程里寻找答案。</p>
<p>如果你觉得有所收获,欢迎你把文章分享给你的朋友。</p>
<p><img src="assets/2016d4e0ab9698c3d2cd560f0fa89a00.png" alt="unpreview" /></p>
<p><img src="assets/2016d4e0ab9698c3d2cd560f0fa89a00.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -262,7 +262,7 @@ function hide_canvas() {
<p>你可能会不假思索、脱口而出“HTTP 就是超文本传输协议,也就是<strong>H</strong>yper<strong>T</strong>ext <strong>T</strong>ransfer <strong>P</strong>rotocol。”</p>
<p>回答非常正确!我必须由衷地恭喜你:能给出这个答案,就表明你具有至少 50%HTTP 相关的知识储备,应该算得上是“半个专家”了。</p>
<p>不过让我们换个对话场景,假设不是我,而是由一位面试官问出刚才的问题呢?</p>
<p><img src="assets/b4de4be0f7dfd4185464bb5a1d6df0bf.png" alt="unpreview" /></p>
<p><img src="assets/b4de4be0f7dfd4185464bb5a1d6df0bf.png" alt="png" /></p>
<p>显然,这个答案有点过于简单了,不能让他满意,他肯定会再追问你一些问题:</p>
<ul>
<li>你是怎么理解 HTTP 字面上的“超文本”和“传输协议”的?</li>
@@ -276,7 +276,7 @@ function hide_canvas() {
<h2>HTTP 是什么</h2>
<p>咱们中国有个成语“人如其名”,意思是一个人的性格和特点是与他的名字相符的。</p>
<p>先看一下 HTTP 的名字:“<strong>超文本传输协议</strong>”,它可以拆成三个部分,分别是:“<strong>超文本</strong>”“<strong>传输</strong>”和“<strong>协议</strong>”。我们从后往前来逐个解析,理解了这三个词,我们也就明白了什么是 HTTP。</p>
<p><img src="assets/d697ba915bcca40a11b8a25571516720.jpg" alt="unpreview" /></p>
<p><img src="assets/d697ba915bcca40a11b8a25571516720.jpg" alt="png" /></p>
<p>首先HTTP 是一个<strong>协议</strong>。不过,协议又是什么呢?</p>
<p>其实“协议”并不仅限于计算机世界,现实生活中也随处可见。例如,你在刚毕业时会签一个“三方协议”,找房子时会签一个“租房协议”,公司入职时还可能会签一个“保密协议”,工作中使用的各种软件也都带着各自的“许可协议”。</p>
<p>刚才说的这几个都是“协议”,本质上与 HTTP 是相同的,那么“协议”有什么特点呢?</p>
@@ -336,7 +336,7 @@ function hide_canvas() {
<li>你能再说出几个“HTTP 不是什么”吗?</li>
</ol>
<p>欢迎你通过留言分享答案,与我和其他同学一起讨论。如果你觉得有所收获,欢迎你把文章分享给你的朋友。</p>
<p><img src="assets/ebcadbddbc7e0c146dbe7617a844e83a.png" alt="unpreview" /></p>
<p><img src="assets/ebcadbddbc7e0c146dbe7617a844e83a.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -276,7 +276,7 @@ function hide_canvas() {
<p>综合起来看,现在的互联网 90% 以上的部分都被万维网,也就是 HTTP 所覆盖,所以把互联网约等于万维网或 HTTP 应该也不算大错。</p>
<h2>浏览器</h2>
<p>上网就要用到浏览器,常见的浏览器有 Google 的 Chrome、Mozilla 的 Firefox、Apple 的 Safari、Microsoft 的 IE 和 Edge还有小众的 Opera 以及国内的各种“换壳”的“极速”“安全”浏览器。</p>
<p><img src="assets/613fffb6defee1735431dc5f89085d8b.png" alt="unpreview" /></p>
<p><img src="assets/613fffb6defee1735431dc5f89085d8b.png" alt="png" /></p>
<p>那么你想过没有,所谓的“浏览器”到底是个什么东西呢?</p>
<p>浏览器的正式名字叫“<strong>Web Browser</strong>”,顾名思义,就是检索、查看互联网上网页资源的应用程序,名字里的 Web实际上指的就是“World Wide Web”也就是万维网。</p>
<p>浏览器本质上是一个 HTTP 协议中的<strong>请求方</strong>,使用 HTTP 协议获取网络上的各种资源。当然,为了让我们更好地检索查看网页,它还集成了很多额外的功能。</p>
@@ -335,7 +335,7 @@ function hide_canvas() {
<li>你怎么理解 WebService 与 Web Server 这两个非常相似的词?</li>
</ol>
<p>欢迎你通过留言分享答案,与我和其他同学一起讨论。如果你觉得有所收获,欢迎你把文章分享给你的朋友。</p>
<p><img src="assets/9ae4483ad53e403464869f227678cf5a.png" alt="unpreview" /></p>
<p><img src="assets/9ae4483ad53e403464869f227678cf5a.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -276,7 +276,7 @@ function hide_canvas() {
<p>于是“<strong>域名系统</strong>”(<strong>D</strong>omain <strong>N</strong>ame <strong>S</strong>ystem出现了用有意义的名字来作为 IP 地址的等价替代。设想一下你是愿意记“95.211.80.227”这样枯燥的数字还是“nginx.org”这样的词组呢</p>
<p>在 DNS 中“域名”Domain Name又称为“主机名”Host为了更好地标记不同国家或组织的主机让名字更好记所以被设计成了一个有层次的结构。</p>
<p>域名用“.”分隔成多个单词级别从左到右逐级升高最右边的被称为“顶级域名”。对于顶级域名可能你随口就能说出几个例如表示商业公司的“com”、表示教育机构的“edu”表示国家的“cn”“uk”等买火车票时的域名还记得吗是“www.12306.cn”。</p>
<p><img src="assets/36b6a41da6e9abc2fc28ee9a305f48b3.jpg" alt="unpreview" /></p>
<p><img src="assets/36b6a41da6e9abc2fc28ee9a305f48b3.jpg" alt="png" /></p>
<p>但想要使用 TCP/IP 协议来通信仍然要使用 IP 地址,所以需要把域名做一个转换,“映射”到它的真实 IP这就是所谓的“<strong>域名解析</strong>”。</p>
<p>继续用刚才的打电话做个比喻,你想要打电话给小明,但不知道电话号码,就得在手机里的号码簿里一项一项地找,直到找到小明那一条记录,然后才能查到号码。这里的“小明”就相当于域名,而“电话号码”就相当于 IP 地址,这个查找的过程就是域名解析。</p>
<p>域名解析的实际操作要比刚才的例子复杂很多,因为互联网上的电脑实在是太多了。目前全世界有 13 组根 DNS 服务器,下面再有许多的顶级 DNS、权威 DNS 和更小的本地 DNS逐层递归地实现域名查询。</p>
@@ -348,7 +348,7 @@ function hide_canvas() {
<li>在讲<strong>代理</strong>时我特意没有举例说明,你能够用引入一个“小强”的角色,通过打电话来比喻一下吗?</li>
</ol>
<p>欢迎你通过留言分享答案,与我和其他同学一起讨论。如果你觉得有所收获,欢迎你把文章分享给你的朋友。</p>
<p><img src="assets/4eab55dc3600071330e088b40cae4856.png" alt="unpreview" /></p>
<p><img src="assets/4eab55dc3600071330e088b40cae4856.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -345,7 +345,7 @@ function hide_canvas() {
<li>你认为 CDN 工作在那一层呢?</li>
</ol>
<p>欢迎你把自己的答案写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/3010b80124bca2f3a91a726713e9ac92.png" alt="unpreview" /></p>
<p><img src="assets/3010b80124bca2f3a91a726713e9ac92.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -339,7 +339,7 @@ function hide_canvas() {
<li>如果因为某些原因DNS 失效或者出错了,会出现什么后果?</li>
</ol>
<p>欢迎你把自己的答案写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/7838e0e705864ddfeacc79e0aeb8f236.png" alt="unpreview" /></p>
<p><img src="assets/7838e0e705864ddfeacc79e0aeb8f236.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -351,7 +351,7 @@ function hide_canvas() {
</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/03727c2a64cbc628ec18cf39a6a526dd.png" alt="unpreview" /></p>
<p><img src="assets/03727c2a64cbc628ec18cf39a6a526dd.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -331,7 +331,7 @@ function hide_canvas() {
<li>这一节课里讲的都是正常的请求处理流程,如果是一个不存在的域名,那么浏览器的工作流程会是怎么样的呢?</li>
</ol>
<p>欢迎你把自己的答案写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/8ef903c86d3ef548a9536bd4345f0156.png" alt="unpreview" /></p>
<p><img src="assets/8ef903c86d3ef548a9536bd4345f0156.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -281,7 +281,7 @@ function hide_canvas() {
<p>说到这里我不由得想起了一部老动画片《大头儿子和小头爸爸》你看HTTP 的报文结构像不像里面的“大头儿子”?</p>
<p>报文里的 header 就是“大头儿子”的“大头”,空行就是他的“脖子”,而后面的 body 部分就是他的身体了。</p>
<p>看一下我们之前用 Wireshark 抓的包吧。</p>
<p><img src="assets/b191c8760c8ad33acd9bb005b251a2df.png" alt="unpreview" /></p>
<p><img src="assets/b191c8760c8ad33acd9bb005b251a2df.png" alt="png" /></p>
<p>在这个浏览器发出的请求报文里第一行“GET / HTTP/1.1”就是请求行而后面的“Host”“Connection”等等都属于 header报文的最后是一个空白行结束没有 body。</p>
<p>在很多时候,特别是浏览器发送 GET 请求的时候都是这样HTTP 报文经常是只有 header 而没 body相当于只发了一个超级“大头”过来你可以想象的出来每时每刻网络上都会有数不清的“大头儿子”在跑来跑去。</p>
<p>不过这个“大头”也不能太大,虽然 HTTP 协议对 header 的大小没有做限制,但各个 Web 服务器都不允许过大的请求头,因为头部太大可能会占用大量的服务器资源,影响运行效率。</p>
@@ -389,7 +389,7 @@ Connection: close
<li>讲头字段时说“:”后的空格可以有多个,那为什么绝大多数情况下都只使用一个空格呢?</li>
</ol>
<p>欢迎你把自己的答案写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/1aa9cb1a1d637e10340451d81e87fc26.png" alt="unpreview" /></p>
<p><img src="assets/1aa9cb1a1d637e10340451d81e87fc26.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -358,7 +358,7 @@ PUT DATA IS HE
<li>你觉得 TRACE/OPTIONS/CONNECT 方法能够用 GET 或 POST 间接实现吗?</li>
</ol>
<p>欢迎你把自己的答案写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,欢迎你把文章分享给你的朋友。</p>
<p><img src="assets/60ee384d93d46cd6632be0606ae21681.png" alt="unpreview" /></p>
<p><img src="assets/60ee384d93d46cd6632be0606ae21681.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -359,7 +359,7 @@ file:///D:/http_study/www/
<li>URI 的查询参数和头字段很相似,都是 key-value 形式,都可以任意自定义,那么它们在使用时该如何区别呢?</li>
</ol>
<p>欢迎你把自己的答案写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,欢迎你把文章分享给你的朋友。</p>
<p><img src="assets/08850d708d38a1301c6960fc554e3d58.png" alt="unpreview" /></p>
<p><img src="assets/08850d708d38a1301c6960fc554e3d58.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -314,7 +314,7 @@ function hide_canvas() {
<li>不同的应用场合有不同的侧重方面,你觉得哪个特点对你来说是最重要的呢?</li>
</ol>
<p>欢迎你把自己的答案写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,欢迎你把文章分享给你的朋友。</p>
<p><img src="assets/a233c19f92c566614e4e0facbaeab27d.png" alt="unpreview" /></p>
<p><img src="assets/a233c19f92c566614e4e0facbaeab27d.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -325,7 +325,7 @@ function hide_canvas() {
<li>你能试着针对这些缺点提出一些自己的解决方案吗?</li>
</ol>
<p>欢迎你把自己的答案写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,欢迎你把文章分享给你的朋友。</p>
<p><img src="assets/7573b0a37ed275bbf6c94eb20875b1ad.png" alt="unpreview" /></p>
<p><img src="assets/7573b0a37ed275bbf6c94eb20875b1ad.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -382,7 +382,7 @@ ext json d
<li>如果对一个被 gzip 的文件执行范围请求比如“Range: bytes=10-19”那么这个范围是应用于原文件还是压缩后的文件呢</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/ab951899844cef3d1e029ba094c2eb71.png" alt="unpreview" /></p>
<p><img src="assets/ab951899844cef3d1e029ba094c2eb71.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -334,7 +334,7 @@ function hide_canvas() {
<li>应当如何降低长连接对服务器的负面影响呢?</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/f93afe4b663d681b8ce63c947f478072.png" alt="unpreview" /></p>
<p><img src="assets/f93afe4b663d681b8ce63c947f478072.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -347,7 +347,7 @@ http://www.chrono.com/18-1?dst=http://nginx.org # 正确
<li>你能结合自己的实际情况,再列出几个应当使用重定向的场景吗?</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/9b873d25e33f86bb2818fc8b50fbff05.png" alt="unpreview" /></p>
<p><img src="assets/9b873d25e33f86bb2818fc8b50fbff05.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -332,7 +332,7 @@ function hide_canvas() {
<li>Cookie 的好处已经很清楚了,你觉得它有什么缺点呢?</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/f03db082760cfa8920b266ce44f52597.png" alt="unpreview" /></p>
<p><img src="assets/f03db082760cfa8920b266ce44f52597.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -352,7 +352,7 @@ function hide_canvas() {
<li>即使有“Last-modified”和“ETag”强制刷新Ctrl+F5也能够从服务器获取最新数据返回 200 而不是 304请你在实验环境里试一下观察请求头和响应头解释原因。</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/1348aa2c81bd5d65ace3aa068b21044b.png" alt="unpreview" /></p>
<p><img src="assets/1348aa2c81bd5d65ace3aa068b21044b.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -344,7 +344,7 @@ Host: www.xxx.com\r\n
<li>你知道多少反向代理中使用的负载均衡算法?它们有什么优缺点?</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/a8122180bd01e05613d75d34962da79f.png" alt="unpreview" /></p>
<p><img src="assets/a8122180bd01e05613d75d34962da79f.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -332,7 +332,7 @@ function hide_canvas() {
<li>缓存的时间策略很重要,太大太小都不好,你觉得应该如何设置呢?</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/54fddf71fc45f1055eff0b59b67dffb8.png" alt="unpreview" /></p>
<p><img src="assets/54fddf71fc45f1055eff0b59b67dffb8.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -332,7 +332,7 @@ https://www.chrono.com/16-1
<li>你知道有哪些方法能够实现机密性、完整性等安全特性呢?</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/052e28eaa90a37f21ae4052135750a4a.png" alt="unpreview" /></p>
<p><img src="assets/052e28eaa90a37f21ae4052135750a4a.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -339,7 +339,7 @@ rsa_2048/aes ratio = 868.13
<li>在混合加密中用到了公钥加密,因为只能由私钥解密。那么反过来,私钥加密后任何人都可以用公钥解密,这有什么用呢?</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/b437f2b898a2f3424bd8812d9a0dcbd7.png" alt="unpreview" /></p>
<p><img src="assets/b437f2b898a2f3424bd8812d9a0dcbd7.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -364,7 +364,7 @@ function hide_canvas() {
<li>你能画出双向认证的流程图吗?</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/93d002084d9bf8283bab3e34e3f4bf14.png" alt="unpreview" /></p>
<p><img src="assets/93d002084d9bf8283bab3e34e3f4bf14.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -371,7 +371,7 @@ function hide_canvas() {
<li>TLS1.3 的握手过程与 TLS1.2 的“False Start”有什么异同</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/ab532f0074ddb136cd96c76c3a385164.png" alt="unpreview" /></p>
<p><img src="assets/ab532f0074ddb136cd96c76c3a385164.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -352,7 +352,7 @@ Handshake Protocol: Server Hello
<li>你觉得哪些优化手段是你在实际工作中能用到的?应该怎样去用?</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/a251606fb0637c6db45b7fd6660af5ab.png" alt="unpreview" /></p>
<p><img src="assets/a251606fb0637c6db45b7fd6660af5ab.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -361,7 +361,7 @@ rewrite ^ https://$host$request_uri permanent; # 永久重定向
<li>参考上一讲,你觉得配置 HTTPS 时还应该加上哪些部分?</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/dbe386f94df8f69fc0b32d2b52e3b3ec.png" alt="unpreview" /></p>
<p><img src="assets/dbe386f94df8f69fc0b32d2b52e3b3ec.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -329,7 +329,7 @@ function hide_canvas() {
<li>你能对比一下 HTTP/2 与 HTTP/1、HTTPS 的相同点和不同点吗?</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/781da6191d342d71d3be2675cb610742.png" alt="unpreview" /></p>
<p><img src="assets/781da6191d342d71d3be2675cb610742.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -356,7 +356,7 @@ function hide_canvas() {
<li>结合这两讲,谈谈 HTTP/2 是如何解决“队头阻塞”问题的。</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/3dfab162c427fb3a1fa16494456ae449.png" alt="unpreview" /></p>
<p><img src="assets/3dfab162c427fb3a1fa16494456ae449.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -278,7 +278,7 @@ function hide_canvas() {
<p>你一定知道UDP 是一个简单、不可靠的传输协议,只是对 IP 协议的一层很薄的包装,和 TCP 相比,它实际应用的较少。</p>
<p>不过正是因为它简单,不需要建连和断连,通信成本低,也就非常灵活、高效,“可塑性”很强。</p>
<p>所以QUIC 就选定了 UDP在它之上把 TCP 的那一套连接管理、拥塞窗口、流量控制等“搬”了过来,“去其糟粕,取其精华”,打造出了一个全新的可靠传输协议,可以认为是“<strong>新时代的 TCP</strong>”。</p>
<p><img src="assets/fd99221ede55272a998760cc6aaa037a.png" alt="unpreview" /></p>
<p><img src="assets/fd99221ede55272a998760cc6aaa037a.png" alt="png" /></p>
<p>QUIC 最早是由 Google 发明的,被称为 gQUIC。而当前正在由 IETF 标准化的 QUIC 被称为 iQUIC。两者的差异非常大甚至比当年的 SPDY 与 HTTP/2 的差异还要大。</p>
<p>gQUIC 混合了 UDP、TLS、HTTP是一个应用层的协议。而 IETF 则对 gQUIC 做了“清理”,把应用部分分离出来,形成了 HTTP/3原来的 UDP 部分“下放”到了传输层,所以 iQUIC 有时候也叫“QUIC-transport”。</p>
<p>接下来要说的 QUIC 都是指 iQUIC要记住它与早期的 gQUIC 不同,是一个传输层的协议,和 TCP 是平级的。</p>
@@ -333,7 +333,7 @@ function hide_canvas() {
<li>对比一下 HTTP/3 和 HTTP/2 各自的流、帧,有什么相同点和不同点。</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/5857f14a3b06b6c0dd38e00b4a6124df.png" alt="unpreview" /></p>
<p><img src="assets/5857f14a3b06b6c0dd38e00b4a6124df.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -341,7 +341,7 @@ http2_push_preload on;
<li>精灵图Spriting、资源内联inlining、域名分片Sharding这些手段为什么会对 HTTP/2 的性能优化造成反效果呢?</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/fb986a7575ec902c86c17a937dbca655.png" alt="unpreview" /></p>
<p><img src="assets/fb986a7575ec902c86c17a937dbca655.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -263,7 +263,7 @@ function hide_canvas() {
<p>那么,在搭建网站的时候,应该选择什么样的服务器软件呢?</p>
<p>在开头的几讲里我也提到过Web 服务器就那么几款目前市面上主流的只有两个Apache 和 Nginx两者合计占据了近 90% 的市场份额。</p>
<p>今天我要说的就是其中的 Nginx它是 Web 服务器的“后起之秀”,虽然比 Apache 小了 10 岁,但增长速度十分迅猛,已经达到了与 Apache“平起平坐”的地位而在“Top Million”网站中更是超过了 Apache拥有超过 50% 的用户(<a href="https://w3techs.com/technologies/cross/web_server/ranking">参考数据</a>)。</p>
<p><img src="assets/c5df0592cc8aef91ba961f7fab5a4a0b.png" alt="unpreview" /></p>
<p><img src="assets/c5df0592cc8aef91ba961f7fab5a4a0b.png" alt="png" /></p>
<p>在这里必须要说一下 Nginx 的正确发音它应该读成“Engine X”但我个人感觉“X”念起来太“拗口”还是比较倾向于读做“Engine ks”这也与 UNIX、Linux 的发音一致。</p>
<p>作为一个 Web 服务器Nginx 的功能非常完善,完美支持 HTTP/1、HTTPS 和 HTTP/2而且还在不断进步。当前的主线版本已经发展到了 1.17,正在进行 HTTP/3 的研发,或许一年之后就能在 Nginx 上跑 HTTP/3 了。</p>
<p>Nginx 也是我个人的主要研究领域,我也写过相关的书,按理来说今天的课程应该是“手拿把攥”,但真正动笔的时候还是有些犹豫的:很多要点都已经在书里写过了,这次的专栏如果再重复相同的内容就不免有“骗稿费”的嫌疑,应该有些“不一样的东西”。</p>
@@ -333,7 +333,7 @@ function hide_canvas() {
<li>试着自己描述一下 Nginx 用进程、epoll、模块流水线处理 HTTP 请求的过程。</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/4c7bceb80a8027389705e9d6ec9eb43d.png" alt="unpreview" /></p>
<p><img src="assets/4c7bceb80a8027389705e9d6ec9eb43d.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -272,12 +272,12 @@ function hide_canvas() {
<p>虽然 OpenResty 的核心是 Nginx但它又超越了 Nginx关键就在于其中的 ngx_lua 模块,把小巧灵活的 Lua 语言嵌入了 Nginx可以用脚本的方式操作 Nginx 内部的进程、多路复用、阶段式处理等各种构件。</p>
<p>脚本语言的好处你一定知道,它不需要编译,随写随执行,这就免去了 C 语言编写模块漫长的开发周期。而且 OpenResty 还把 Lua 自身的协程与 Nginx 的事件机制完美结合在一起,优雅地实现了许多其他语言所没有的“<strong>同步非阻塞</strong>”编程范式,能够轻松开发出高性能的 Web 应用。</p>
<p>目前 OpenResty 有两个分支分别是开源、免费的“OpenResty”和闭源、商业产品的“OpenResty+”运作方式有社区支持、OpenResty 基金会、OpenResty.Inc 公司,还有其他的一些外界赞助(例如 Kong、CloudFlare正在蓬勃发展。</p>
<p><img src="assets/9f7b79c43c476890f03c2c716a20f301.png" alt="unpreview" /></p>
<p><img src="assets/9f7b79c43c476890f03c2c716a20f301.png" alt="png" /></p>
<p>顺便说一下 OpenResty 的官方 logo是一只展翅飞翔的海鸥选择海鸥是因为“鸥”与 OpenResty 的发音相同。另外,这个 logo 的形状也像是左手比出的一个“OK”姿势正好也是一个“O”。</p>
<h2>动态的 Lua</h2>
<p>刚才说了OpenResty 里的一个关键模块是 ngx_lua它为 Nginx 引入了脚本语言 Lua。</p>
<p>Lua 是一个比较“小众”的语言,虽然历史比较悠久,但名气却没有 PHP、Python、JavaScript 大,这主要与它的自身定位有关。</p>
<p><img src="assets/4f24aa3f53969b71baaf7d9c7cf68fd5.png" alt="unpreview" /></p>
<p><img src="assets/4f24aa3f53969b71baaf7d9c7cf68fd5.png" alt="png" /></p>
<p>Lua 的设计目标是嵌入到其他应用程序里运行,为其他编程语言带来“脚本化”能力,所以它的“个头”比较小,功能集有限,不追求“大而全”,而是“小而美”,大多数时间都“隐匿”在其他应用程序的后面,是“无名英雄”。</p>
<p>你或许玩过或者听说过《魔兽世界》《愤怒的小鸟》吧,它们就在内部嵌入了 Lua使用 Lua 来调用底层接口充当“胶水语言”glue language编写游戏逻辑脚本提高开发效率。</p>
<p>OpenResty 选择 Lua 作为“工作语言”也是基于同样的考虑。因为 Nginx C 开发实在是太麻烦了,限制了 Nginx 的真正实力。而 Lua 作为“最快的脚本语言”恰好可以成为 Nginx 的完美搭档,既可以简化开发,性能上又不会有太多的损耗。</p>
@@ -329,7 +329,7 @@ end
<li>你觉得 Nginx 和 OpenResty 的“阶段式处理”有什么好处?对你的实际工作有没有启发?</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/c5b7ac40c585c800af0fe3ab98f3449f.png" alt="unpreview" /></p>
<p><img src="assets/c5b7ac40c585c800af0fe3ab98f3449f.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -361,7 +361,7 @@ SecAuditLog /var/log/modsec_audit.log
<li>你还知道有哪些手段能够抵御网络攻击吗?</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/b9e48b813c98bb34b4b433b7326ace24.png" alt="unpreview" /></p>
<p><img src="assets/b9e48b813c98bb34b4b433b7326ace24.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -325,7 +325,7 @@ function hide_canvas() {
<li>对于无法缓存的动态资源,你觉得 CDN 也能有加速效果吗?</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/bc1805a7c49977c7838b29602f3bba51.png" alt="unpreview" /></p>
<p><img src="assets/bc1805a7c49977c7838b29602f3bba51.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -344,7 +344,7 @@ wss://www.chrono.com:445/im?user_id=xxx
<li>结合自己的实际工作,你觉得 WebSocket 适合用在哪些场景里?</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/4b81de6b5c57db92ed7808344482ef5b.png" alt="unpreview" /></p>
<p><img src="assets/4b81de6b5c57db92ed7808344482ef5b.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -263,7 +263,7 @@ function hide_canvas() {
<p>既然要做性能优化,那么,我们就需要知道:什么是性能?它都有哪些指标,又应该如何度量,进而采取哪些手段去优化?</p>
<p>“性能”其实是一个复杂的概念。不同的人、不同的应用场景都会对它有不同的定义。对于 HTTP 来说,它又是一个非常复杂的系统,里面有非常多的角色,所以很难用一两个简单的词就能把性能描述清楚。</p>
<p>还是从 HTTP 最基本的“请求 - 应答”模型来着手吧。在这个模型里有两个角色:客户端和服务器,还有中间的传输链路,考查性能就可以看这三个部分。</p>
<p><img src="assets/3a8ab1e3ace62d184adc2dc595d32f62.png" alt="unpreview" /></p>
<p><img src="assets/3a8ab1e3ace62d184adc2dc595d32f62.png" alt="png" /></p>
<h2>HTTP 服务器</h2>
<p>我们先来看看服务器,它一般运行在 Linux 操作系统上,用 Apache、Nginx 等 Web 服务器软件对外提供服务,所以,性能的含义就是它的服务能力,也就是尽可能多、尽可能快地处理用户的请求。</p>
<p>衡量服务器性能的主要指标有三个:<strong>吞吐量</strong>requests per second<strong>并发数</strong>concurrency<strong>响应时间</strong>time per request</p>
@@ -331,7 +331,7 @@ sar -n DEV 2 # 看所有网卡的流量,定时 2 秒检查
<li>你是怎么理解客户端的“延迟”的?应该怎样降低延迟?</li>
</ol>
<p>欢迎你把自己的学习体会写在留言区,与我和其他同学一起讨论。如果你觉得有所收获,也欢迎把文章分享给你的朋友。</p>
<p><img src="assets/fbc85df2c908cb8fa6bffde6ea989732.png" alt="unpreview" /></p>
<p><img src="assets/fbc85df2c908cb8fa6bffde6ea989732.png" alt="png" /></p>
</div>
</div>
<div>

View File

@@ -328,7 +328,7 @@ function hide_canvas() {
</ol>
<p>到这里,专栏的全部课程就学完了,在这三个月的时间里你是否有了很多的收获呢?</p>
<p>接下来,就请在广阔的网络世界里去实践这些知识吧,祝你成功!</p>
<p><img src="assets/7b2351d7175e815710de646d53d7958a.png" alt="unpreview" /></p>
<p><img src="assets/7b2351d7175e815710de646d53d7958a.png" alt="png" /></p>
</div>
</div>
<div>