mirror of
https://github.com/zhwei820/learn.lianglianglee.com.git
synced 2025-09-17 08:46:40 +08:00
815 lines
23 KiB
HTML
815 lines
23 KiB
HTML
<!DOCTYPE html>
|
||
|
||
<!-- saved from url=(0046)https://kaiiiz.github.io/hexo-theme-book-demo/ -->
|
||
|
||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||
|
||
<head>
|
||
|
||
<head>
|
||
|
||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
|
||
|
||
<link rel="icon" href="/static/favicon.png">
|
||
|
||
<title>20 稳重的大外甥 - HTTPS.md.html</title>
|
||
|
||
<!-- Spectre.css framework -->
|
||
|
||
<link rel="stylesheet" href="/static/index.css">
|
||
|
||
<!-- theme css & js -->
|
||
|
||
<meta name="generator" content="Hexo 4.2.0">
|
||
|
||
</head>
|
||
|
||
|
||
|
||
<body>
|
||
|
||
|
||
|
||
<div class="book-container">
|
||
|
||
<div class="book-sidebar">
|
||
|
||
<div class="book-brand">
|
||
|
||
<a href="/">
|
||
|
||
<img src="/static/favicon.png">
|
||
|
||
<span>技术文章摘抄</span>
|
||
|
||
</a>
|
||
|
||
</div>
|
||
|
||
<div class="book-menu uncollapsible">
|
||
|
||
<ul class="uncollapsible">
|
||
|
||
<li><a href="/" class="current-tab">首页</a></li>
|
||
|
||
</ul>
|
||
|
||
|
||
|
||
<ul class="uncollapsible">
|
||
|
||
<li><a href="../">上一级</a></li>
|
||
|
||
</ul>
|
||
|
||
|
||
|
||
<ul class="uncollapsible">
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/01 我应该站在谁的肩膀上 - OSI vs TCPIP模型.md.html">01 我应该站在谁的肩膀上 - OSI vs TCPIP模型.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/02 万丈高楼平地起- 物理层 + 数据链路层.md.html">02 万丈高楼平地起- 物理层 + 数据链路层.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/03 OSI的灵魂就是我 - 网络层.md.html">03 OSI的灵魂就是我 - 网络层.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/04 要快还是要稳你说好了 - 传输层.md.html">04 要快还是要稳你说好了 - 传输层.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/05 是时候展现真正的技术了 - 应用层.md.html">05 是时候展现真正的技术了 - 应用层.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/06 重回小学课堂 - 二进制101.md.html">06 重回小学课堂 - 二进制101.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/07 1+1 = 2吗? - 二进制的计算.md.html">07 1+1 = 2吗? - 二进制的计算.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/08 16进制又是个什么鬼? - 16进制的讲解.md.html">08 16进制又是个什么鬼? - 16进制的讲解.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/09 我想有个家 - 什么是IP地址.md.html">09 我想有个家 - 什么是IP地址.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/10 我可是住二环的人 - IP地址的组成和分类.md.html">10 我可是住二环的人 - IP地址的组成和分类.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/11 我已经没地方住了吗 - IPv6.md.html">11 我已经没地方住了吗 - IPv6.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/12 向左还是向右 - IP路由.md.html">12 向左还是向右 - IP路由.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/13 我能给你安全感 - TCP(一).md.html">13 我能给你安全感 - TCP(一).md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/14 我那不为人知的秘密是什么 - TCP(二).md.html">14 我那不为人知的秘密是什么 - TCP(二).md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/15 不问收没收到,就问快不快 - UDP.md.html">15 不问收没收到,就问快不快 - UDP.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/16 我为什么与众不同 - TCP高级篇(拥塞模型).md.html">16 我为什么与众不同 - TCP高级篇(拥塞模型).md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/17 来,先看看我的家谱 - HTTP的身世.md.html">17 来,先看看我的家谱 - HTTP的身世.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/18 我都这么成功了,你却说我不行 - HTTP 的特点和缺点.md.html">18 我都这么成功了,你却说我不行 - HTTP 的特点和缺点.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/19 我老了,让我儿子来吧 - HTTP2.md.html">19 我老了,让我儿子来吧 - HTTP2.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
<a class="current-tab" href="/专栏/全解网络协议/20 稳重的大外甥 - HTTPS.md.html">20 稳重的大外甥 - HTTPS.md.html</a>
|
||
|
||
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/21 HTTP的高级篇 - HTTPClient(Java).md.html">21 HTTP的高级篇 - HTTPClient(Java).md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/22 想来我家,你自己查呀 - DNS.md.html">22 想来我家,你自己查呀 - DNS.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/23 来的早,不如来得巧 - NAT.md.html">23 来的早,不如来得巧 - NAT.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/24 辛苦的邮政 - SMTP.md.html">24 辛苦的邮政 - SMTP.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/25 你就是看不见我 - VPN.md.html">25 你就是看不见我 - VPN.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/26 黑客的好帮手 - SSH.md.html">26 黑客的好帮手 - SSH.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/27 你可以得到我的心,却得不到我的人 - 物理安全设备.md.html">27 你可以得到我的心,却得不到我的人 - 物理安全设备.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/28 你怎么证明你就是你 - 身份验证和访问控制.md.html">28 你怎么证明你就是你 - 身份验证和访问控制.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/29 我要怎么藏好我的考研资料 - 网络攻击(一).md.html">29 我要怎么藏好我的考研资料 - 网络攻击(一).md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/30 我要怎么藏好我的考研资料 - 网络攻击(二).md.html">30 我要怎么藏好我的考研资料 - 网络攻击(二).md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/31 如何保护我的考研资料 - 网络攻击防范.md.html">31 如何保护我的考研资料 - 网络攻击防范.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/32 Linux网络安全 - 安全实战.md.html">32 Linux网络安全 - 安全实战.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/全解网络协议/33 结语.md.html">33 结语.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
|
||
|
||
<div class="sidebar-toggle-inner"></div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<script>
|
||
|
||
function add_inner() {
|
||
|
||
let inner = document.querySelector('.sidebar-toggle-inner')
|
||
|
||
inner.classList.add('show')
|
||
|
||
}
|
||
|
||
|
||
|
||
function remove_inner() {
|
||
|
||
let inner = document.querySelector('.sidebar-toggle-inner')
|
||
|
||
inner.classList.remove('show')
|
||
|
||
}
|
||
|
||
|
||
|
||
function sidebar_toggle() {
|
||
|
||
let sidebar_toggle = document.querySelector('.sidebar-toggle')
|
||
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
|
||
let content = document.querySelector('.off-canvas-content')
|
||
|
||
if (sidebar_toggle.classList.contains('extend')) { // show
|
||
|
||
sidebar_toggle.classList.remove('extend')
|
||
|
||
sidebar.classList.remove('hide')
|
||
|
||
content.classList.remove('extend')
|
||
|
||
} else { // hide
|
||
|
||
sidebar_toggle.classList.add('extend')
|
||
|
||
sidebar.classList.add('hide')
|
||
|
||
content.classList.add('extend')
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
function open_sidebar() {
|
||
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
|
||
let overlay = document.querySelector('.off-canvas-overlay')
|
||
|
||
sidebar.classList.add('show')
|
||
|
||
overlay.classList.add('show')
|
||
|
||
}
|
||
|
||
function hide_canvas() {
|
||
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
|
||
let overlay = document.querySelector('.off-canvas-overlay')
|
||
|
||
sidebar.classList.remove('show')
|
||
|
||
overlay.classList.remove('show')
|
||
|
||
}
|
||
|
||
|
||
|
||
</script>
|
||
|
||
|
||
|
||
<div class="off-canvas-content">
|
||
|
||
<div class="columns">
|
||
|
||
<div class="column col-12 col-lg-12">
|
||
|
||
<div class="book-navbar">
|
||
|
||
<!-- For Responsive Layout -->
|
||
|
||
<header class="navbar">
|
||
|
||
<section class="navbar-section">
|
||
|
||
<a onclick="open_sidebar()">
|
||
|
||
<i class="icon icon-menu"></i>
|
||
|
||
</a>
|
||
|
||
</section>
|
||
|
||
</header>
|
||
|
||
</div>
|
||
|
||
<div class="book-content" style="max-width: 960px; margin: 0 auto;
|
||
|
||
overflow-x: auto;
|
||
|
||
overflow-y: hidden;">
|
||
|
||
<div class="book-post">
|
||
|
||
<p id="tip" align="center"></p>
|
||
|
||
<div><h1>20 稳重的大外甥 - HTTPS</h1>
|
||
|
||
<p>我们前面在讲解HTTP1和HTTP2的时候,有意无意的提到过HTTPS。现在来认真的分析一下这位名正言顺的皇亲国戚。</p>
|
||
|
||
<h3>Certificate Authorities</h3>
|
||
|
||
<p>Certificate Authorities - 证书颁发机构(CA)是HTTPS能够实现安全通信的必要的基本组成部分。这些颁发的证书要加载到网站中,以便客户可以安全地进行通信。每次你通过HTTPS的连接来浏览网站时,该网站的拥有者都会使用颁发机构给的证书来验证其对该域名的所有权(这么好的事,怎么会是免费的呢?这个是需要花钱买的,比如GlobalSign这个公司就是卖Certificate的)。</p>
|
||
|
||
<p>让我给你举个CA的例子。让我们一起来看一下csdn的网站,如你所见,它是通过HTTPS提供的链接。</p>
|
||
|
||
<p><img src="assets/20210219114238633.png" alt="在这里插入图片描述" /></p>
|
||
|
||
<p>有挂锁,点击挂锁会有绿色的安全。</p>
|
||
|
||
<p><img src="assets/20210219114259503.png" alt="在这里插入图片描述" /></p>
|
||
|
||
<p>一切看起来都不错。让我们继续点击Certificate,看看谁颁发了证书。</p>
|
||
|
||
<p><img src="assets/20210219114314890.png" alt="在这里插入图片描述" /></p>
|
||
|
||
<p>我们可以看到它是由GeoTrust颁发的证书。这是一种非常简单的方法,可以检查哪个CA向我颁发了安全通信的证书。就像刚刚的例子一样,很容易去检查谁颁发了证书。事实上CA很多,比如,GlobalSign,DigiCert,还有csdn使用的GeoTrust等等。那这种证书是怎么工作的呢?或者说怎么确保安全和不安全呢。</p>
|
||
|
||
<ol>
|
||
|
||
<li>首先,你的机器要信任这些CA。</li>
|
||
|
||
<li>CA签署证书。</li>
|
||
|
||
<li>从网站返回到浏览器后,你的计算机就会通过参考本地受信任的授权机构列表来验证证书是否合法。</li>
|
||
|
||
</ol>
|
||
|
||
<p>我们来一起看看如何找到这个认证。按Windows + R来运行命令,然后输入certmgr.msc来打开应用程序。你能看到本地证书管理器。我们感兴趣的受信任的根证书颁发机构。如图。</p>
|
||
|
||
<p><img src="assets/20210219114327128.png" alt="在这里插入图片描述" /></p>
|
||
|
||
<p>是不是可以看到我刚刚举例的几个CA都在其中。我们可以在这里看到很多其他名称,其中一些可能是熟悉的,还有许多其他名称是不熟悉的。Windows也可以信任根据需要下载的其他CA。因此,不仅限于我们在此处列出的证书颁发机构。</p>
|
||
|
||
<p>此CA列表由Windows使用,由Internet Explorer使用,由Chrome使用。但Firefox不使用它(就是这么傲娇,你能咋地)。 Firefox管理自己的CA列表。感兴趣的话,你可以通过菜单,选项,高级,然后在此处的“证书”选项卡上,查看证书。这里我就不多讲了。</p>
|
||
|
||
<p>有时删除CA会导致使用该CA的任何网站提供服务的证书无效。比如一个机构颁发的证书安全性严重下降,这使攻击者可以欺诈性地为不受控制的域颁发证书。Microsoft可以立即将它们 从Windows和Firefox的证书颁发机构列表中删除,那他颁发的证书也就无效了。还记得第一步是什么吗?是你的计算机要和CA信任。所以成为CA承担着巨大的责任,如果不十分谨慎地履行其职责,后果可能很严重。所以,要点钱就要点钱吧。</p>
|
||
|
||
<h3>SSL 和 TLS</h3>
|
||
|
||
<p>探讨完了CA,我们来一起看一下SSL和TLS。它们在讨论HTTPS的时候,也是不可回避的话题。并且它们往往可以互换使用。例如,人们通常在说SSL时其实说的是TLS。让我们谈谈它们的实际含义以及背后的黑历史。</p>
|
||
|
||
<h5>SSL</h5>
|
||
|
||
<p>SSL的全称是Secure Sockets Layer也就是安全套接字层,它最初是由Netscape于90年代初期构建的。版本1. 0没有被外部使用,从版本2. 0开始也就是1995年开始问世。这确实是我们第一次开始在网络浏览器中大规模使用安全传输层。随后是第二年的版本3.0。这是SSL的最后一个主要版本。SSL确实存在了很长时间,直到2014年,当我们遭受POODLE攻击时,SSL才真正的寿终正寝(江湖上只流传着哥的传说)。</p>
|
||
|
||
<p><img src="assets/20210219114341383.png" alt="在这里插入图片描述" /></p>
|
||
|
||
<h5>TLS</h5>
|
||
|
||
<p>接下来让我们谈谈TLS。 TLS全称是Transport Layer Security(传输安全层)。1999年作为SSL3.0的升级版现身,它原本打算成为SSL的继任者,这也是关于这两个术语的第一个真正重要的观点。自本世纪初以来,TLS一直是网络上实现HTTPS的标准。 SSL停下了,TLS的时代开启了。版本1. 1于2006年问世,而版本1. 2则在此后2年问世也就是2008。2018年TLS 1.3上线了。随着这些新版本的发布,我们可以看到安全性和速度等方面的进步。它们继续使安全通信变得更强大,更快和更高效。</p>
|
||
|
||
<p>现在的挑战是,你在交流中总是会有两个参与者。对于HTTPS,通常会有一个浏览器和一个服务器。他们会协商使用哪种实现方式。例如,你可能有一台服务器,可以在任何地方实现TLS1.2。现在,如果客户端出现并说,我只能工作到TLS 1.1。则通信将回退到普遍支持的最高协议版本也就是1.1。</p>
|
||
|
||
<p>POODLE攻击后发生的重大变化之一是,开始完全取消对SSL支持。这是因为使POODLE如此有效的部分原因是,攻击者可以迫使通信从TLS降级为SSL,来完美的利用它的弱点。由于SSL至今已经深入我们的脑海,因此人们经常表示TLS时说SSL。这已经变得有点口语化了。例如,如果我要构建一个Web应用程序,并且我想强制应用程序使用安全连接,我设置了一个名为需要SSL的属性。现在,它根本不需要SSL,它需要HTTPS,并且使用TLS来实现。但是它仍然被称为SSL。</p>
|
||
|
||
<h3>TLS 握手 -- 怎么又握手呢?还有完吗</h3>
|
||
|
||
<p>当客户端(例如浏览器)想要通过HTTPS连接到服务器时,它们会开始进行TLS握手。这是客户端和服务器需要相互协商并就如何安全通信达成一致的地方。此握手由客户端问候开始,并且在此请求中,客户端还会将例如它支持的最高级别的TLS和其他信息(比如受支持的密码套件)一起发送。然后,服务器将以服务器问候响应。并在响应中就协议版本和密码套件达成一致,并将其公钥提供回客户端。现在,客户可以根据其证书颁发机构列表来验证该公钥,在这里我们是为了验证我们是在和我们认为的这个服务器来交流。也就是她是我那个女神,不是什么抠脚大汉冒充的。(这里需要注意的一件事是,此初始通信尚未加密,这只是谈判阶段)。所以,中间的人可以看到客户端正在尝试与服务器通信,并且可以知道两者的身份。这段通讯还没有任何的内容;只是试图协商初始连接。客户端现在可以与服务器执行密钥交换,并且此响应使用服务器的公共加密密钥;服务器现在可以向其返回服务器完成的响应;这样便可以开始安全通信。当你基于HTTPS构建应用程序时,你要了解的一点是,这里存在一个协商,你可以看到哪个客户端和服务器正在互相交谈,并且一旦安全地建立了通信,那么请求和响应的内容就会被加密。举个例子,就好像看直播,美女问你要私聊吗,大家都知道是谁在和谁协商,一旦协商好,两人就去私密房了,至于干点啥就是保密的,你就不知道了。(我没有开车呀,不能是一起学网络协议吗?)。这就是TLS握手的过程。</p>
|
||
|
||
<h3>返其道而行</h3>
|
||
|
||
<p>赶紧拉上窗帘,我要在这里给大家介绍一个小网站,它就是badssl.com。</p>
|
||
|
||
<p><img src="assets/20210219114355809.png" alt="在这里插入图片描述" /></p>
|
||
|
||
<p>那这个神秘的网站是干什么的呢?它可以让您测试TLS的错误实现。因为这个网站说明了HTTPS可能出错的所有情况以及它在应用程序中的配置方式。比如,如果你向具有过期证书的网站发出HTTPS请求,该怎么办?</p>
|
||
|
||
<p><img src="assets/20210219114407899.png" alt="在这里插入图片描述" /></p>
|
||
|
||
<p>如图所示,Chrome会给一个非常明显的警告。这正是我们所期望的。你可以通过Inspect然后点击Security来查看这个证书。</p>
|
||
|
||
<p><img src="assets/20210219114422405.png" alt="在这里插入图片描述" /></p>
|
||
|
||
<p>下图就是这个证书</p>
|
||
|
||
<p><img src="assets/20210219114433827.png" alt="在这里插入图片描述" /></p>
|
||
|
||
<p>你可以看到这个证书是什么时候过期的,非常适合查看服务到期后客户端的行为。这也使我们有机会了解不同客户的行为方式。我就不一一列举了,感兴趣的你可以自己研究一下这个网站,看看对你有没有吸引力。</p>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div>
|
||
|
||
<div style="float: left">
|
||
|
||
<a href="/专栏/全解网络协议/19 我老了,让我儿子来吧 - HTTP2.md.html">上一页</a>
|
||
|
||
</div>
|
||
|
||
<div style="float: right">
|
||
|
||
<a href="/专栏/全解网络协议/21 HTTP的高级篇 - HTTPClient(Java).md.html">下一页</a>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||
|
||
</div>
|
||
|
||
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v652eace1692a40cfa3763df669d7439c1639079717194" integrity="sha512-Gi7xpJR8tSkrpF7aordPZQlW2DLtzUlZcumS8dMQjwDHEnw9I7ZLyiOj/6tZStRBGtGgN6ceN6cMH8z7etPGlw==" data-cf-beacon='{"rayId":"70997648de6c3cfa","version":"2021.12.0","r":1,"token":"1f5d475227ce4f0089a7cff1ab17c0f5","si":100}' crossorigin="anonymous"></script>
|
||
|
||
</body>
|
||
|
||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||
|
||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NPSEEVD756"></script>
|
||
|
||
<script>
|
||
|
||
window.dataLayer = window.dataLayer || [];
|
||
|
||
|
||
|
||
function gtag() {
|
||
|
||
dataLayer.push(arguments);
|
||
|
||
}
|
||
|
||
|
||
|
||
gtag('js', new Date());
|
||
|
||
gtag('config', 'G-NPSEEVD756');
|
||
|
||
var path = window.location.pathname
|
||
|
||
var cookie = getCookie("lastPath");
|
||
|
||
console.log(path)
|
||
|
||
if (path.replace("/", "") === "") {
|
||
|
||
if (cookie.replace("/", "") !== "") {
|
||
|
||
console.log(cookie)
|
||
|
||
document.getElementById("tip").innerHTML = "<a href='" + cookie + "'>跳转到上次进度</a>"
|
||
|
||
}
|
||
|
||
} else {
|
||
|
||
setCookie("lastPath", path)
|
||
|
||
}
|
||
|
||
|
||
|
||
function setCookie(cname, cvalue) {
|
||
|
||
var d = new Date();
|
||
|
||
d.setTime(d.getTime() + (180 * 24 * 60 * 60 * 1000));
|
||
|
||
var expires = "expires=" + d.toGMTString();
|
||
|
||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||
|
||
}
|
||
|
||
|
||
|
||
function getCookie(cname) {
|
||
|
||
var name = cname + "=";
|
||
|
||
var ca = document.cookie.split(';');
|
||
|
||
for (var i = 0; i < ca.length; i++) {
|
||
|
||
var c = ca[i].trim();
|
||
|
||
if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
|
||
|
||
}
|
||
|
||
return "";
|
||
|
||
}
|
||
|
||
|
||
|
||
</script>
|
||
|
||
|
||
|
||
</html>
|
||
|