文章目录
- 关于应用层
- 比较流行的协议模板
- xml
- json
- protobuffer
- 应用层的一些重要协议
- DNS
关于应用层
应用层和其他协议不同,应用层是程序猿最容易打交道的一层,其他的四层,都是操作系统,驱动,硬件实现好的
而应用层需要做的就是涉及并且实现一个应用层协议 (工作中最常做的事情)
举个栗子:
此时要设计一个点外卖的软件,当前有一个功能叫做获取 用户的订单历史(存于数据库,服务器取数据)这个功能就需要涉及到客户端和服务器端的交互
前端和后端是通过网络进行交互的,交互过程中需要约定好前端发什么样的数据,后端回应什么样的数据
此时只是一种可能的格式,此处这里的组织格式可以随心所欲的约定
设计一个应用层协议,主要包含两个工作
- 明确传输的数据
- 明确传输数据的组织格式
因为程序猿在协议设计的时候参差不齐,所以大佬们约定了一些友好协议的模板,可以直接让程序猿往上套用
比较流行的协议模板
xml
xml属于一种比较老牌的数据格式
格式
<标签名> 内容 </标签名>
例如上面例子的请求,可以表示为
<request>
<userId>123</userId>
<startTime>2022-5-20</startTime>
<finishTime>2022-5-30</finishTime>
<count>10>/count>
</request>
使用键值对的形式
标签名就是Key
标签值就是Value
通过这些标签名就可以很好的体现出这个数据的可读性,每个数据是什么意思一目了然
虽然xml提高了可读性,但是又引入的太多的辅助信息,就浪费了网络带宽
xml格式最多用来当配置文件
json
json是当下最流行的一种设计应用层协议的数据结构了
格式
{
键 : 值,
键 : 值,
...
}
通过{}构成了键值对结构,一个{}中可以有多个键值对,
键值对之间用逗号分割
键和值之间用冒号分割
要求键必须是字符串类型
值就可以很多种(数字,字符串,布尔,数组,另一个json)
例如上面例子的请求,可以表示为
{
userId:123,
startTime:'2022-5-20',
finishTime:'2022-5-30',
count:10
}
json中表示字符串可以用双引号,同时可以用单引号
最后一个键值对,后面可以有逗号,也可以没有逗号,
json要求键必须是字符串,所以key的引号可以省略
除非key中包含了一些特殊字符(比如空格)必须加上引号
json相比较于xml,在拥有了可读性的同时又节省了网络带宽
protobuffer
json虽然传输效率比xml高,但是仍然要传输一些冗余信息,就是key的名字,特别是在表示数组的时候,尤为明显
例如,用json表示响应格式
{
ok:true,
resaon:"",
data:[
{
name:'蛋炒饭',
price:10,
count:1,
totalPrice:10
},
{
name:'炒面',
price:8,
count:1,
totalPrice:8
}
]
}
此时key出现了很多次,发生了冗余
protobuffer应运而生 , protobuffer是一种二进制格式的数据,在protobuffer的数据中,不再包含上面key的名字,而是通过顺序以及一些特殊符号来区别每个字段的含义.同时再通过一个IDL文件来描述这个数据格式(每个部分是什么意思)IDL只是起到一个辅助开发的效果,并不会真正的进行传输,纯属的只是二进制纯粹的数据
简化版本
1\3\3 蛋炒饭\210\21\210\3炒面\28\21\28
综上所述 设计应用层协议是一个非常普遍的事情,并且也不是特别复杂
设计应用层协议,要做的工作
- 明确传输的数据
- 明确传输的格式
应用层的一些重要协议
介绍完应用层协议的设计之后,就来看一些应用层中的重要协议
DNS
DNS,即Domain Name System,域名解析系统。DNS是一整套从域名映射到IP的系统。
TCP/IP中使用IP地址来确定网络上的一台主机,但是IP地址不方便记忆,且不能表达地址组织信息,于是人们发明了域名,并通过域名系统来映射域名和IP地址。
虽然ip地址被写成了点分十进制的形式,但是对于人类来说仍然不是很友好,所以就出现了域名
最简单的例子,www.baidu.com就是百度的域名,域名和ip地址之间是映射关系,我们可以通过域名访问百度网址,也可以通过ip地址进行访问.其实归根到底,我们仍然是通过ip地址进行访问,那为啥我们可以通过域名访问呢?
这就需要介绍到我们你的域名解析DNS系统,DNS系统最开始的时候只是一个普通的文件,称之为hosts文件,里面记录了ip地址和域名的对应关系,这些数据会被保存在本机主机中,后续可直接访问.
现如今,域名越来越多了,我们不可能对这个hosts文件改来改去,所以就专门成立了一个机构,负责维护这里的域名和ip地址的应对关系,我们要申请域名就必须在这个机构报备才可以.这个机构维护了一组服务器,将hosts文件存放在这个服务器中,叫做域名解析服务器
全世界的电脑如此之多,每个设备上网去访问这个服务器的话,这个服务器补得瘫痪?
漏漏漏~ 全世界各个国家,地区都有各自的运营商,这些运营商就可以就近架设域名解析 镜像 服务器,里面存放的数据和域名解析服务器一模一样,而我们平时上网访问的就会域名解析 镜像 服务器
域名是一个字符串,如 www.baidu.com , hr.nowcoder.com
域名系统为一个树形结构的系统,包含多个根节点。其中:
根节点即为根域名服务器,最早IPv4的根域名服务器全球只有13台,IPv6在此基础上扩充了数量。
子节点主要由各级DNS服务器,或DNS缓存构成。
DNS域名服务器,即提供域名转换为IP地址的服务器。
浏览器、主机系统、路由器中都保存有DNS缓存。
Windows系统的DNS缓存在 C:\Windows\System32\drivers\etc\hosts 文件中,
Mac/Linux系统的DNS缓存在 /etc/hosts 文件中。
网络通信发送数据时,如果使用目的主机的域名,需要先通过域名解析查找到对应的IP地址:
- 域名解析的过程,可以简单的理解为:发送端主机作为域名系统树形结构的一个子节点,通过域名信息,从下到上查找对应IP地址的过程。如果到根节点(根域名服务器)还找不到,即找不到该主机。
- 域名解析使用DNS协议来传输数据。DNS协议是应用层协议,基于传输层UDP或TCP协议来实现