极力支持极客时间 https://time.geekbang.org/column/article/102483
08 | 键入网址再按下回车,后面究竟发生了什么?
HTTP 协议基于底层的 TCP/IP 协议,所以必须要用 IP 地址建立连接;
如果不知道 IP 地址,就要用 DNS 协议去解析得到 IP 地址,否则就会连接失败;
建立 TCP 连接后会顺序收发数据,请求方和应答方都必须依据 HTTP 规范构建和解析报文;
为了减少响应时间,整个过程中的每一个环节都会有缓存,能够实现“短路”操作;
虽然现实中的 HTTP 传输过程非常复杂,但理论上仍然可以简化成实验里的“两点”模型。
09 | HTTP报文是什么样子的?
HTTP 报文结构就像是“大头儿子”,由“起始行 + 头部 + 空行 + 实体”组成,简单地说就是“header+body”;
HTTP 报文可以没有 body,但必须要有 header,而且 header 后也必须要有空行,形象地说就是“大头”必须要带着“脖子”;
请求头由“请求行 + 头部字段”构成,响应头由“状态行 + 头部字段”构成;
请求行有三部分:请求方法,请求目标和版本号;
状态行也有三部分:版本号,状态码和原因字符串;
头部字段是 key-value 的形式,用“:”分隔,不区分大小写,顺序任意,除了规定的标准头,也可以任意添加自定义字段,实现功能扩展;
HTTP/1.1 里唯一要求必须提供的头字段是 Host,它必须出现在请求头里,标记虚拟主机名。
10 | 应该如何理解请求方法?
请求方法是客户端发出的、要求服务器执行的、对资源的一种操作;
请求方法是对服务器的“指示”,真正应如何处理由服务器来决定;
最常用的请求方法是 GET 和 POST,分别是获取数据和发送数据;
HEAD 方法是轻量级的 GET,用来获取资源的元信息;
PUT 基本上是 POST 的同义词,多用于更新数据;
“安全”与“幂等”是描述请求方法的两个重要属性,具有理论指导意义,可以帮助我们设计系统。
11 | 你能写出正确的网址吗?
URI 是用来唯一标记服务器上资源的一个字符串,通常也称为 URL;
URI 通常由 scheme、host:port、path 和 query 四个部分组成,有的可以省略;
scheme 叫“方案名”或者“协议名”,表示资源应该使用哪种协议来访问;“host:port”表示资源所在的主机名和端口号;
path 标记资源所在的位置;query 表示对资源附加的额外要求;
在 URI 里对“@&/”等特殊字符和汉字必须要做编码,否则服务器收到 HTTP 报文后会无法正确处理。
12 | 响应状态码该怎么用?
状态码在响应报文里表示了服务器对请求的处理结果;
状态码后的原因短语是简单的文字描述,可以自定义;
状态码是十进制的三位数,分为五类,从 100 到 599;
2××类状态码表示成功,常用的有 200、204、206;
3××类状态码表示重定向,常用的有 301、302、304;
4××类状态码表示客户端错误,常用的有 400、403、404;
5××类状态码表示服务器错误,常用的有 500、501、502、503。