网络模型五层协议,在开发过程中涉及到的协议和概念进行概括总结
http
http协议随着网络的发展,传输速度的加快和应用的丰富,传输的数据量也越来越大,版本也随之升级更新。
1.0----> 1.1---->2.0
升级的目的:更快的传输数据,更快的渲染速度。
关键词:
http1.1 : 链接复用Keep-alive、队头阻塞、gzip压缩?
http2.0: 二进制分帧, io多路复用,流优先级,header优化(HPack算法),Server-push
请求方式
常用请求方式有get、post。
get请求为向服务器请求资源,通常请求到的资源是不可变的,浏览器会进行缓存操作。
而post请求如请求体中为表单数据,通常服务器会利用提交的数据的数据执行相应的逻辑,不可缓存。
http格式
http request中包含:请求行,请求header,空行,请求内容
http response中包含:响应码,header,空行,响应内容。
考虑一个问题:https中抓包获取到的请求行中有路径吗?
http加速
提到加速必须要先考虑http请求的各个阶段
DNS获取ip地址 ----> 发起网络请求(携带请求数据) ----> 网络传输----> 服务端进行响应
域名解析:dns缓存(浏览器缓存,本地缓存/etc/host)。
Dns解析存在着被劫持的问题:Dns在请求方和dns服务器之间是udp协议 53端口,Master(主要名称服务器);Slave(备份服务器),Slave通过区域传送从 Master 服务器获得区域数据的副本。
那么客户端请求的第一个dns服务器从哪里来呢?
路由器通过DHCP分配,也可以用户自己配置dns服务器如:8:8:8:8
DHCP:动态主机配置协议。用于给网络内的主机自动分配IP地址。一般通过路由器或DHCP服务器,把将要为用户分配的网关、DNS服务器及域名等参数保存至配置文件中,当DHCP客户端连接到DHCP服务器请求IP地址时,就会按配置文件指定的地址池分配IP地址、网关、DNS服务器。
HttpDns优化Dns被劫持的问题。
DNS部分优化
域名----CNAME(如云服务器关联)
DNS相关概念:
A记录(A记录是把一个域名解析到一个IP地址,又称IP指向)
CNAME 简单理解为域名到域名的映射。 如CDN服务中,如果CND服务商提供给你ip地址,如果ip变更,会直接影响到用户,提供给用户的实际为域名,做了一层隔离,并且会根据用户所在位置选择并返回最优节点 IP,加快访问速度,这也是cnd最重要的功能。
缺点:第一次DNS解析域名的时候会多解析一次。
httpdns
域名服务器中有高速缓存,选用一个优质的dns服务器,可能会触发缓存,加快ip返回速度。
httpdns自身考虑配置ip直连列表,同样的ip地址在不同的网络环境下访问速度可能不一致,因此可以在初始化时对ip列表进行速度测试,为当前的ip设置生效时间。(并行 or 串行 or 阶梯型)
当httpdns失败时要使用降级方案。
域名合并
如一个公司不同部门的资源三级域名不一致,那么可以进行合并,并做路径映射然后通过后端统一接口再做拆分转发到对应的服务器。
参见美团域名合并方案
传输数据优化
利用http协议中现有的机制减少请求数据量
- 设置gzip压缩
- http2.0 中头部压缩
- 具体业务场景下如大量音频或者视频数据考虑具体的压缩算法。 post请求 语音识别:multipart,chunked(减少了请求次数)
- protobuf 替换json,利用变长编码减少数据量。
如: boundary自然要避免和传输数据一致导致数据解析异常
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary11223344
Content-Length: 514
持续上传数据设置multipart和大数据返回chunk
transfer-encoding:chunked
其他
电商app中网络请求缓存,如缓存get请求数据,并且对应数据本地持久化,再次打开页面时加快访问速度。
tcp
关键词:三次握手,拥塞控制(cwd, swd),数据丢包原因
websocket
websocket和socket区别,和使用tcp建立的长链接区别
websocket和http区别 和Server push机制的区别
问题
基于tcp实现的http协议,必然会受限于tcp协议队头阻塞问题,因此Quick协议基于udp实现,对此进行优化。
如在一次http请求访问异常时,重试发起一次http请求,并以阶梯方式间隔短暂时间发起quic请求,哪个请求先返回则使用哪个请求。