08 | 键入网址再按下回车,后面究竟发生了什么?
最简单的浏览器到服务器的流程:
- 浏览器从地址栏的输入中获得服务器的IP地址和端口号;
- 浏览器用TCP的三次握手与服务器建立连接;
- 浏览器向服务器发送拼好的报文;
- 服务器收到报文后处理请求,同样拼好报文再发给浏览器;
- 浏览器解析报文,渲染输出页面
HTTP协议基于底层的TCP/IP协议,所以必须要用IP地址建立连接;如果不知道IP地址,就要用DNS协议去解析得到IP地址,否则就会连接失败;
建立TCP连接后会顺序收发数据,请求方和应答方都必须依据HTTP规范构建和解析报文;
为了减少响应时间,整个过程中的每一个环节都会有缓存。
在浏览器里点击页面连接后发生了什么?
浏览器判断这个连接是要在当前页面打开还是新开标签页,接着从地址栏中获取输入的连接的服务器ip地址和端口号。浏览器用三次握手与服务器建立连接,然后向服务器发送拼接好的报文,服务端接受到后同样拼好报文再发给浏览器。浏览器解析报文,渲染输出页面。
如果是一个不存在的域名,那么浏览器的工作流程是怎样?
浏览器判断是不是IP地址,不是就进行域名解析,依次通过浏览器缓存、系统缓存、host文件,还是没有找的请求DNS服务器获取IP解析(解析失败的浏览器尝试换别的DNS服务器,最终失败的进入错误页面)。有可能获取到CDN服务IP地址,访问CDN先看是否缓存了,缓存了响应用户,无法缓存,缓存失败或者无缓存,回源到服务器。经过防火墙外网网关路由到nginx路由层。ng缓存中存在的直接返回,不存在的负载到web服务器。web服务器接收到请求后处理,路径不存在404.存在的返回结果,cdn加入缓存响应用户。
09 | HTTP报文是什么样子的?
报文结构
拿TCP报文来举例,它在实际要传输的数据之前附加了一个20字节的头数据,存储TCP协议必须的额外信息,例如发送方的端口号、接收方的端口号、包序号、标志位等。
有了这个附加的TCP头,数据包才能够正确传输,到了目的地后把头部去掉,就可以拿到真正的数据
HTTP协议也是与TCP/UDP类似,不过与其不同的是,它是纯文本的协议,所以头部数据都是ASCII码的文本。
HTTP协议的请求报文和响应报文的结构基本相同,由三大部分组成:
- 起始行:描述请求或响应的基本信息;
- 头部的字段集合:使用key-value形式更详细地说明报文;
- 消息正文:实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。
HTTP 协议规定报文必须有 header,但可以没有 body,而且在 header 之后必须要有一个“空行”,也就是“CRLF”,十六进制的“0D0A”。
请求行/起始行
简要描述客户端想要如何操作服务器端的资源
由三部分构成:
- 请求方法: 表示对资源的操作,如GET/POST
- 请求目标:标记请求方法要操作的资源,通常是一个url
- 版本号: 表示报文使用的HTTP协议版本
通常用空格分割这三部分,最后用CRLF换行表示结束
状态行
服务器响应的状态
- 版本号:标识报文使用的HTTP协议版本;
- 状态码
-
原因
HTTP/1.1 404 Not Found HTTP/1.1 200 OK
头部字段
请求行或者状态行再加上头部字段集合就构成了HTTP报文里完整的请求头或响应头。
如果拼 HTTP 报文的时候,在头字段后多加了一个 CRLF,导致出现了一个空行,会发生什么?
空行后的数据当作body返回
讲头字段时说“:”后的空格可以有多个,那为什么绝大多数情况下都只使用一个空格呢?
节省资源
10 | 应该如何理解请求方法?
标准请求方法
- GET
- HEAD: 获取资源的元信息
- POST: 向资源提交数据,相当于写入或上传数据
- PUT
- DELETE
- CONNECT: 建立特殊的连接隧道;
- OPTIONS: 列出可对资源实行的方法;
- TRACE:追求请求 - 响应的传输路径
GET/HEAD
HEAD与GET类似,也是请求从服务器获取资源,服务器的处理机制也是一样的,但服务器不会返回请求的实体数据,只会传回响应头,也就是资源的元信息
POST/PUT
POST通常表示是“新建”,PUT是“修改”
其他方法
DELETE删除服务器资源
CONNECT,要求服务器为客户端和另一台远程服务器建立一条特殊的连接隧道,这时web服务器在中间充当代理的角色
OPTIONS方法要求服务器列出可对资源实行的操作方法,在响应头的Allow字段里返回
TRACE多用于对HTTP链路的测试或诊断,可以显示出请求-响应的传输路径。但存在漏洞,会泄漏网站信息,web服务器通常是禁止使用
12 | 响应状态码该怎么用?
状态码
- 1xx:提示信息,表示目前是协议处理的中间状态,还需要后续的操作;
- 2xx: 成功,报文已经收到并被正确处理
- 3xx: 重定向,资源位置发生变动,需要客户端重新发送请求
- 4xx: 客户端错误,请求报文有误,服务器无法处理
- 5xx: 服务器错误,服务器在处理请求时内部发生了错误
1xx
1xx类状态是属于提示信息,提示当前协议处理处于中间状态
101 Switching Protocols, 意思是客户端使用Uprade头字段,要求在http协议的基础上改成其他协议以继续通信,比如websocket。而如果服务端也同意变更,就会发送101状态码。但这之后的数据传输就不会再用http
2xx
200 ok
204 No Content,响应头后没有body数据
206 Partial Content是http分块下载或断点传续的基础,在客户端发送请求获取资源的部分数据出现,但body里的数据不是资源的全部,而是其中的一部分
206状态还伴随Content-Range头字段,表示响应报文里body数据的具体范围,供客户端确认。例如Content-Range:bytes 0-99/2000, 此次获取的是总计2000个字节的前100个字节
3xx
表示客户端请求的资源发生了变动。客户端必须用新的URI重新发送请求获取资源,也就是通常说的重定向
301 Moved Permanently永久重定向,此次请求的资源已经不再了,需要改用新的URI访问
302 Fond 临时重定向,请求的资源还在,但暂时需要用另一个URI访问。
301 302都会在响应头里使用Location字段指明后续要跳转的URI。
304 Not Modified,用于If-Modified-Since等条件请求,表示资源未修改,用于缓存控制。“重定向到已缓存文件”
4xx
表示客户端发送的请求报文有误,服务器无法处理
400 Bad Request通用错误码,表示请求报文有错误
403 Forbidden表示服务器禁止访问资源
404 Not Found表示资源在服务器上未找到,所以无法提供给客户端
405 Method Not Allowed: 不允许使用某些方法操作资源,例如不能post只能get
5xx
表示客户端请求报文正确,但服务器在处理内部发生了错误,无法返回应有的响应数据,是服务器端的错误码
500 Internal Server Eroor通用错误码
501 Not Implemented表示客户端请求的功能还不支持
502 Bad GateWay服务器作为网关或代理时返回的错误码
503 Service Unavailable服务器当前很忙,暂时无法响应服务。503响应报文通常还会有一个Retry-After字段,指客户端可以在多久以后再次尝试发送请求
13 | HTTP有哪些特点?
灵活可扩张
HTTP最初诞生只规定了报文的基本格式,比如用空格分割单词等,报文里各个组成部分没有做严格的语法语义限制
可靠传输
HTTP协议基于TCP/IP,而TCP本身是一个“可靠”的传输协议
应用层协议
有很多应用层协议,但他们都关注很小的应用领域,例如FTP只传输文件、SMTP只能发送邮件、SSH只能远程登录。
请求-应答
请求-应答模式是HTTP协议最根本的通信模型,一发一收,有来有去。
无状态
HTTP协议是无状态
“状态”就是客户端或者服务器端里保存的一些数据或者标志,记录了通信过程中的一些变化信息。
TCP是有状态,一开始处于CLOSED状态,连接成功后是ESTABLISHED状态,断开连接后是FIN-WAIT状态,最后又是CLOSED状态。
“状态”就需要在TCP在内部用一些数据结构去维护。而HTTP在整个协议里没有规定任何的“状态”。客户端和服务器永远是在一种“无知”的状态。建立连接前两者互不知情,每次收发报文也都是相互独立的,没有任何的联系