概述
应用层的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。 对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。
DNS
域名系统DNS:互联网采用层次结构的命名树作为主机的名字,并使用分布式的域名系统DNS,DNS是大多数名字都在本地进行解析,仅少量解析需要互联网上通信。 作用: 将浏览器中输入的域名转换为ip地址。 原理: ip地址与域名的对应关系会存储在某一个“权限域名服务器”上,DNS的解析过程就是查询这个权限域名服务器,并且从该服务器上获取域名对应的ip地址的过程。查询到这个权限域名服务器还需要其他域名服务器的帮忙。 DNS查询方式: 递归查询和迭代查询
DNS解析过程
- 浏览器搜索自身的DNS缓存。缓存时间比较短,大概只有1分钟,且只能容纳1000条缓存
- 若无,搜索操作系统的DNS缓存
- 若无,读取本地的Host文件(位于C:\Windows\System32\drivers\etc)
- 若无,向本地DNS服务器进行查询
- 如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性)
- 若无,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析(此解析不具有权威性)
- 若无,则将根据其设置发起递归查询或者迭代查询
DNS查询方式
递归查询:主机向本地域名服务器查询,采用递归查询(对被查询的域名服务器负担太大) 如果本地域名服务器不知道查询域名的IP,则本地域名服务器以DNS客户的身份,向其他根域名服务器继续发出查询请求报文,而不是让主机自己进行下一步查询。因此,递归查询返回的查询结构是查询的IP地址或报错,即无法查询到IP
- 如果该DNS服务器为被授权的服务器,且它能够回应请求,则返回结果给客户机
- 若不能,则该DNS服务器则代替客户机向它认为能给出结果的DNS服务器发出请求
- 以此类推,得到结果后逐级返回。
迭代查询:本地域名服务器向根域名服务器查询,采用迭代查询(对本地域名服务器的负担较重) 当根域名服务器收到本地域名服务器发出的查询请求报文时,要么给出要查询的IP地址,要么告诉本地域名服务器下一步应向哪个域名服务器查询,然后让本地域名服务器进行后续查询。根域名服务器通常把自己知道的顶级域名服务器的IP告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询
迭代查询思路:每次查询先向最高级查询(根域名服务器),最高级根据查询情况返回下一级该向哪一级查询,如此重复进行,知道查询完毕。
- 如果该DNS服务器为被授权的服务器,且它能够回应该请求,则返回给客户机
- 若不能,则该DNS服务器则向客户机返回一个它认为能给出结果的DNS服务器地址,客户机再向这个地址发出请求
- 以此类推,得到结果后逐级返回。并缓存在本地的DNS高速缓存中
高速缓存 DNS用什么传输层协议
DNS占用53号端口,同时使用TCP和UDP协议。
- 域名解析:UDP
- 客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可。
- 不用经过三次握手,这样DNS服务器负载更低,响应更快。
- 理论上说,客户端也可以指定向DNS服务器查询时用TCP,但事实上,很多DNS服务器进行配置的时候,仅支持UDP查询包。
- 区域传输:TCP
- DNS负载均衡的数据同步传送的数据量比一个请求应答的数据量要多得多。
- TCP是可靠连接,保证了数据的准确性。
HTTP(超文本传输协议)
概述
超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。
版本迭代
HTTP1.0和HTTP1.1的区别
-
长连接
-
缓存处理
- HTTP1.0主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准
- HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等
-
断点续传
- HTTP 1.1默认支持断点续传。断点续传其实就是在上一次下载断开的位置开始继续下载,可以在请求报文头中加入Range段,来表示客户机希望从何处继续下载。
-
节约带宽
- HTTP1.0存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能。
- HTTP1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,客户端接收到100才开始把请求body发送到服务器;如果返回401,客户端就可以不用发送请求body了节约了带宽。
-
HOST域
- HTTP1.0认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名,没有host域。
- HTTP1.1的请求消息和响应消息都支持host域,且请求消息中如果没有host域会报告一个错误(400 Bad Request)。
-
错误通知管理
- HTTP1.1新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
HTTP1.1和HTTP2.0的区别
-
多路复用
- HTTP1.1可以多建立几个TCP连接处理多个并发请求,但是创建TCP连接本身是有开销的。
- HTTP2.0使用了多路复用技术,同一个连接能处理多个并发请求,而且并发请求的数量比HTTP1.1大了好几个数量级。
-
头部数据压缩
-
服务器推送
- HTTP1.1中网络资源每一个都必须明确地请求,速度很慢
- HTTP2.0引入了服务器推送,允许服务端推送资源给浏览器,免得客户端再次创建连接请求。这样客户端可以直接从本地加载这些资源,不用再通过网络。
Http3.0 QUIC协议 参考
- UDP实现
- 解决队头阻塞问题:http 2.0中前一个stream丢包会导致后一个stream被阻塞;QUIC 一个连接上的多个 stream 之间没有依赖,不会影响 stream2 之前及之后的 stream 的处理
- 连接迁移:TCP使用五元组表示连接,网络环境变化时必须创建新的TCP连接;QUIC 使用一个64位随机数来确定这个连接
- 优化重传策略:QUIC 重传包和原包的编号不同,降低后续重传计算的消耗
报文格式
参考
|