网络请求部分包含了:
-
URL解析
-
检查资源缓存
-
DNS解析
-
建立TCP连接
-
TLS协商密钥
-
发送请求&接受响应
-
关闭TCP连接
URL解析
为什么要对URL进行解析?
浏览器首先会判断输入的内容是URL还是搜索关键字
如果是URL,则会将不完整的URL整合成完整的URL。
完整的URL:
锚点就是跳转到你想要跳转页面内容的具体位置
比如我们输入了www.baidu.com,浏览器会帮我们拼接成百度一下,你就知道,默认使用443端口。
如果是搜索关键字,则会将其拼接到默认搜索引擎的参数部分去搜索。这个流程需要对输入的不安全字符编码进行转义。
安全字符包含数字、英文和少数符号
比如密码中带有&、=、?等不安全符号,则会和URL中本身的特殊符号产生歧义,所以要将密码中的不安全符号转译成URL编码。
URL编码也叫百分号编码,使用的是%+两位十六进制数。这两位十六进制数均来自UTF-8编码。(一个汉字占用三个字节)
对于encodeURI和encodeURIComponent的区别?
对于= ? & ; / 这类字符,在encodeURI中不会被编码,而在encodeURIComponent中会被编码。(encodeURI编码的是整个URI,encodeURIComponent编码的则是参数部分)
URI,URL,URN的关系与区别?
URI = Universal Resource Identifier 统一资源标志符
URL = Universal Resource Locator 统一资源定位符
URN = Universal Resource Name 统一资源名称
URI指的是一个资源,URL用地址定位一个资源,URN用名称定为一个资源。
举个例子:去寻找某个具体的人(URI),如果用地址:XX省XX市XX区...XX单元XX室的主人 就是URL;如果用身份证号+名字去找就是URN(身份证号+名字 无法确认资源的地址) 。
检查资源缓存
在发送请求之前,会检查缓存,若缓存在有效期内,则不需要进行发送网络请求,直接会返回缓存的数据。
1.在有效期内(强缓存)
强缓存分为,从内存取出(memory cache)和从磁盘取出(disk cache)。通常来说,刷新页面会使用内存缓存,关闭后重新打开会使用磁盘缓存。
2.超过有效期
超过有效期的,则携带缓存的资源标识向服务端发起请求,校验是否能继续使用,如果服务端返回304,则可以继续使用本地存储,并且不携带数据;如果服务端返回200,则告诉我们需要用更新的资源,并且携带更新后的资源和资源标识缓存到本地,方便下一次使用。
DNS解析(应用层)
如果没有成功使用本地缓存,则要发起网络请求。发送网络请求首先要进行DNS解析。
会依次递归搜索:
-
浏览器的DNS缓存;
-
操作系统的DNS缓存;
-
路由器的DNS缓存;
-
向服务商的DNS服务器查询;
-
向全球13台根域名服务器查询
为了节省时间,可以在HTML头部去做DNS的预解析(可以提高DNS的解析速度):
<a href="http://www.baidu.com">百度一下</a>
为了保证响应的及时,DNS解析使用的是UDP协议
建立TCP连接(三次握手)
-
客户端发送建立连接的请求
-
服务端发送建立连接确认,此时服务端对该TCP连接分配资源。
-
客户端发送确认收到服务端的相应信息,此时客户端连接分配资源。
为什么要进行三次握手,两次握手不可以吗?
原因:避免重复连接
网络情况比较复杂,可能出现丢包、阻塞等情况,所以可能会连续发送请求,若是两次握手就建立连接的情况下第一次请求包被阻塞,发送第二次请求包,建立了连接,这时候第一次的请求包又不被阻塞了,服务器在已经通过第二次请求包建立连接的情况下,又收到第一次的请求包的请求连接,则会使网络连接造成混乱,甚至对资源进行了浪费。一次握手更不可取,只发送请求包,就不能确定服务端是否同意建立连接,可能会遇到请求包丢包或者服务器拒绝连接等情况,而客户端并不知道没有成功建立连接,就对服务端发送数据,造成客户端资源的浪费,客户端也无法获取服务端的数据。
协商加密密钥——TLS握手
http(Hypertext transfer protocol),超文本传输协议。
HTTPS(Hyper Text Transfer Protocol Secure),超文本传输安全协议,在会话层和表示层利用ssl/tls来加密数据包,需要证书。
对称加密相较于非对称加密,优点是加密速度快。而非对称加密的优点是更安全,密钥不容易被窃取(私钥在自己手中,只是发送公钥给对方,让对方用公钥加密,解密只有自己的私钥才可以,而公钥加密,加解密用到的密钥是相同的,传输的内容更容易被中间人破解)。
所以,在TLS握手阶段,两端通过非对称加密的方式进行通信,但由于非对称加密损害的性能相比于对称加密要大,则在正式传输数据时,采用了对称加密的方式。
流程如下:
-
客户端发送一个随机数以及需要的协议及其加密方式。
-
服务端接收信息后,发送自己的数字证书,附加自己的一个随机数,并利用客户端发送数据包中的协议和加密方式,发送响应信息。
-
客户端验证服务端的数字证书,若真实有效,则通过证书的公钥去加密自己生成的一个新的随机数并发送给服务端。
-
服务端收到加密的随机数利用证书的私钥解密,则这个时候,服务端和客户端都拥有这三个随机数(其中第三个随机数,必定只有两人知道),便可利用这三个随机数按照规定的加密方式生成密钥,这样,便只有两者互相知道密钥,不会被第三者所窃取,则可以正常利用对称加密技术发送数据。
发送请求&接收请求
发送相应的IP数据包
请求的基本组成是:请求行+请求头+请求空行+请求体
请求头部用来告知服务器有关于客户端请求的信息,由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔:
-
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
-
User-Agent:产生请求的浏览器类型。
-
Accept:客户端可识别的内容类型列表。
-
Accept-Encoding:请求报头域类似于Accept,但是它是用于指定可接受的内容编码。
-
Accept-Language:请求报头域类似于Accept,但是它是用于指定一种自然语言。
-
Referer:上一个资源的URL。
-
X-Forwarded-For(XFF):是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段
-
Connection:当值为Close时,告诉服务器发送响应的文件后关闭连 接,为Keep-Alive时,告诉服务器在完成本次请求的响应后,保持连接。
响应的基本组成是:请响应行+响应头+响应空行+响应体
响应头部用来描述服务器信息的,由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔:
-
Location:响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。
-
Server:告诉浏览器服务器的名称和版本号。eg:Apache/2.2.10。
-
Content-Encoding:web服务器告诉浏览器使用了那种压缩方法。eg: Content-Encoding:gzip。
-
Content-Length:用于指明实体正文的长度,以字节方式存储的十进制数字来表示。eg:Content-Length:36616
-
Content-Type:实体报头域用语指明发送给接收者的实体正文的媒体类型。eg:Content-Type:text/html。
-
Last-Modified:实体报头域用于指示资源的最后修改日期和时间。eg:Last-Modified:Tue, 06 May 2008 02:42:43 GMT。 Connection:告诉浏览器连接状态。
请求行由HTTP协议版本、状态码和状态描述3个字段组成,它们用空格分隔。
HTTP的响应状态码有以下类型组成:
-
1xx:指示信息--表示请求已接收,继续处理
-
2xx:成功--表示请求已被成功接收、理解、接受
-
3xx:重定向--要完成请求必须进行更进一步的操作
-
4xx:客户端错误--请求有语法错误或请求无法实现
-
5xx:服务器端错误--服务器未能实现合法的请求
常见状态描述的短语说明: 200 OK //客户端请求成功 304 Not Modified //直接使用本地缓存 400 Bad Request //不能被服务器所理解 401 Unauthorized //请求未经授权 403 Forbidden //服务器收到请求,但是拒绝提供服务 404 Not Found //请求资源不存在 500 Internal Server Error //服务器发生不可预期的错误 503 Server Unavailable //服务器当前不能处理客户端的请求
关闭TCP连接(四次挥手)
数据传输完毕,关闭TCP连接,发送关闭请求的可以是客户端也可以是服务端,这里以客户端为例:
-
客户端发送请求释放连接(客户端不再发送数据)
-
服务器确认连接释放,这时服务器仍可以处理和发送数据
-
服务端发送请求释放连接(服务端不再发送数据)
-
客户端确认连接释放。
为什么关闭TCP连接要四次挥手?
当第一次客户端发送释放请求,服务端接受时或许仍在处理数据,不能够立刻释放连接,这时候就要告诉客户端收到了释放连接的请求,而客户端也不再会发送释放连接请求,则是等待服务端的释放连接请求。
主动方为什么要等待2MSL?
MSL指的是网络数据包的最大生存时间。
当客户端在第四次握手时,要等待两个MSL的时间才能真正关闭连接。等待第一个MSL是数据包到服务端的最大生存时间,第二个MSL是为了当第四次握手时,数据包丢失,未发送到服务端,服务端则会重新发送第三次握手的请求,一来一回就是两个MSL的时间。当超过两个MSL时间的时候,没有收到服务端请求释放连接的数据包,则说明服务端收到了第四次握手的数据包,关闭了连接。