【JavaEE初阶 - 网络原理】网络分几层?从自定义协议聊到 DNS

🎁个人主页:User_芊芊君子

🎉欢迎大家点赞👍评论📝收藏⭐文章

🔍系列专栏:JavaEE

文章目录:

摘要

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

一、网络中协议分层

应用层和传输层与我们编程息息相关。

  • 应用层:与应用程序直接相关
  • 传输层:端到端传输,不关心中间过程,只关心起点和终点
  • 网络层:点到点传输,规划传输的中间路径(操作系统内核中调用实现,由硬件和驱动程序实现,和应用程序的开发没啥关系)
  • 数据链路层:两个相邻点之间的传输
  • 物理层:底层基础设施,硬件设备

二、应用层

HTTP协议是应用层最重要的协议,这里我们先讲一下"自定义协议"。顾名思义,就是我们可以自己定义的一个约定。eg:在一个项目中,我们可能要新加一些功能,这个时候就需要约定"前后端进交互接口",根据我们的需求,达成一致后,再进行开发。这个约定就是自定义协议。

1.用外卖软件举一个例子,步骤:

  • 先确定功能中,客户端和服务器需要哪些交互数据

需求:根据用户所在位置,寻找周围5km以内所有商家以及商家信息列表

请求:用户ID;用户位置

响应:商家列表(名称,图片,评分,距离...)

  • 再确定数据组织的格式

网络通信本质是传输"字节流"和"字符串()二进制"

序列化:结构化数据-->字符串;

反序列化:字符串-->结构化数据

2. 数据格式 组织方法:

  1. 纯文本格式(给到一个拉);
  2. 基于XML格式

经典,通过成对"标签"描述某个值的含义。maven使用XML作为核心配置文件。

缺点:及其消耗资源;格式不美观。

plain 复制代码
<request>
  <userid>11</userid>
  <jingdu>38</jingdu>
  <weidu>28</weidu>
</request>
  1. JSON(流行)

可读性高,带宽消耗少。一次请求中有多个{},用数组语法

plain 复制代码
[
  {
    "userid":11,
    "name":"张记麻辣烫",
    "distance":"1.0km",
    "rank":5
  },
  {
    "userid":22,
    "name":"李记麻辣烫",
    "distance":"1.5km",
    "rank":5
  }
]
  1. 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 协议设计的出发点。

相关推荐
聚美智数8 小时前
智能结构化识别-图片结构解析-图像结构化解析-照片结构化解析
android·java·数据库
2603_969579288 小时前
备份最常用的三个软件是什么软件
网络
十年Java程序媛8 小时前
Java枚举Enum完整教程|替代静态常量,开发与面试要点
java·开发语言·spring boot·后端·面试
我是人✓8 小时前
SpringBoot静态资源映射揭秘
java·spring boot·后端
土豆.exe9 小时前
nf_tables 的 verdict 被读了两次:一个十年未闭合的位域错配
java·数据库·网络安全·缓存
缓慢更新9 小时前
表单引擎的存储建模:宽表与文档库的取舍
运维·服务器·网络·数据库·低代码·oracle·适配器模式
Data_Journal10 小时前
如何绕过 Cloudflare:网页抓取的最佳方法
网络·python
小坏讲微服务10 小时前
刚发布一个月的JDK 27,为什么我建议你立刻升级?
java·开发语言·spring boot·spring·架构·求职招聘·springboot4
续写烂尾10 小时前
贴片 SD NAND、eMMC、TF 卡规格怎么定?硬件工程师选型清单
运维·服务器·网络