【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 协议设计的出发点。

相关推荐
养军博客16 分钟前
Spring Boot 3.x + Spring Security 6.x 整合 JWT 实战:jjwt 与 java-jwt 两种工具库详解
java·spring boot·springsecurity
TeamDev25 分钟前
使用 JxBrowser 在桌面应用中集成 Spring
java·前端·后端·spring·混合应用·jxbrowser·浏览器控件
J.YA32 分钟前
String字符串[面试题]
java·开发语言
叼烟扛炮43 分钟前
Linux 学习笔记(六十一):网络编程毕业设计——Reactor 反应堆模式
linux·网络·笔记·学习·课程设计
2401_868534781 小时前
【网络安全
网络·python
xyzzklk1 小时前
变相解决华为Mate 8锁屏后无法建立入站网络连接
linux·运维·服务器·网络·华为·go·安卓
叼烟扛炮3 小时前
Linux 学习笔记(五十九):epoll 的生死抉择——LT 与 ET 模式
linux·运维·服务器·网络·笔记·学习·php
金銀銅鐵10 小时前
为什么枚举类中可以定义抽象方法
java·后端·ai编程
xixingzhe211 小时前
AI 对话打字机效果:SSE 和 HTTP 的区别与适用场景
网络·网络协议·http
xiaoye-duck11 小时前
《C++ 项目:手写大模型接入 SDK》Gemini接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型