HTTP协议
应用层协议,HTTP协议建立在TCP连接之上。HTTP是一种允许浏览器向服务器获取资源的协议,是Web的基础,也是浏览器使用最广的协议
HTTP和TCP关系
浏览器使用HTTP协议作为应用层协议用来封装请求的文本信息,使用TCP/IP将它发到网络上。HTTP的内容是通过TCP的传输数据阶段来实现的
HTTP请求过程
浏览器发起HTTP请求流程
-
构建请求行信息
浏览器构建如下请求行信息,构建好后浏览器准备发起网络请求
例如:GET /index.html HTTP1.1
-
查找缓存
浏览器缓存是一种在本地保存资源副本以供下次请求时直接使用的技术
真正发起网络请求前,浏览器会先在浏览器缓存中查询是否有要请求的文件:- 请求的资源已在浏览器缓存中有副本,浏览器拦截请求返回该资源的副本并直接结束请求,这样的优点是:
- 缓存查找失败,进入网络请求过程
-
准备IP地址和端口
- 准备IP地址
浏览器在和服务器建立TCP连接时会请求DNS返回请求的域名对应的IP地址。DNS域名系统是负责把域名和IP地址做一一映射关系。浏览器提供了DNS数据缓存服务,如果某个域名已经解析过浏览器会缓存解析的结果,以供下次查询时直接使用 - 准备端口号
通常情况下如果URL没有特别指明端口号,HTTP协议默认是80端口
- 准备IP地址
-
等待TCP队列
Chrome有个机制,同一个域名同时最多只能建立6个TCP连接,其它请求会进入排队等待状态,直至进行中的请求完成 -
建立TCP连接
排队等待结束后,和服务器通过“三次握手”建立连接 -
发送HTTP请求
建立了TCP连接,浏览器就可以和服务器进行通信。HTTP中的数据正是在这个通信过程中传输的HTTP请求数据格式:
- 请求行
包括请求方法(GET和POST等)、请求URI和HTTP版本协议。向服务器说明浏览器需要什么资源 - 请求头
包含一些基础信息。包括浏览器所使用的操作系统、浏览器内核等,以及当前请求的域名信息、浏览器端的Cookie信息等 - 请求体
向服务器发送的数据
- 请求行
服务器处理HTTP请求流程
-
返回请求
服务器响应的数据格式:
- 响应行
包括HTTP协议版本和状态码
HTTP/1.1 200 OK
- 响应头
包含了服务器自身的一些信息,比如服务器生成返回数据的时间、返回的数据类型以及服务器要在客户端保存的Cookie等信息 - 响应体
要发送给浏览器的数据
- 响应行
-
断开连接
通常情况下一旦服务器向客户端返回了请求数据,它就要关闭TCP连接
注意:若浏览器或服务器在其头信息中加入了:Connection:Keep-Alive
,那么在发送后TCP连接将仍然保持打开状态,这样浏览器就可以继续通过同一个TCP连接发送请求。保持TCP连接可以省去下次请求时需要建立连接的时间,提升资源加载速度
浏览器缓存流程
- 第一次加载页面,缓存为空,继续请求服务器,然后服务器返回HTTP响应头给浏览器时,浏览器通过响应头中的
Cache-Control
字段来设置是否缓存该资源,还通过Cache-Control
中的Max-age
值来为这个资源设置一个缓存过期时长 - 缓存资源未过期时加载页面缓存会直接返回资源给浏览器
- 若缓存资源过期了加载页面浏览器则会继续发起网络请求,并在HTTP请求头中带上
If-None-Match
字段,服务器会根据该字段的值来判断请求的资源是否有更新:- 若没有更新,就返回304,表示继续使用该缓存
- 若更新了,服务器就直接返回最新资源给浏览器
重定向
当用户在浏览器中打开baidu.com
时,最终打开的页面地址是https://www.baidu.com/
,这涉及到一个重定向操作
当请求baidu.com
时,返回的响应行为:HTTP/1.1 301 Moved Permanently
,响应头中包含的location
字段为:Location:https://www.baidu.com/
301状态码就是告诉浏览器需要重定向到响应头Location字段中包含的网址,接下来浏览器就获取该字段地址并重新导航
注意:这种跳转不是必然的
来源于:极客时间《浏览器工作原理与实践》