<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Web &#8211; Wu&#039;s Blog</title>
	<atom:link href="https://www.wublog.site/category/web/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.wublog.site</link>
	<description></description>
	<lastBuildDate>Sun, 18 Jan 2026 06:17:44 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.wublog.site/wp-content/uploads/2026/03/cropped-profile-32x32.jpg</url>
	<title>Web &#8211; Wu&#039;s Blog</title>
	<link>https://www.wublog.site</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>HTTPS的加密原理</title>
		<link>https://www.wublog.site/2026/01/17/https%e7%9a%84%e5%8a%a0%e5%af%86%e5%8e%9f%e7%90%86/</link>
					<comments>https://www.wublog.site/2026/01/17/https%e7%9a%84%e5%8a%a0%e5%af%86%e5%8e%9f%e7%90%86/#comments</comments>
		
		<dc:creator><![CDATA[Wu]]></dc:creator>
		<pubDate>Sat, 17 Jan 2026 05:59:00 +0000</pubDate>
				<category><![CDATA[Web]]></category>
		<guid isPermaLink="false">https://www.wublog.site/?p=216</guid>

					<description><![CDATA[为什么需要加密？ 因为http的内容是明文传输的，明文数据会经过中间代理服务器、路由器、wifi热点、通信服务 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading"><strong>为什么需要加密？</strong></h2>



<p>因为http的内容是明文传输的，明文数据会经过中间代理服务器、路由器、wifi热点、通信服务运营商等多个物理节点，如果信息在传输过程中被劫持，传输的内容就完全暴露了。劫持者还可以篡改传输的信息且不被双方察觉，这就是<code>中间人攻击</code>。所以我们才需要对信息进行加密。最容易理解的就是<code>对称加密</code>&nbsp;。</p>



<h2 class="wp-block-heading"><strong>什么是对称加密？</strong></h2>



<p>简单说就是有一个密钥，它可以加密一段信息，也可以对加密后的信息进行解密，和我们日常生活中用的钥匙作用差不多。</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="782" height="343" src="https://www.wublog.site/wp-content/uploads/2026/01/image.png" alt="" class="wp-image-301" srcset="https://www.wublog.site/wp-content/uploads/2026/01/image.png 782w, https://www.wublog.site/wp-content/uploads/2026/01/image-300x132.png 300w, https://www.wublog.site/wp-content/uploads/2026/01/image-768x337.png 768w" sizes="(max-width: 782px) 100vw, 782px" /></figure>



<h2 class="wp-block-heading"><strong>用对称加密可行吗？</strong></h2>



<p><strong>如果通信双方都各自持有同一个密钥，且没有别人知道，这两方的通信安全当然是可以被保证的（除非密钥被破解）。</strong></p>



<p>然而最大的问题就是<strong>这个密钥怎么让传输的双方知晓，同时不被别人知道</strong>。如果由服务器生成一个密钥并传输给浏览器，那在这个传输过程中密钥被别人劫持到手了怎么办？之后他就能用密钥解开双方传输的任何内容了，所以这么做当然不行。</p>



<p>换种思路？试想一下，如果浏览器内部就预存了网站A的密钥，且可以确保除了浏览器和网站A，不会有任何外人知道该密钥，那理论上用对称加密是可以的，这样浏览器只要预存好世界上所有HTTPS网站的密钥就行了！这么做显然不现实。<br>怎么办？所以我们就需要<code>非对称加密</code>&nbsp;。</p>



<h2 class="wp-block-heading"><strong>什么是非对称加密？</strong></h2>



<p>简单说就是有两把密钥，通常一把叫做公钥、一把叫私钥，用公钥加密的内容必须用私钥才能解开，同样，私钥加密的内容只有公钥能解开。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="782" height="343" src="https://www.wublog.site/wp-content/uploads/2026/01/image-1.png" alt="" class="wp-image-302" srcset="https://www.wublog.site/wp-content/uploads/2026/01/image-1.png 782w, https://www.wublog.site/wp-content/uploads/2026/01/image-1-300x132.png 300w, https://www.wublog.site/wp-content/uploads/2026/01/image-1-768x337.png 768w" sizes="(max-width: 782px) 100vw, 782px" /></figure>



<h2 class="wp-block-heading">用非对称加密可行吗？</h2>



<p>鉴于非对称加密的机制，我们可能会有这种思路：服务器先把公钥以明文方式传输给浏览器，之后浏览器向服务器传数据前都先用这个公钥加密好再传，这条数据的安全似乎可以保障了！<strong>因为只有服务器有相应的私钥能解开公钥加密的数据</strong>。</p>



<p>然而反过来<strong>由服务器到浏览器的这条路怎么保障安全？</strong>如果服务器用它的私钥加密数据传给浏览器，那么浏览器用公钥可以解密它，而这个公钥是一开始通过明文传输给浏览器的，若这个公钥被中间人劫持到了，那他也能用该公钥解密服务器传来的信息了。所以<strong>目前似乎只能保证由浏览器向服务器传输数据的安全性</strong>（其实仍有漏洞，下文会说），那利用这点你能想到什么解决方案吗？</p>



<h2 class="wp-block-heading"><strong>改良的非对称加密方案，似乎可以？</strong></h2>



<p>我们已经理解通过一组公钥私钥，可以保证单个方向传输的安全性，那用两组公钥私钥，是否就能保证双向传输都安全了？请看下面的过程：</p>



<ol class="wp-block-list">
<li>某网站服务器拥有公钥A与对应的私钥A’；浏览器拥有公钥B与对应的私钥B’。</li>



<li>浏览器把公钥B明文传输给服务器。</li>



<li>服务器把公钥A明文给传输浏览器。</li>



<li>之后浏览器向服务器传输的内容都用公钥A加密，服务器收到后用私钥A’解密。由于只有服务器拥有私钥A’，所以能保证这条数据的安全。</li>



<li>同理，服务器向浏览器传输的内容都用公钥B加密，浏览器收到后用私钥B’解密。同上也可以保证这条数据的安全。</li>
</ol>



<p>的确可以！抛开这里面仍有的漏洞不谈（下文会讲），HTTPS的加密却没使用这种方案，为什么？很重要的原因是非对称加密算法非常耗时，而对称加密快很多。那我们能不能运用非对称加密的特性解决前面提到的对称加密的漏洞？</p>



<h2 class="wp-block-heading"><strong>非对称加密+对称加密？</strong></h2>



<p>既然非对称加密耗时，那非对称加密+对称加密结合可以吗？而且得尽量减少非对称加密的次数。当然是可以的，且非对称加密、解密各只需用一次即可。<br>请看一下这个过程：</p>



<ol class="wp-block-list">
<li>某网站拥有用于非对称加密的公钥A、私钥A’。</li>



<li>浏览器向网站服务器请求，服务器把公钥A明文给传输浏览器。</li>



<li>浏览器随机生成一个用于对称加密的密钥X，用公钥A加密后传给服务器。</li>



<li>服务器拿到后用私钥A’解密得到密钥X。</li>



<li>这样双方就都拥有密钥X了，且别人无法知道它。之后双方所有数据都通过密钥X加密解密即可。</li>
</ol>



<p>完美！HTTPS基本就是采用了这种方案。完美？还是有漏洞的。</p>



<h2 class="wp-block-heading"><strong>中间人攻击</strong></h2>



<figure class="wp-block-image size-full"><img decoding="async" width="763" height="251" src="https://www.wublog.site/wp-content/uploads/2026/01/image-2.jpg" alt="" class="wp-image-314" srcset="https://www.wublog.site/wp-content/uploads/2026/01/image-2.jpg 763w, https://www.wublog.site/wp-content/uploads/2026/01/image-2-300x99.jpg 300w" sizes="(max-width: 763px) 100vw, 763px" /></figure>



<p>如果在数据传输过程中，中间人劫持到了数据，此时他的确无法得到浏览器生成的密钥X，这个密钥本身被公钥A加密了，只有服务器才有私钥A’解开它，然而中间人却完全不需要拿到私钥A’就能干坏事了。请看：</p>



<ol class="wp-block-list">
<li>某网站有用于非对称加密的公钥A、私钥A’。</li>



<li>浏览器向网站服务器请求，服务器把公钥A明文给传输浏览器。</li>



<li><strong>中间人劫持到公钥A，保存下来，把数据包中的公钥A替换成自己伪造的公钥B（它当然也拥有公钥B对应的私钥B’）</strong>。</li>



<li>浏览器生成一个用于对称加密的密钥X，用<strong>公钥B</strong>（浏览器无法得知公钥被替换了）加密后传给服务器。</li>



<li><strong>中间人劫持后用私钥B’解密得到密钥X，再用公钥A加密后传给服务器</strong>。</li>



<li>服务器拿到后用私钥A’解密得到密钥X。</li>
</ol>



<p>这样在双方都不会发现异常的情况下，中间人通过一套“狸猫换太子”的操作，掉包了服务器传来的公钥，进而得到了密钥X。<strong>根本原因是浏览器无法确认收到的公钥是不是网站自己的，</strong>因为公钥本身是明文传输的，难道还得对公钥的传输进行加密？这似乎变成鸡生蛋、蛋生鸡的问题了。解法是什么？</p>



<h2 class="wp-block-heading"><strong>如何证明浏览器收到的公钥一定是该网站的公钥？</strong></h2>



<p>其实所有证明的源头都是一条或多条不证自明的“公理”（可以回想一下数学上公理），由它推导出一切。比如现实生活中，若想证明某身份证号一定是小明的，可以看他身份证，而身份证是由政府作证的，这里的“公理”就是“政府机构可信”，这也是社会正常运作的前提。</p>



<p>那能不能类似地有个机构充当互联网世界的“公理”呢？让它作为一切证明的源头，给网站颁发一个“身份证”？</p>



<p>它就是<strong><a href="https://zhida.zhihu.com/search?content_id=8792770&amp;content_type=Article&amp;match_order=1&amp;q=CA%E6%9C%BA%E6%9E%84&amp;zhida_source=entity" target="_blank" rel="noreferrer noopener">CA机构</a></strong>，它是如今互联网世界正常运作的前提，而CA机构颁发的“身份证”就是<strong>数字证书</strong>。</p>



<h2 class="wp-block-heading"><strong>数字证书</strong></h2>



<p>网站在使用HTTPS前，需要向<strong>CA机构</strong>申领一份<strong>数字证书</strong>，数字证书里含有证书持有者信息、公钥信息等。服务器把证书传输给浏览器，浏览器从证书里获取公钥就行了，证书就如身份证，证明“该公钥对应该网站”。而这里又有一个显而易见的问题，“<strong>证书本身的传输过程中，如何防止被篡改”</strong>？即如何证明证书本身的真实性？身份证运用了一些防伪技术，而数字证书怎么防伪呢？解决这个问题我们就接近胜利了！</p>



<h2 class="wp-block-heading"><strong>如何放防止数字证书被篡改？</strong></h2>



<p>我们把证书原本的内容生成一份“签名”，比对证书内容和签名是否一致就能判别是否被篡改。这就是数字证书的“防伪技术”，这里的“签名”就叫<code>数字签名</code>：</p>



<h2 class="wp-block-heading"><strong>数字签名</strong></h2>



<p>这部分内容建议看下图并结合后面的文字理解，图中左侧是数字签名的制作过程，右侧是验证过程：</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="730" height="547" src="https://www.wublog.site/wp-content/uploads/2026/01/image-3.png" alt="" class="wp-image-305" srcset="https://www.wublog.site/wp-content/uploads/2026/01/image-3.png 730w, https://www.wublog.site/wp-content/uploads/2026/01/image-3-300x225.png 300w" sizes="auto, (max-width: 730px) 100vw, 730px" /></figure>



<p>数字签名的制作过程：</p>



<ol class="wp-block-list">
<li>CA机构拥有非对称加密的私钥和公钥。</li>



<li>CA机构对证书明文数据T进行hash。</li>



<li>对hash后的值用私钥加密，得到数字签名S。</li>
</ol>



<p>明文和数字签名共同组成了数字证书，这样一份数字证书就可以颁发给网站了。<br>那浏览器拿到服务器传来的数字证书后，如何验证它是不是真的？（有没有被篡改、掉包）</p>



<p>浏览器验证过程：</p>



<ol class="wp-block-list">
<li>拿到证书，得到明文T，签名S。</li>



<li>用CA机构的公钥对S解密（由于是浏览器信任的机构，所以浏览器保有它的公钥。详情见下文），得到S’。</li>



<li>用证书里指明的hash算法对明文T进行hash得到T’。</li>



<li>显然通过以上步骤，T’应当等于S‘，除非明文或签名被篡改。所以此时比较S’是否等于T’，等于则表明证书可信。</li>
</ol>



<p>为何么这样可以保证证书可信呢？我们来仔细想一下。</p>



<h2 class="wp-block-heading"><strong>中间人有可能篡改该证书吗？</strong></h2>



<p>假设中间人篡改了证书的原文，由于他没有CA机构的私钥，所以无法得到此时加密后签名，无法相应地篡改签名。浏览器收到该证书后会发现原文和签名解密后的值不一致，则说明证书已被篡改，证书不可信，从而终止向服务器传输信息，防止信息泄露给中间人。</p>



<p>既然不可能篡改，那整个证书被掉包呢？</p>



<h2 class="wp-block-heading"><strong>中间人有可能把证书掉包吗？</strong></h2>



<p>假设有另一个网站B也拿到了CA机构认证的证书，它想劫持网站A的信息。于是它成为中间人拦截到了A传给浏览器的证书，然后替换成自己的证书，传给浏览器，之后浏览器就会错误地拿到B的证书里的公钥了，这确实会导致上文“中间人攻击”那里提到的漏洞？</p>



<p>其实这并不会发生，因为证书里包含了网站A的信息，包括域名，浏览器把证书里的域名与自己请求的域名比对一下就知道有没有被掉包了。</p>



<h2 class="wp-block-heading"><strong>为什么制作数字签名时需要hash一次？</strong></h2>



<p>我初识HTTPS的时候就有这个疑问，因为似乎那里的hash有点多余，把hash过程去掉也能保证证书没有被篡改。</p>



<p>最显然的是性能问题，前面我们已经说了非对称加密效率较差，证书信息一般较长，比较耗时。而hash后得到的是固定长度的信息（比如用md5算法hash后可以得到固定的128位的值），这样加解密就快很多。</p>



<p>当然也有安全上的原因，这部分内容相对深一些，感兴趣的可以看这篇解答：<a href="https://crypto.stackexchange.com/questions/12768/why-hash-the-message-before-signing-it-with-rsa/12780#12780" target="_blank" rel="noreferrer noopener">crypto.stackexchange.com/a/12780</a></p>



<h2 class="wp-block-heading"><strong>怎么证明CA机构的公钥是可信的？</strong></h2>



<p>你们可能会发现上文中说到CA机构的公钥，我几乎一笔带过，“浏览器保有它的公钥”，这是个什么保有法？怎么证明这个公钥是否可信？</p>



<p>让我们回想一下数字证书到底是干啥的？没错，为了证明某公钥是可信的，即“该公钥是否对应该网站”，那CA机构的公钥是否也可以用数字证书来证明？没错，操作系统、浏览器本身会预装一些它们信任的根证书，如果其中会有CA机构的根证书，这样就可以拿到它对应的可信公钥了。</p>



<p>实际上证书之间的认证也可以不止一层，可以A信任B，B信任C，以此类推，我们把它叫做<code>信任链</code>或<code>数字证书链</code>。也就是一连串的数字证书，由根证书为起点，透过层层信任，使终端实体证书的持有者可以获得转授的信任，以证明身份。</p>



<p>另外，不知你们是否遇到过网站访问不了、提示需安装证书的情况？这里安装的就是根证书。说明浏览器不认给这个网站颁发证书的机构，那么你就得手动下载安装该机构的根证书（风险自己承担XD）。安装后，你就有了它的公钥，就可以用它验证服务器发来的证书是否可信了。</p>



<h2 class="wp-block-heading"><strong>每次进行HTTPS请求时都</strong>必须<strong>在SSL/TLS层进行握手传输密钥吗？</strong></h2>



<p>这也是我当时的困惑之一，显然每次请求都经历一次密钥传输过程非常耗时，那怎么达到只传输一次呢？</p>



<p>服务器会为每个浏览器（或客户端软件）维护一个session ID，在TLS握手阶段传给浏览器，浏览器生成好密钥传给服务器后，服务器会把该密钥存到相应的session ID下，之后浏览器每次请求都会携带session ID，服务器会根据session ID找到相应的密钥并进行解密加密操作，这样就不必要每次重新制作、传输密钥了！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.wublog.site/2026/01/17/https%e7%9a%84%e5%8a%a0%e5%af%86%e5%8e%9f%e7%90%86/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>HTTP 响应状态码</title>
		<link>https://www.wublog.site/2026/01/02/http-%e5%93%8d%e5%ba%94%e7%8a%b6%e6%80%81%e7%a0%81/</link>
					<comments>https://www.wublog.site/2026/01/02/http-%e5%93%8d%e5%ba%94%e7%8a%b6%e6%80%81%e7%a0%81/#respond</comments>
		
		<dc:creator><![CDATA[Wu]]></dc:creator>
		<pubDate>Fri, 02 Jan 2026 05:28:57 +0000</pubDate>
				<category><![CDATA[Web]]></category>
		<guid isPermaLink="false">https://www.wublog.site/?p=219</guid>

					<description><![CDATA[HTTP 响应状态码用来表明特定 HTTP 请求是否成功完成。 响应被归为以下五大类： 以下状态码由 sect [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>HTTP 响应状态码用来表明特定 HTTP 请求是否成功完成。 响应被归为以下五大类：</p>



<ol class="wp-block-list">
<li>信息响应 (<code>100</code>–<code>199</code>)</li>



<li>成功响应 (<code>200</code>–<code>299</code>)</li>



<li>重定向消息 (<code>300</code>–<code>399</code>)</li>



<li>客户端错误响应 (<code>400</code>–<code>499</code>)</li>



<li>服务端错误响应 (<code>500</code>–<code>599</code>)</li>
</ol>



<p>以下状态码由 section 10 of RFC 2616 定义。你可以在 RFC 7231 中找到更新后的规范。</p>



<p><strong>备注：</strong>如果你收到的响应不在 此列表 中，则它为非标准响应，可能是服务器软件的自定义响应。</p>



<h2 class="wp-block-heading">一、信息响应</h2>



<ul class="wp-block-list">
<li><code>100 Continue</code>这个临时响应表明，迄今为止的所有内容都是可行的，客户端应该继续请求，如果已经完成，则忽略它。</li>



<li><code>101 Switching Protocols</code>该代码是响应客户端的 <code>Upgrade</code> 请求头发送的，指明服务器即将切换的协议。</li>



<li><code>102 Processing</code> (WebDAV)此代码表示服务器已收到并正在处理该请求，但当前没有响应可用。</li>



<li><code>103 Early Hints</code>此状态代码主要用于与 <code>Link</code> 链接头一起使用，以允许用户代理在服务器准备响应阶段时开始预加载 preloading 资源。</li>
</ul>



<h2 class="wp-block-heading">二、成功响应</h2>



<ul class="wp-block-list">
<li><code>200 OK</code>请求成功。成功的含义取决于 HTTP 方法：<code>GET</code>: 资源已被提取并在消息正文中传输。<code>HEAD</code>: 实体标头位于消息正文中。<code>PUT</code> or <code>POST</code>: 描述动作结果的资源在消息体中传输。<code>TRACE</code>: 消息正文包含服务器收到的请求消息。</li>



<li><code>201 Created</code>该请求已成功，并因此创建了一个新的资源。这通常是在 POST 请求，或是某些 PUT 请求之后返回的响应。</li>



<li><code>202 Accepted</code>请求已经接收到，但还未响应，没有结果。意味着不会有一个异步的响应去表明当前请求的结果，预期另外的进程和服务去处理请求，或者批处理。</li>



<li><code>203 Non-Authoritative Information</code>服务器已成功处理了请求，但返回的实体头部元信息不是在原始服务器上有效的确定集合，而是来自本地或者第三方的拷贝。当前的信息可能是原始版本的子集或者超集。例如，包含资源的元数据可能导致原始服务器知道元信息的超集。使用此状态码不是必须的，而且只有在响应不使用此状态码便会返回<code>200 OK</code>的情况下才是合适的。</li>



<li><code>204 No Content</code>对于该请求没有的内容可发送，但头部字段可能有用。用户代理可能会用此时请求头部信息来更新原来资源的头部缓存字段。</li>



<li><code>205 Reset Content</code>告诉用户代理重置发送此请求的文档。</li>



<li><code>206 Partial Content</code>当从客户端发送<code>Range</code>范围标头以只请求资源的一部分时，将使用此响应代码。</li>



<li><code>207 Multi-Status</code> (WebDAV)对于多个状态代码都可能合适的情况，传输有关多个资源的信息。</li>



<li><code>208 Already Reported</code> (WebDAV)在 DAV 里面使用 <code>&lt;dav:propstat&gt;</code> 响应元素以避免重复枚举多个绑定的内部成员到同一个集合。</li>



<li><code>226 IM Used</code> (HTTP Delta encoding)服务器已经完成了对资源的<code>GET</code>请求，并且响应是对当前实例应用的一个或多个实例操作结果的表示。</li>
</ul>



<h2 class="wp-block-heading">三、重定向消息</h2>



<ul class="wp-block-list">
<li><code>300 Multiple Choice</code>请求拥有多个可能的响应。用户代理或者用户应当从中选择一个。（没有标准化的方法来选择其中一个响应，但是建议使用指向可能性的 HTML 链接，以便用户可以选择。）</li>



<li><code>301 Moved Permanently</code>请求资源的 URL 已永久更改。在响应中给出了新的 URL。</li>



<li><code>302 Found</code>此响应代码表示所请求资源的 URI 已 <em>暂时</em> 更改。未来可能会对 URI 进行进一步的改变。因此，客户机应该在将来的请求中使用这个相同的 URI。</li>



<li><code>303 See Other</code>服务器发送此响应，以指示客户端通过一个 GET 请求在另一个 URI 中获取所请求的资源。</li>



<li><code>304 Not Modified</code>这是用于缓存的目的。它告诉客户端响应还没有被修改，因此客户端可以继续使用相同的缓存版本的响应。</li>



<li><code>305 Use Proxy</code> 已弃用在 HTTP 规范中定义，以指示请求的响应必须被代理访问。由于对代理的带内配置的安全考虑，它已被弃用。</li>



<li><code>306 unused</code>此响应代码不再使用；它只是保留。它曾在 HTTP/1.1 规范的早期版本中使用过。</li>



<li><code>307 Temporary Redirect</code>服务器发送此响应，以指示客户端使用在前一个请求中使用的相同方法在另一个 URI 上获取所请求的资源。这与 <code>302 Found</code> HTTP 响应代码具有相同的语义，但用户代理 <em>不能</em> 更改所使用的 HTTP 方法：如果在第一个请求中使用了 <code>POST</code>，则在第二个请求中必须使用 <code>POST</code></li>



<li><code>308 Permanent Redirect</code>这意味着资源现在永久位于由<code>Location:</code> HTTP Response 标头指定的另一个 URI。这与 <code>301 Moved Permanently</code> HTTP 响应代码具有相同的语义，但用户代理不能更改所使用的 HTTP 方法：如果在第一个请求中使用 <code>POST</code>，则必须在第二个请求中使用 <code>POST</code>。</li>
</ul>



<h2 class="wp-block-heading">四、客户端错误响应</h2>



<ul class="wp-block-list">
<li><code>400 Bad Request</code>由于被认为是客户端错误（例如，错误的请求语法、无效的请求消息帧或欺骗性的请求路由），服务器无法或不会处理请求。</li>



<li><code>401 Unauthorized</code>虽然 HTTP 标准指定了&#8221;unauthorized&#8221;，但从语义上来说，这个响应意味着&#8221;unauthenticated&#8221;。也就是说，客户端必须对自身进行身份验证才能获得请求的响应。</li>



<li><code>402 Payment Required</code> 实验性此响应代码保留供将来使用。创建此代码的最初目的是将其用于数字支付系统，但是此状态代码很少使用，并且不存在标准约定。</li>



<li><code>403 Forbidden</code>客户端没有访问内容的权限；也就是说，它是未经授权的，因此服务器拒绝提供请求的资源。与 <code>401 Unauthorized</code> 不同，服务器知道客户端的身份。</li>



<li><code>404 Not Found</code>服务器找不到请求的资源。在浏览器中，这意味着无法识别 URL。在 API 中，这也可能意味着端点有效，但资源本身不存在。服务器也可以发送此响应，而不是 <code>403 Forbidden</code>，以向未经授权的客户端隐藏资源的存在。这个响应代码可能是最广为人知的，因为它经常出现在网络上。</li>



<li><code>405 Method Not Allowed</code>服务器知道请求方法，但目标资源不支持该方法。例如，API 可能不允许调用<code>DELETE</code>来删除资源。</li>



<li><code>406 Not Acceptable</code>当 web 服务器在执行服务端驱动型内容协商机制后，没有发现任何符合用户代理给定标准的内容时，就会发送此响应。</li>



<li><code>407 Proxy Authentication Required</code>类似于 <code>401 Unauthorized</code> 但是认证需要由代理完成。</li>



<li><code>408 Request Timeout</code>此响应由一些服务器在空闲连接上发送，即使客户端之前没有任何请求。这意味着服务器想关闭这个未使用的连接。由于一些浏览器，如 Chrome、Firefox 27+ 或 IE9，使用 HTTP 预连接机制来加速冲浪，所以这种响应被使用得更多。还要注意的是，有些服务器只是关闭了连接而没有发送此消息。</li>



<li><code>409 Conflict</code>当请求与服务器的当前状态冲突时，将发送此响应。</li>



<li><code>410 Gone</code>当请求的内容已从服务器中永久删除且没有转发地址时，将发送此响应。客户端需要删除缓存和指向资源的链接。HTTP 规范打算将此状态代码用于“有限时间的促销服务”。API 不应被迫指出已使用此状态代码删除的资源。</li>



<li><code>411 Length Required</code>服务端拒绝该请求因为 <code>Content-Length</code> 头部字段未定义但是服务端需要它。</li>



<li><code>412 Precondition Failed</code>客户端在其头文件中指出了服务器不满足的先决条件。</li>



<li><code>413 Payload Too Large</code>请求实体大于服务器定义的限制。服务器可能会关闭连接，或在标头字段后返回重试 <code>Retry-After</code>。</li>



<li><code>414 URI Too Long</code>客户端请求的 URI 比服务器愿意接收的长度长。</li>



<li><code>415 Unsupported Media Type</code>服务器不支持请求数据的媒体格式，因此服务器拒绝请求。</li>



<li><code>416 Range Not Satisfiable</code>无法满足请求中 <code>Range</code> 标头字段指定的范围。该范围可能超出了目标 URI 数据的大小。</li>



<li><code>417 Expectation Failed</code>此响应代码表示服务器无法满足 <code>Expect</code> 请求标头字段所指示的期望。</li>



<li><code>418 I'm a teapot</code>服务端拒绝用茶壶煮咖啡。笑话，典故来源茶壶冲泡咖啡</li>



<li><code>421 Misdirected Request</code>请求被定向到无法生成响应的服务器。这可以由未配置为针对请求 URI 中包含的方案和权限组合生成响应的服务器发送。</li>



<li><code>422 Unprocessable Entity</code> (WebDAV)请求格式正确，但由于语义错误而无法遵循。</li>



<li><code>423 Locked</code> (WebDAV)正在访问的资源已锁定。</li>



<li><code>424 Failed Dependency</code> (WebDAV)由于前一个请求失败，请求失败。</li>



<li><code>425 Too Early</code> 实验性表示服务器不愿意冒险处理可能被重播的请求。</li>



<li><code>426 Upgrade Required</code>服务器拒绝使用当前协议执行请求，但在客户端升级到其他协议后可能愿意这样做。 服务端发送带有<code>Upgrade</code> 字段的 426 响应 来表明它所需的协议（们）。</li>



<li><code>428 Precondition Required</code>源服务器要求请求是有条件的。此响应旨在防止&#8217;丢失更新&#8217;问题，即当第三方修改服务器上的状态时，客户端 <code>GET</code> 获取资源的状态，对其进行修改并将其 <code>PUT</code> 放回服务器，从而导致冲突。</li>



<li><code>429 Too Many Requests</code>用户在给定的时间内发送了太多请求（&#8221;限制请求速率&#8221;）</li>



<li><code>431 Request Header Fields Too Large</code>服务器不愿意处理请求，因为其头字段太大。在减小请求头字段的大小后，可以重新提交请求。</li>



<li><code>451 Unavailable For Legal Reasons</code>用户代理请求了无法合法提供的资源，例如政府审查的网页。</li>
</ul>



<h2 class="wp-block-heading">五、服务端错误响应</h2>



<ul class="wp-block-list">
<li><code>500 Internal Server Error</code>服务器遇到了不知道如何处理的情况。</li>



<li><code>501 Not Implemented</code>服务器不支持请求方法，因此无法处理。服务器需要支持的唯二方法（因此不能返回此代码）是 <code>GET</code> and <code>HEAD</code>.</li>



<li><code>502 Bad Gateway</code>此错误响应表明服务器作为网关需要得到一个处理这个请求的响应，但是得到一个错误的响应。</li>



<li><code>503 Service Unavailable</code>服务器没有准备好处理请求。常见原因是服务器因维护或重载而停机。请注意，与此响应一起，应发送解释问题的用户友好页面。这个响应应该用于临时条件和如果可能的话，HTTP 标头 <code>Retry-After</code> 字段应该包含恢复服务之前的估计时间。网站管理员还必须注意与此响应一起发送的与缓存相关的标头，因为这些临时条件响应通常不应被缓存。</li>



<li><code>504 Gateway Timeout</code>当服务器充当网关且无法及时获得响应时，会给出此错误响应。</li>



<li><code>505 HTTP Version Not Supported</code>服务器不支持请求中使用的 HTTP 版本。</li>



<li><code>506 Variant Also Negotiates</code>服务器存在内部配置错误：所选的变体资源被配置为参与透明内容协商本身，因此不是协商过程中的适当终点。</li>



<li><code>507 Insufficient Storage</code> (WebDAV)无法在资源上执行该方法，因为服务器无法存储成功完成请求所需的表示。</li>



<li><code>508 Loop Detected</code> (WebDAV)服务器在处理请求时检测到无限循环。</li>



<li><code>510 Not Extended</code>服务器需要对请求进行进一步扩展才能完成请求。</li>



<li><code>511 Network Authentication Required</code>指示客户端需要进行身份验证才能获得网络访问权限。</li>
</ul>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.wublog.site/2026/01/02/http-%e5%93%8d%e5%ba%94%e7%8a%b6%e6%80%81%e7%a0%81/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>DNS域名解析过程</title>
		<link>https://www.wublog.site/2026/01/01/dns%e5%9f%9f%e5%90%8d%e8%a7%a3%e6%9e%90%e8%bf%87%e7%a8%8b/</link>
					<comments>https://www.wublog.site/2026/01/01/dns%e5%9f%9f%e5%90%8d%e8%a7%a3%e6%9e%90%e8%bf%87%e7%a8%8b/#respond</comments>
		
		<dc:creator><![CDATA[Wu]]></dc:creator>
		<pubDate>Thu, 01 Jan 2026 03:31:07 +0000</pubDate>
				<category><![CDATA[Web]]></category>
		<guid isPermaLink="false">https://www.wublog.site/?p=208</guid>

					<description><![CDATA[什么是DNS域名解析 我们首先要了解域名和IP地址的区别。IP地址是互联网上计算机唯一的逻辑地址，通过IP地址 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><strong>什么是DNS域名解析</strong></p>



<p>我们首先要了解域名和IP地址的区别。IP地址是互联网上计算机唯一的逻辑地址，通过IP地址实现不同计算机之间的相互通信，每台联网计算机都需要通过IP地址来互相联系和分别。</p>



<p>但由于IP地址是由一串容易混淆的数字串构成，人们很难记忆所有计算机的IP地址，这样对于我们日常工作生活访问不同网站是很困难的。基于这种背景，人们在IP地址的基础上又发展出了一种更易识别的符号化标识，这种标识由人们自行选择的字母和数字构成，相比IP地址更易被识别和记忆，逐渐代替IP地址成为互联网用户进行访问互联的主要入口。这种符号化标识就是域名。</p>



<p>域名虽然更易被用户所接受和使用，但计算机只能识别纯数字构成的IP地址，不能直接读取域名。因此要想达到访问效果，就需要将域名翻译成IP地址。而DNS域名解析承担的就是这种翻译效果。</p>



<h2 class="wp-block-heading">DNS域名解析过程</h2>



<p>当我们在浏览器地址栏中输入 <a href="https://www.wublog.site">https://www.wublog.site</a> 时，DNS解析将会有将近10个步骤，这个过程大体大体由一张图可以表示：</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="529" data-id="209" src="https://www.wublog.site/wp-content/uploads/2026/01/dns-1024x529.png" alt="" class="wp-image-209" srcset="https://www.wublog.site/wp-content/uploads/2026/01/dns-1024x529.png 1024w, https://www.wublog.site/wp-content/uploads/2026/01/dns-300x155.png 300w, https://www.wublog.site/wp-content/uploads/2026/01/dns-768x397.png 768w, https://www.wublog.site/wp-content/uploads/2026/01/dns-1536x794.png 1536w, https://www.wublog.site/wp-content/uploads/2026/01/dns-2048x1058.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</figure>



<p>整个过程大体描述如下，其中前两个步骤是在本地电脑内完成的，后8个步骤涉及到真正的域名解析服务器：</p>



<p><strong>第一步</strong>、本地电脑会检查浏览器缓存中有没有这个域名对应的解析过的IP地址，如果缓存中有，这个解析过程就结束。浏览器缓存域名也是有限制的，不仅浏览器缓存大小有限制，而且缓存的时间也有限制，通常情况下为几分钟到几小时不等，域名被缓存的时间限制可以通过TTL属性来设置。这个缓存时间太长和太短都不太好，如果时间太长，一旦域名被解析到的IP有变化，会导致被客户端缓存的域名无法解析到变化后的IP地址，以致该域名不能正常解析，这段时间内有一部分用户无法访问网站。如果设置时间太短，会导致用户每次访问网站都要重新解析一次域名。</p>



<p><strong>第二步</strong>、如果浏览器缓存中没有数据，浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果。其实操作系统也有一个域名解析的过程，在Linux中可以通过/etc/hosts文件来设置，而在windows中可以通过配置C:\Windows\System32\drivers\etc\hosts文件来设置，用户可以将任何域名解析到任何能够访问的IP地址。</p>



<p><strong>第三步</strong>、前两个过程无法解析时，就要用到我们网络配置中的&#8221;DNS服务器地址&#8221;了。操作系统会把这个域名发送给这个本地DNS服务器。每个完整的内网通常都会配置本地DNS服务器，例如用户是在学校或工作单位接入互联网，那么用户的本地DNS服务器肯定在学校或工作单位里面。它们一般都会缓存域名解析结果，当然缓存时间是受到域名的失效时间控制的。大约80%的域名解析到这里就结束了，后续的DNS迭代和递归也是由本地DNS服务器负责。</p>



<p><strong>第四步</strong>、如果本地DNS服务器仍然没有命中，就直接到根DNS服务器请求解析。</p>



<p><strong>第五步</strong>、根DNS服务器返回给本地DNS域名服务器一个顶级DNS服务器地址，它是国际顶级域名服务器，如.com、.cn、.org等，全球只有13台左右。</p>



<p><strong>第六步</strong>、本地DNS服务器再向上一步获得的顶级DNS服务器发送解析请求。</p>



<p><strong>第七步</strong>、接受请求的顶级DNS服务器查找并返回此域名对应的Name Server域名服务器的地址，这个Name Server服务器就是我要访问的网站域名提供商的服务器，其实该域名的解析任务就是由域名提供商的服务器来完成。 比如我要访问 <a href="https://www.wublog.site">https://www.wublog.site</a>，而这个域名是从A公司注册获得的，那么A公司上的服务器就会有 <a href="https://www.wublog.site">https://www.wublog.site</a> 的相关信息。</p>



<p><strong>第八步</strong>、Name Server服务器会查询存储的域名和IP的映射关系表，再把查询出来的域名和IP地址等等信息，连同一个TTL值返回给本地DNS服务器。</p>



<p><strong>第九步</strong>、返回该域名对应的IP和TTL值，本地DNS服务器会缓存这个域名和IP的对应关系，缓存时间由TTL值控制。</p>



<p><strong>第十步</strong>、把解析的结果返回给本地电脑，本地电脑根据TTL值缓存在本地系统缓存中，域名解析过程结束在实际的DNS解析过程中，可能还不止这10步，如Name Server可能有很多级，或者有一个GTM来负载均衡控制，这都有可能会影响域名解析过程。</p>



<h2 class="wp-block-heading"><strong>递归查询和迭代查询的区别</strong></h2>



<p>DNS客户端和本地名称服务器是递归，而本地名称服务器和其他名称服务器之间是迭代。</p>



<p>DNS递归名称解析： 在DNS递归名称解析中，当所配置的本地名称服务器解析不了时，后面的查询工作是由本地名称服务器替代DNS客户端进行的（以“本地名称服务器”为中心），只需要本地名称服务器向DNS客户端返回最终的查询结果即可。</p>



<p>DNS迭代名称解析：（或者叫“迭代查询”）的所有查询工作全部是DNS客户端自己进行（以“DNS客户端”自己为中心）。在条件之一满足时就会采用迭代名称解析方式：</p>



<p>在查询本地名称服务器时，如果客户端的请求报文中没有申请使用递归查询，即在DNS请求报头部的RD字段没有置1。相当于说“你都没有主动要求我为你进行递归查询，我当然不会为你工作了”。</p>



<p>客户端在DNS请求报文中申请使用的是递归查询（也就是RD字段置1了），但在所配置的本地名称服务器上是禁用递归查询（DNS服务器一般默认支持递归查询的），即在应答DNS报文头部的RA字段置0。</p>



<h2 class="wp-block-heading"><strong>域名解析记录</strong></h2>



<p>主要分为A记录、MX记录、CNAME记录、NS记录和TXT记录：</p>



<p>1、A记录</p>



<p>A代表Address，用来指定域名对应的IP地址，如将http://item.taobao.com指定到http://115.238.23.xxx，将http://switch.taobao.com指定到http://121.14.24.xxx。A记录可以将多个域名解析到一个IP地址，但是不能将一个域名解析到多个IP地址</p>



<p>2、MX记录</p>



<p>Mail Exchange，就是可以将某个域名下的邮件服务器指向自己的Mail Server，如http://taobao.com域名的A记录IP地址是http://115.238.25.xxx，如果将MX记录设置为http://115.238.25.xxx，即xxx@taobao.com的邮件路由，DNS会将邮件发送到http://115.238.25.xxx所在的服务器，而正常通过Web请求的话仍然解析到A记录的IP地址</p>



<p>3、CNAME记录</p>



<p>Canonical Name，即别名解析。所谓别名解析就是可以为一个域名设置一个或者多个别名，如将http://aaa.com解析到http://bbb.net、将http://ccc.com也解析到http://bbb.net，其中http://bbb.net分别是http://aaa.com和http://ccc.com的别名</p>



<p>4、NS记录</p>



<p>为某个域名指定DNS解析服务器，也就是这个域名由指定的IP地址的DNS服务器取解析</p>



<p>5、TXT记录</p>



<p>为某个主机名或域名设置说明，如可以为http://ddd.net设置TXT记录为&#8221;这是XXX的知乎&#8221;这样的说明</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.wublog.site/2026/01/01/dns%e5%9f%9f%e5%90%8d%e8%a7%a3%e6%9e%90%e8%bf%87%e7%a8%8b/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
