网络基础学习笔记
DNS
定义
DNS(Domain Name System,域名系统),DNS服务用于将域名解析成IP。用户访问站点时不必再记忆复杂难记的ip地址,能够让用户更方便的上网。
DNS模式
- 递归查询:本地在解析域名时会先询问本地的dns服务,如果本地DNS服务不知道ip时会递归的询问根服务器
- 迭代查询:根域名服务器不知道域名的ip时会让本地DNS服务去询问下一个DNS服务器(CNAME),以此类推
问题
- 传统的基于UDP的DNS服务,极易被劫持和污染,使得页面跳转到危险的网站。
- 缓存,大部分DNS服务都是会有缓存的,有缓存就会有一致性问题。
- 现代的DNS都有智能优选能力,权威DNS直接返回的节点才是最适合你的节点,通过DNS转发得到的节点适合别人但不一定适合你。
HTTPDNS
顾名思义HTTPDNS就是基于http协议的DNS请求。它能在应用层控制http解析,在请求接口前先获取到ip,用ip替换域名的形式访问接口。由此可以绕过运营商DNS的限制避免运营商DNS缓存不刷新的问题。DNS服务器也能获取到请求端的IP做到节点的精准分配。
AnyCast
有没有想过一个问题谷歌的DNS服务8.8.8.8为什么能抗住全球的解析请求?理论上再怎么优化任何一台物理机都是无法抗下如此庞大的请求。那他们是怎么做到的呢?这就要用到AnyCast的技术了。这里不在展开,需要用时再深入了解,知道有这么一个东西即可。
CDN
CDN(Content Delivery Network),依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取内容,降低网络延迟,提高访问速度。
类型
- 静态CDN:加速静态资源
- 动态CDN:加速动态请求
作用
就近接入,静态资源版本化缓存管理,归并回源,减轻核心机房的压力。隐藏核心机房ip,可以做许多回源优化策略如:长连接,线路优选,去除加密传输减少rtt等做到线路加速的作用
数据一致性
分为两种形式push:由核心机房主动向边缘节点推送数据,做到提前预热数据的效果。pull:访问一个资源时如果边缘节点缓存失效或者未命中会回源拉取资源,如果回源请求量太大可以设置二级三级CDN节点减少回源请求的数量。
HTTP
HTTP超文本传输协议(Hyper Text Transfer Protocol),是一个简单的请求-响应协议,它通常运行在TCP之上。在互联网时代HTTP协议的使用爆发性的增长,几乎随处可见。
缓存机制
强制缓存:浏览器在缓存未过期的情况会强制使用缓存中的数据,不在发起请求。控制强制缓存的规则字段有expires和cache-control。expire是指定一个过期时间时http1.0的标准字段,优先级低于Cache-Control。cache-control的取值有:
- private:客户端可以缓存
- public:客户端和代理服务器都可以缓存
- max-age=xxx:缓存的内容将在xxx 秒后失效
- s-max-age=xxx:同s-max-age,但仅适用于共享缓存(比如各个代理),并且私有缓存中忽略。
- no-cache:需要使用协商缓存来验证缓存数据
- no-store:所有内容都不会缓存,强缓存和协商缓存都不会触发
- must-revalidate:缓存必须在使用之前验证旧资源的状态,并且不可使用过期资源。
值可以时一个或者多个。
- 协商缓存:服务端在下发数据时会在header头里带上etag和last-modified两个字段。etag是服务器的唯一标识一旦资源发生变化etag也会变化,last-modified是资源的最后修改时间,文件修改了时间也会跟着改变,etag的优先级高于last-modified。浏览器在第二次发起协商缓存的请求时会把之前服务端下发的etag和last-modified两个值分别放到字段if-none-match和if-modifind-since中服务端收到请求发现唯一标识或者最后修改时间没变会返回304告诉浏览器使用缓存内容,如果内容变化了则返回200重新下发资源
Etag和Last-Modified区别
Last-Modified与Etag类似。不过Last-Modified表示响应资源在服务器最后修改时间而已。
- Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间。如果1s内文件被修改了,但是Last-Modified没变,此时不能根据Last-Modified判断文件是否被修改过。
- 如果某些文件会被定期生成,有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存。
- 有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形。
- Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符,能够更加准确的控制缓存。
HTTP1的问题
- 应用层面的队头阻塞:HTTP1虽然可以复用tcp连接但是请求的发送和接收的同步后面的请求必须等待前面的请求完成才能进行。如果第一个请求阻塞了后面的请求就得等待。
- 未压缩标头:HTTP1每发送一次请求就得发送一次完整得请求头,然而请求头有许多内容又是重复得,十分得浪费带宽。
- 安全性:HTTP协议时明文的,传输的内容很容易被人截获试别
HTTP2
有了HTTP1的前车之鉴HTTP2优化了很多问题,比如通过多路复用解决了应用层的队头阻塞问题,还有表头压缩,相同的header头只要传输一次剩下的只要传输一个指针指向之前的内容就可以了。
HTTP2解决了很多问题但是新的问题也随之而来了,比如:
- tcp握手的1.5次rtt,tls握手的2次rtt:HTTP2是基于tcp之上的协议tcp的上次握手延迟是无法避免的,还有tls的握手延迟也是无法越过的屏障。
- 传输层的队头阻塞问题:虽然HTTP2通过多路复用解决了应用层的阻塞问题,但是如果tcp丢包了,他是影响到同一个tcp连接下的其他http请求的。所以HTTP2会有传输层队头阻塞问题。
- 网络迁移需要等:TCP 连接是由四元组(源 IP 地址,源端口,目标 IP 地址,目标端口)确定的,如果切换了网络将会导致之前建立的连接都无法使用了,需要重新建连。比如收集网络切WIFI。
HTTP3
针对HTTP2的问题HTTP3孕育而生,它使用了不可靠的UDP协议,但是在上层实现了QUIC协议通过可靠的QUIC协议保证了请求的可靠性,它还内置了tls1.3只需要一个rtt就可以同时完成建立连接与密钥协商。它解决了上面HTTP2提到的的三个问题:
- 无队头阻塞: QUIC协议多个请求之间没有依赖,都是相互独立的,某个请求丢包了只会影响它自己,不会影响别的请求。
- 更快的连接建立:不同于HTTP2,HTTP3是基于UDP协议的连接上天然比HTTP2更快。
- 连接迁移: HTTP3不在是通过四元组来确定连接了,而是通过连接ID来标记通信的两个端点。只要仍保有上下文信息(连接id,TLS 密钥)就算切换网络也能复用之前的连接。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭