
🎁个人主页:User_芊芊君子
🎉欢迎大家点赞👍评论📝收藏⭐文章
🔍系列专栏:JavaEE


文章目录:
摘要
网络通信为什么要分层?本文从五层模型(应用/传输/网络/数据链路/物理层)讲起,明确各层职责边界;随后聚焦离开发最近的应用层:什么是"自定义协议",如何约定请求与响应格式,纯文本、XML、JSON、Protobuf四种序列化方式各有什么优劣;最后讲解 DNS 域名解析------域名为什么存在、根域名服务器与分级存储机制如何把域名高效翻译成 IP地址。

一、网络中协议分层
应用层和传输层与我们编程息息相关。
- 应用层:与应用程序直接相关
- 传输层:端到端传输,不关心中间过程,只关心起点和终点
- 网络层:点到点传输,规划传输的中间路径(操作系统内核中调用实现,由硬件和驱动程序实现,和应用程序的开发没啥关系)
- 数据链路层:两个相邻点之间的传输
- 物理层:底层基础设施,硬件设备
二、应用层
HTTP协议是应用层最重要的协议,这里我们先讲一下"自定义协议"。顾名思义,就是我们可以自己定义的一个约定。eg:在一个项目中,我们可能要新加一些功能,这个时候就需要约定"前后端进交互接口",根据我们的需求,达成一致后,再进行开发。这个约定就是自定义协议。
1.用外卖软件举一个例子,步骤:
- 先确定功能中,客户端和服务器需要哪些交互数据
需求:根据用户所在位置,寻找周围5km以内所有商家以及商家信息列表
请求:用户ID;用户位置
响应:商家列表(名称,图片,评分,距离...)
- 再确定数据组织的格式
网络通信本质是传输"字节流"和"字符串()二进制"
序列化:结构化数据-->字符串;
反序列化:字符串-->结构化数据
2. 数据格式 组织方法:
- 纯文本格式(给到一个拉);
- 基于XML格式
经典,通过成对"标签"描述某个值的含义。maven使用XML作为核心配置文件。
缺点:及其消耗资源;格式不美观。
plain
<request>
<userid>11</userid>
<jingdu>38</jingdu>
<weidu>28</weidu>
</request>
- JSON(流行)
可读性高,带宽消耗少。一次请求中有多个{},用数组语法
plain
[
{
"userid":11,
"name":"张记麻辣烫",
"distance":"1.0km",
"rank":5
},
{
"userid":22,
"name":"李记麻辣烫",
"distance":"1.5km",
"rank":5
}
]
- Protobuf
纯二进制,人无法识别;传输效率高;搭配官方工具,方便扩展。
三、DNS协议
1.DNS
域名解析协议,域名就是"网址",eg:www.baidu.com。访问百度,本质就是在访问百度的服务器(通过服务器的IP建立通信)。
IP地址是一段数字,比较抽象,所以我们使用一串有描述性的单词(域名)来代替IP地址,计算机通讯时会自动把域名转化为IP。这个过程就是DNS完成的。
2.DNS服务器
最初DNS通过hosts文件记录域名与IP地址的对应关系。的那随着设备和IP增多,无法满足需求,然后人们将hosts和IP映射关系提取出来,单独部署到服务器,这就是DNS服务器,后面用户访问网站时,就会先向DNS服务器发起查询请求,获取到IP地址后,在进行访问
维护原始数据的DNS服务器称为"跟域名服务器",只有11台,很多运营商/大型互联网公司就会搭建DNS镜像服务器
3.DNS分级存储机制
- 最顶层DNS服务器存储了各种一级域名;
- 一级域名服务器存储了自身管辖范围内所有二级域名;
- 二级域名服务器存储了自身故拿下范围内所有三级域名
查询时,从根服务器向下依次查询。分级查询实现高效跳转

四、总结
网络分层的本质是职责分离------应用层管业务、传输层管端到端、网络层管路径规划、链路层管相邻节点、物理层管硬件。自定义协议的核心是两步:先约定交互的数据内容(请求/响应字段),再约定数据的组织格式。序列化方案上,XML 可读但冗重,JSON平衡了可读性与带宽,Protobuf 用二进制换取最高效率。理解了自定义协议,就理解了 HTTP 协议设计的出发点。