HTTP超文本传输协议,在应用层使用此协议可以向服务器发起请求获取不同资源,比如HTML,CSS,JS,IMAGE等。发起HTTP请求前需要TCP/IP相关的传输控制协议来建立链接,进而对数据进行传输
浏览器发HTTP请求流程
- 浏览器构建请求
- 查找缓存,如果存在则拦截请求,返回副本,否则进入网络请求流程
- DNS解析
- 建立TCP链接(3次握手)
- 发送HTTP请求(浏览器和服务器开始通信,传输数据)
- 服务器发送响应数据
- TCP断开链接(4次挥手)
TCP链接-三次握手/四次挥手
传输控制不止是TCP,还有UDP等,但是常用的是TCP
TCP链接主要是对于TCP头部的序列号,确认号以及标志符的操作(SYN、FIN、ACK)等
TIPS
序列号: SEQ每次传输中字节的偏移量,初始化的SEQ叫ISN,客户端=X,服务端=Y,并非从0开始,可以解决网络丢包乱序
确认号: 确认号接收端告诉发送端对上一个数据包已经成功收到,客户以解决网络丢包
SYN: 1=希望创建链接
ACK: 1=确认号字段有效,内容就是确认号内容
FIN: 1=希望断开链接
TCP、UDP区别
1:TCP需要链接,UDP不需要链接。
2:TCP能够有序的把把包一次送到,重传机制确保不丢包,引入排序确保一致性,UDP则是一次性最大的传输,不能保证完整不太可靠。
3:TCP是以数据流的形式,UDP是报文。
三次握手
TIPS: 主要过程就是确认双方的序列号,未连接前两端都是CLOSE状态
1: 客户端会首先会发送一个SYN=1的包且序列号设置为ISN,SEQ=X,然后客户端状态为SYN_SEND
2: 服务端收到后会发送一个ACK=1和SYN=1的确认包且改包的确认号(ACK_NUMBER=X+1)为X+1和序列号SEQ=Y, 服务端进入SYN_RCVD
3: 客户端收到后发就告诉服务端已经收到他的序列号,然后发一个ACK=1的包且包的确认号(ACK_NUMBER=Y+1),然后两端进入ESTABLISHED,表示链接成功
四次挥手
TIPS: 未断开前两端都是ESTABLISHED状态
1: 客户端发一个FIN=1的包用来关闭客户端和服务器的数据传输,且进入FIN_WAIT_1
状态
2: 服务器收到FIN序列后后发一个ACK=1的包,服务器刺客进入CLOSE_WAIT,客户端收到ACK报文后就进入FIN_WAIT_2
3: 等到服务端没有数据返回后就发送FIN=1的包,服务端进入LAST_ACK
4: 客户端收到FIN的报文后,回应ACK自己进入TIME_WAIT,服务端收到后进入CLOSE,客户端则之后进入CLOSE
HTTP-1/2
如果每次HTTP请求都要TCP链接则会带来消耗,所以1.1则支持长连接-header: Connection: keep-alive,但是由于限制还是有限,同时6个HTTP
区别
1: 2是二进制传输,1是纯文本的报文
2: 2header采取了压缩
3: 多路复用,就是可以同时多个http同时请求
4: 安全性好因为常见的2都是https加密
HTTP缓存
强制缓存
1: 初次请求后,reponse header { cache-control: time }
2: 再次访问如果没有过期则使用缓存304
3: 如果过期则走协商缓存或者重新200
协商缓存
1: 初次访问 reponse header { Last-Modified: 最后修改的时间, Etag: 特殊的key }
2: 再次请求 request header { If-Modified-Sine: Last-Modified值, If-None-Match: Etag值 }
3: 服务器判断是否一直,如果有更新则200和新内容,否则304缓存
4: 共存的情况下Etag优先于Last-Modifed, 因为Etag更精确
HTTPS-HTTP+TLS
对发起的HTTP请求的数据进行加密和对接受的数据内容解密的操作,由于http是明文,敏感信息容易被劫持,而HTTPS则是通过数字证书对
流程
1: 客户端发起HTTPS请求
2: 服务器通过CA数字证书生成私钥和公钥,然后响应请求并携带证书公钥和相关内容
3: 客户端验证证书,如果失败则提示警告
4: 如果成功则生成一个随机码KEY通过公钥加密发送给服务器
5: 服务器收到后通过私钥解密得到随机码KEY,然后使用此随机码对传输的数据进行对称加密传输
6: 客户端使用之前的随机码KEY解密数据
TIPS: 分别经过了证书验证,非对称加密随机码,对称加密传输数据