Percent-encoding:是一种对8-bit字符进行编码的机制,也称url编码。编码组成:%+被替换字符的AscII 16进制表示
DNS解析:作为应用层协议,为其他应用层协议提供服务。将主机名-》ip。
访问顺序本地host文件-》本地DNS解析器缓存-》本地DNS服务器
本地域名服务器可以通过递归 挥着迭代的方式 获取目标域名的ip,
递归:首先向跟域名服务器请求 跟域名服务器会向顶级域名服务器,顶级域名服务器又会向权限域名服务器请求拿到结果之后返回给顶级域名服务器,顶级域名服务器返回给跟服务器,根服务器返回给本地域名服务器,之后本地域名服务器缓存之后返回给本机。
迭代:使用的Udp数据包 与 递归使用的UDP数据包个数是一样的,首先请求跟 跟返回应该请求的顶级域名服务器,所以在向顶级域名服务器请求 顶级域名服务器返回给权限域名服务器,所以跟域名服务器继续向权限域名服务器请求,最后返回得到ip ,本地域名服务器魂村ip之后返回给本机。本机再利用ip进行后续的http请求。
uri与url 的区别:uri 是可分为url和urn,urL是可以按照某种协议来访问的,urn只是一个name,代表这个资源而已。
cookie与session:cookie 实际上是一小段的文本信息,当客户端浏览器访问服务器的时候,如果需要记录客户端的状态,那么服务器端可以向客户端颁发一个cookie。session 与cookie有点类似,但是是保存在服务端的可以记录客户端状态的机制:客户端浏览器访问服务器的时候,服务器端把客户端的信息以某种形式记录在服务器上,然后第二次或者之后的请求中cookie中的sessionId服务器就可以根据sessionId拿到相应的session,从而知道其信息了。
缓存控制http头关于缓存的字段
- cache-control
:no store 表示不使用缓存 no-cache 缓存但是每次都要请求服务器判断是否是最新的缓存。
max-age=x单位为秒 代表请求x秒后才重新请求服务器资源。
private代表只有客户端可以缓存
public 代表客户端和代理服务器(cdn)都可以缓存
-
Expires
响应头 代表在过期时间 ,由服务端返回资源而不采用缓存 -
LastModified
响应头 代表请求的资源在服务器中的最新修改时间,由服务 器告诉客户端。 -
if-modified-since
请求头 这个时间一般是上一次请求的last-modified时间,然后由服务器判断是否在这个时间后资源有无改动。 -
Etag
响应头 资源标识 由服务器告诉客户端 -
if-none-match
请求头 缓存资源标识 由客户端告诉服务器 Etag与if-none-match 的关系与last-modified 和if-modified-since差不多
服务器驱动的内容协商(请求头)
Accept:告知服务器发送何种媒体类型
Accept-language:客户端可以接受的语言
Accept-chaset:字符集
Accept-charset:字符集编码
服务器驱动的内容协商(响应头)
content-type:MIME类型
content-encoding:编码
content-language:语言
http断点续传和多线程下载相关头部信息字段
Range:bytes 范围 这样服务器知道传输哪个片段了
content-range:bytes 范围/长度
http和https
http 的数据传输是明文传输,有被窃听篡改的风险。假设服务端和客户端通信。为了防止这种情况,我们使用对称加密和非对称加密。比如服务端将公钥key1发送给客户端、客户端用服务端发来的key1加密对称秘钥key2,然后发送服务端,服务端拿到key1公钥加密的对称加密,用自己的私钥解开。之后便可以使用对称加密来进行通信了。 大家仔细想想这种方式存不存在问题?如果我作为窃听者或者篡改者,我先拿到服务端发给客户端的key1,然后替换为我自己密钥对的公钥key3,之后再拿到客户端发送给服务端的用key3加密后的对称秘钥,然后解得对称秘钥。之后在假装为key1加密发送给服务端。这时他们俩以为通信建立安全,其实他们通信的对称秘钥已经在我手里,无异于裸奔。
https 就是用来解决这个问题的。
https 中利用证书颁发机构来对用户进行认证。服务端将用户信息和自己密钥对的公钥发送给机构,机构用自己的私钥加密公钥、自己的私钥加密经过hash的摘要信息形成数字签名讲这些内容作为证书颁发给服务端。当客户端请求服务端的时候,服务端返回其证书。客户端首先会查找本地浏览器或者操作系统拿到这个证书机构的公钥,如果没拿到说是危险证书,之后要这个公钥解数字签名,如果无法解,仍然是危险证书。解数字签名得到的摘要信息A。然后根据hash算法将证书生成的摘要信息B与A比较。如果相同说明数据是一致的没有被篡改的。
详细内容移步知乎
通过上面的叙述我们大致可以认为https做到了3点:1、身份认证2、内容完整性保证、3、加密
https这么好但是也有成本的:1、ca证书得买2、由于tls的存在必然会慢(优化后的暂且不说)3、非对称加密需要耗费cpu资源。
2021年3月17 增加
tsl建立连接的过程:
1、浏览器发送自己的tsl 版本 以及自己支持的加密套件 以及生成一个随机数random1一起发送给服务端
2、服务端也发送自己的tsl版本 以及 加密套件 和 ca证书 以及一个随机数random2
3、浏览器对ca机构认证,以及通过机构私钥拿到数字签名,认证其完整性 同时拿到服务端公钥。
4、浏览器用公钥加密再一个随机数random3 发送给服务端。然后告诉服务端下一次就会使用3个随机数确定的对称秘钥加密数据进行传输。之后将会话信息通过对称秘钥加密传输。如果服务端能够解密 则确定秘钥正确。
5 服务端也用这边三个随机数确定的对称秘钥加密会话信息 如果 客户端那边能够正确解密 则客户端也能确认 秘钥正确。
6、之后便可以正常数据传输。
http1.0 http1.1 的区别?
1、http1.0 对于每个请求服务端服务完成后就会关闭连接。而http1.1会直接默认是connection:keep-alive(默认是流水线的工作方式:即不需要多次请求一个个等待上一个请求响应完毕才发下一个请求 而是直接发送所有请求,但是响应必须是fifo)
2、http1.1 支持更多的请求头部和响应头部信息。比如host
3、http1.1 新增状态码100(continue)
该状态码设计的初衷是 避免大流量的数据包因为拒收而在网络上传递,而是试探性的先发一个小报文,如果服务端准备接受 则进行接收。
客户端有一个较大的文件需要上传并保存,但是客户端不知道服务器是否愿意接受这个文件,所以希望在消耗网络资源进行传输之前,先询问一下服务器的意愿。实际操作为客户端发送一条特殊的请求报文,报文的头部应包含Expect:100-continue
当请求报文头部有下列字段的时候,服务器如果返回100(continue)则代表服务器准备好接收剩下的报文。
Expect: 100-continue
http2.0 和http1.x的比较
http1.x 在大量请求的时候需要对同一个域名下的请求开多个TCP连接 来提高并发,同时对每个连接使用pipeline 来优化发送时候的阻塞,但是响应的时候还是会存在阻塞问题,即前一个请求未完成 后面的请求响应也不能发送。
http2 使用多路复用技术,一个TCP连接可以并发处理多个请求。一个连接可以有多个流 一个流可以发一个或者多个消息 消息由帧组成。同一个 Stream 流中的 frame 数据是串行发送的。
http2 支持头部压缩,这样网路上数据包变小传输速度变快。
http2 支持服务端推送 无需客户端明确要求。
面试题:
为什么将图片等静态资源放在不同的域名下?
http1.1 对同一个域名的服务器 开启的TCP连接数量有限制,通过放在不同的域名下可以增加并发量。
浏览器与服务器建立一个TCP连接后,是否会在完成一个http请求后断开?什么条件下会断开?
http1.0 会默认一次请求完成后断开连接。http1.1 可以使用持久连接 connection:keep-alive 从而实现连接复用。
一个TCP连接可以同时发送几个HTTP请求?
http1.0 1次 http1.1 多个http请求 pipeline 但是实际操作过程中还是 一个请求一个请求的处理 不能并发
http2 多个 并发处理。
浏览器http请求的并发性是如何体现的?并发请求的数量有没有限制?
http1.x 并发性只能通过增加tcp连接 来增加并发
http2 可以多路复用,使用一个Tcp连接同时处理多个请求。