感谢IT之家网友 yinyue200的原创投稿
简单来说,当我们访问一个网站时,例如,https://www.ithome.com/ 时。浏览器会执行下面几个步骤:
1、查找 https://www.ithome.com/ 这个域名所对应的 IP 地址。我们常说的 DNS 就是用来干这件事的。
2、请求与上一步中查找到的 IP 地址建立 TCP 连接。
3、在TCP连接中发送 HTTP 请求 /zh-cn/ 这个资源。
4、浏览器收到服务器对 HTTP 请求回应的内容,根据内容做出不同的显示。
里面有这么一句话
400错误请求:400代表语义有误,服务器无法理解用户的请求,除非进行修改,不然没必要一边按F5一边喷服务器垃圾。比如说别把www.baidu.com.打成com.baidu.www.,否则服务器是不知道你在说什么鸟语。在减少这类错误的道路上,伟大的人类发明了搜索引擎,容错率随之提高。
还配了这样一张图
这个根本不是文章中说的 HTTP 400 错误,详细信息都已经说了是 DNS 名称不存在。明摆着是在查找 com.baidu.www 这个域名对应的 IP 地址时就出错了,怎么可能会相应的是 HTTP 400 错误。
其中对于 HTTP 408 的配图也有同样的问题,配图的错误是直接在 TCP 连接阶段就超时的,响应码并不是 HTTP 错误。如果是 HTTP 错误,那么显示的一定是网站自己写的错误页面,而不是浏览器标准的错误页面(不过这点也有一些例外,IE和某些浏览器会将某些内容较短的 HTTP 错误页面替换成浏览器标准错误页面)
所以说,在 DNS 查询阶段,TCP 传输阶段时的出错内容是不能用 HTTP 错误码显示的。
大多数的阻止你访问指定网站的机制(比如公司网络不能访问某些网站的情况)都是在 DNS 和 TCP 连接上下手,返回错误的 IP 地址或是强行中断与指定IP的连接。有一种特殊的情况就是返回的错误IP地址正好对应着一个其它网站的 IP 地址,因为每个网站的 URL 结构都是不同的,所以这种情况下你一般看到错误IP地址所对网站的 HTTP 404 错误。否则一般情况下阻止你访问指定网站的机制所造成的错误一般是错误 IP 地址导致的服务器无响应,而不是 HTTP 错误,因为 HTTP 错误必须是在服务器响应你的 TCP 连接请求的之后才能出现的。
某些网关或是网络中间设备可能造成更加复杂的情况,不在本文讨论范围。
还有一点,HTTP 401 301 302 305 其实都不应该在内容被封禁的时候使用,根据 IETF 的标准,HTTP 451(Unavailable For Legal Reasons)才是专门为这种情况制定的 HTTP 状态码
具体可以查看 IETF 的 RFC 7725。