JavaEE & 协议 & 信息是如何在一个机器传到另一个机器的
1. 局域网
以机房为例,多个机器之间可以进行联机,这就相当于一个局域网
通过网线直接连接实现的联机也是局域网
通过交换机也能进行联机,这也是局域网
电脑越多,用网线直连就越复杂~
区别于集线器:集线器是将一条网线转变成多条网线,多条网线转变成一条网线,这是交换机原始的版本,有很大弊端,如信息同时汇集时会冲突!
这里的交换机也可以换成路由器:
不难看出,局域网顾名思义就是局部的区域可以进行联机。
一个学校的机房的机器必然无法联机到另一个学校的机房的机器
2. 广域网
现在的传奇被我们嘲笑,但是初期的传奇却席卷全国。那是因为,这个游戏在那个年代实现里不同地区的玩家进行多人联机!那个时候的网吧火爆了。
而实现的方式就是:广域网的网络组建 — 规模大
即通过一些交换机路由器搭建一个网络环境,这需要一些拥有强大的专业知识和技能的人:网管
不是网吧管理员,而是网络管理员!
如果你学习开发,一般也会接触到,可能也需要学习如何组网~
之后又进入了移动互联网阶段,无线联网~
手机…
3. IP与端口号(初识)
IP地址:标识一台主机的位置,即主机在互联网上的具体位置
本质上是一个4字节的32位整数
往往协程“点分十进制”的形式
如:192.168.137.1
四个部分,每个部分一个字节
命令行输入ipconfig:
端口号:标识主机上的哪个程序 ,区别一个主机上的应用程序
4. 协议
协议即约定
发送方发送的信息,有特定的格式,而接收方应如何解读这些信息呢,就是通过协议
发送方发出的信息不仅仅要包含“核心数据”,还要包含IP,端口号…等等很多信息,那么这些信息的组织格式是必要存在的!
网络的传输本质上是通过 网线/光纤/无线(电磁波) 以电信号/光信号来进行传输的
光信号也是要转化为电信号
不同频率来代表1与0
电信号就是高低电平(高低电压)表示的010101…
好的,现在我们知道怎么传输这些010101…了,那么我们要怎么处理这些信息呢?
我们需要约定好,“你传过来的信息是什么什么格式,我就以什么什么格式来理解”
这就是协议
4.1 协议分类分层
一个大的协议非常复杂,我们可以拆分为多个协议
那么就有一些协议功能类似,一些协议功能不同
分类
而对于不同功能的协议,就安排在不同信息处理的不同阶段
分层
而分层,也需要约定层级与层级之间的调用关系
要求不能跨层级调用
也就是说,一个小协议其实就只是大协议“这条流水线”的一个小工程罢了
而流水线的工程之间是不能越级的
上层调用下层
下层给上层提供支持
调用的时候,格式就会发生改变
信息传到下层,加工成下层协议格式
信息传到上层,解析下层协议格式为上层协议格式
例如来自历史课本的一张图:
一般也不会跨级管理,这样管理成本大
4.2 协议分层的好处
分层后,上层协议不需要了解下层协议的细节,下层协议不需要了解上层协议的细节
换协议后,只需要搞定层级间的信息加工/解析的细节就好
4.3 真实的网络协议分层,TCP/IP五层网络模型
重点:
应用层
传输层
网络层
数据链路层
物理层
(四层是因为没考虑物理层,软件方面看)
现在了解大概就好,后续深度学习!
4.3.1 应用层
关注数据要怎么用:
礼物拿来自己用还是送人
书本拿来看还是拿来盖泡面
…
4.3.2 传输层
不考虑中间的路径规划,只关注起点是什么,终点是什么
相当于买东西,发货地址与收货地址
我和卖家只关心起点终点,中间怎么传输就交给快递公司就好
4.3.3 网络层
主要负责两个遥远节点之间的路径规划
例如快递从汕头到北京有很多路线可以走
汕头 -> 深圳 -> 北京
汕头-> 福建 -> 杭州 -> 北京
汕头-> 深圳 -> 杭州 -> 无锡 -> 北京
…
在众多路径中找一个合适的路径,一般走几步后要重新规划一下
4.3.4 数据链路层
主要关注的是两个相邻节之间的传输
例如快递在两个相邻地址之间是怎么传输的
飞机,火车,卡车,电瓶…
网络上的相邻节点,就是通过网线/光纤/无线直接连接的设备
4.3.5 物理层
网络通信的基础设施,网线光纤网络接口
网络物件咋组织的约定
网络物件类别的约定
网络上的高速公路:数据的传输硬件上的规定
4.3.6 总结
跟程序员密切相关的是应用层和传输层!
网络编程重点!
4.4 网络分层后,数据的变化 — 封装 & 分用
发送方发送数据,数据从上到下,依次交给对应的协议,进行封装加工
接收方接受数据,数据从下到上,依次交给对应的协议,进行分用解析
在传输层和应用层之间,调用一些协议的API即可
调用下层协议(传输层)
那么就可以将上层协议格式(应用层协议格式)转化为传输层协议的格式
或者将传输层协议格式转化为上层协议格式(应用层协议格式)
4.4.1 图解
4.4.2 例子
简单粗糙的例子,实际上会更复杂细节
小马要通过QQ给远方的老马发一条信息,这条信息在图中发生了什么事情呢?
应用层到传输层:
小马发送给老马“吃饭了没?”,并且打包成应用层数据包
字符串拼接
应用层调用传输层(API):封装成传输层数据报
与UDP为例:(报头 + 载荷的形式)
字符串拼接
为了区分不同字段,引入分隔符~
当然,现实中会更加复杂,如json,xml…
传输层到网络层:
以IP协议为例:
不是代码层面的了,后续会细节讲解!
网络层到数据链路层:
以 “以太网” 为例:
要把网络层数据包封装成以太网数据帧
mac地址:也叫做物理地址
主机在网络上的位置
mac ==> 描述数据链路层两个相邻节点
IP ==> 描述网络层的路径规划
传输的过程中,mac地址随之变化为对应的相邻节点~
理论上,每个网卡设备都会有一个自己唯一的mac地址,而IP地址不是
数据链路层到物理层
物理层将二进制数据转换为电信号/光信号…进行传输~
物理层到物理层
物理层之间就通过同一协议直接沟通的,直接解析
物理层到数据链路层
数据链路层调用物理层,将信号转换为二进制序列(以太网数据帧)
数据链路层到网络层
网络层调用数据链路层,将以太网数据帧转换为网络层数据包
去掉帧头帧尾
网络层到传输层
传输层调用网络层,将以网络层数据包转换为传输层数据包
去掉报头
传输层到应用层
应用层调用传输层API,将传输层数据包转换为应用层数据包
去掉报头
应用层数据处理
通过数据包格式(应用层协议内部使用)提取信息
应用层协议没有API,是程序员自己规定的数据格式
当然,一些公司内部使用的API也是会有的
以上去掉报头过程当然是会采取一些“动作”的
之后是什么协议,对应报头是有标识的
宏观看:
这也是交换机和路由器的特点:
交换机:二层转发
路由器:三层转发
有一些特殊交换机可以三层转发,特殊路由器可以二层转发
甚至有更深!
对于群聊,也是类似,我将信息在群聊里
信息(我的qq号,群成员的qq号)发给qq服务器
qq服务器通过这些信息查到对应的ip…,挨个发送给各个成员
(区别于私聊,它经过服务器后转发向多个对象罢了)