最近在公司做一些和其他外部系统接口调用的工作,遇到一些网络传输的问题,趁周末的时间记录、整理一下。
提到网络我们不得不提网络的分层架构:
我们通常听到 网络七层架构/五层架构/四层架构,但是不了解很容易被弄迷糊:什么是分层?这几层架构有何不同?我们为什么要分层?
不要着急,我们先来了解一下这七层、五层、四层 是什么有何区别:
- 七层:OSI开放式系统互联通信参考模型理念由ISO(国际标准化组织)提出,现有的理念标准,并没说具体实现,只是概念模型 osi;
- 四层:在实际中先使用,然后再有的理念 ;(实际生产中为了解决网络通信问题,大家不约而同的使用某种方式(四层)来解决问题,各个厂家在具体分层的细节不一样,为了统一规范,更加合理规范使用从而提出四层理念 )
- 五层:方便理解 七层 和 四层,由此提出五层作为中间理解的概念(通常是教学中才出现的叫法)
我们上面可以理解:七层、五层、四层的 各种叫法都是我们自己抽象出来的规范,具体的做事情是四层模型。
下面我们具体来看一下各个层具体是用来做了什么事情(我们这边为了方便理解,所以使用了五层结构):
扫VX 领Java资料,前端,测试,python等等资料都有
物理层#
解释:从字面看来就是我们实际接触到的实物层:电缆线、光缆线、无线电波等,是传输的基础;
作用:将信号(0,1)由一端 传输到 另一端 ,具体形式是二进制(0,1)。
例子:电信号可以将电压不同作为 0,1 的表示;无线电波以波长作为 0,1 的表示……
说白了其实就是做为传输信号的载体而已。
但是由此引出来一个问题:
信号可以传递过去,但是对方 面对一堆0,1信号,怎么去理解,也就是如何去划分?(单纯的0,1 是没有意义的,重要的是如何进行解读?)
各个厂家都有一套自己的规范(也就是0,1分组的方式不一样),同一厂家的机器进行通信是没有问题的,但是如果不通厂家的话还需要进行转换,一个不小心就容易造成分组错误,导致传递的意思发生改变。这也就急需一个方案来具体解决厂商之间的通信问题(解决物理层解决不了的问题)。
设计这种规范问题,都是这层解决不了,在前面加一层去解决,我们在物理层前面加一层去规范各个厂商的通信问题不就行了。这就引出-->链路层
链路层#
为了解决物理层问题,在链路层,我们提出了划分数据的规范:以太网协议
以太网协议:#
-
一组数据(多个0,1)需要构成一个数据包:叫做桢 :解决数据识别的问题。
-
这个数据包的形式包含 标头 和 数据
-
标头包含 发送者/接收者 的信息,从而来进行解释划分
-
所有接入网络的设备必须要有 网卡 数据的真实流向其实是从 一端 网卡 =》 另一 网卡
网卡:#
网卡就是各个厂商 自己去分组解释 二进制数据的。
网卡:由48位二进制/12个6进制 (前6个数字是厂商编码,后6个是该厂商的流水号)组成,这就是网卡的 mac 地址。
Mac 地址是独一无二的。
好了,现在我们解决了物理层数据的划分问题,现在又出现了两个新问题:
1、发送者是自己,怎么知道对方的 mac 地址呢? ARP协议,这个稍后解释
2、有了双方的MAC地址,系统如何准确将包送到对方
对于第2个问题解决方案:使用广播:
向本网络内所有机器发送数据(此时标头:(发送者mac\接收者mac))由所有的机器自己判断是/否接受数据
但是 这个只能是本网络 ,是需要将所有的机器都连到一个网络上的?
可是这样我们想象一下:一个机器发送数据,所有的机器都要接受到数据,这是灾难性的(数据传输会很大,并发问题)
从而我们提出 划分子网的概念,但是子网怎么半?(子网是找不到mac地址的),所以我们不得不去解决 mac 地址问题,从而在往前加一层(网络层)
网络层#
这层我们是用来解决 链路层 提出以太网协议 中 网卡mac 地址 寻找的问题(就是 标头中 怎么找到对方信息)。
这好办啊,我们在加一个地址,也就是给mac地址,在绑定一个地址,以此区分是不是同一个网络:
- 是同一网络:广播 查找
- 不是同一网络:路由(新地址的查找)
新地址就是ip 协议:
IP协议#
- 32 个 2 进制;
- ip 和 以太网 协议一样,也是包含 标头 和 数据两部分;
- 标头包含 本机 ip 地址,和 接收方 ip 地址。
- Ip 包在 以太网 数据包的 “数据”里
(这点可能有点绕,解释一下为啥是包在 以太网的 数据包里 :我们从 上层拿到数据,然后包到 ip 数据包里,然后ip包给了 以太网,以太网 只认 以太网的标头包,只有解析出 才能得到 ip 包的数据,从而找到 对方以太网地址)
好了,我们整理一下,目前我们有两个地址
- mac 地址:主要解决厂商之间通信兼容问题;
- Ip 地址:解决网络 之间 通信问题
然后这个是如何查找mac 地址的呢?
这就是ARP协议:
ARP协议#
发送一个数据包到所在网络:此时包含有ip(自己的/对方的都有)/mac(只有自己的) 地址,
然后对方的mac 写成 FF:FF:FF:FF:FF:FF
本网络与ip 比较:一样 回复 ip 地址,mac地址;不一样 丢弃 包数据
图解:
到此,实现了网络之间 主机 与 主机 之间的通信了
但是有个新问题:一台机器,多个程序同时进行 网络 收/发 包,如何判断 包(数据)的归属?也就是说这个包到底归谁?
这是同一个机器内的问题。
由此我们引出 传输层的概念。
扫VX 领Java资料,前端,测试,python等等资料都有
传输层#
这层为了解决 机器内部包的归属问题,提出了UDP 协议:
给每个程序 分配不同的 端口 号,引入 “第三个" 地址:端口号
其实就是每个程序 使用网卡 的编号而已
当然,我们的udp 协议也是 有标头、数据两个部分
与此同时 还有个ip 协议,这个说白了就是 有确认机制的udp 协议,这个点 我们基本都清楚,所以不详细说了,具体的可以百度查看。
到此,我们就解决了通信的问题,也就是数据从一个机器到另一个机器,然后另一个机器如何解读的问题。
但,但是,还有一个重要的问题:数据来源很杂的(email、ftp、www)不同的格式,我们没办法解读啊,这就相当于识别图片 /音源/文本的判断问题了(其实和 0,1 如何分组一样)
所以这就用到我们的应用层解决
应用层#
这层主要是识别 数据源,进行解码的,具体怎么做呢?制定协议、规范,编码按照规范编码,解码按照规范解码就行。
这层协议:
http:超文本
ftp:文件传输
smtp:邮件
当然http 也有 头+数据这样的格式
总结网络分层#
物理层 是解决传输 信号问题(0,1);
链路层是 解决物理层 谁来接收的问题(也是识别 谁发来信息,从而进行0,1 分组)--要站在接收方的角度想一下
传输层是 解决链路层 查找的问题(也算是优化)
网络层是 解决机器的 分包问题(到底数据是给哪个程序)
应用层是 解决数据的展示问题(图片还是文本)
这样我们模拟一下数据传输的具体路线:
本机传输到另一机器一张图片:
首先,通过http 协议,里面包含了 这是图片的信息(标头,识别标志);
数据传输到 传输层,TCP 标头里面加上本地 端口号(具体哪个程序);打包给网络层
在走到网络层(包含 本机ip/传送方ip(关于接收方ip 肯定之前就知道,不然你传给谁)),这里是arp 协议,由ip 拿到了对方的mac 地址等信息(也就是在这层知道给给谁传输的数据); 确定的链接,后面都是已经知道对方的地址了
ARP 协议怎么走的:
通过ip 区别出 网络(本网络还是 子网络(这个是子网掩码之类的,不再讲述)),
本网络:广播到本网络 对方 ip地址,和mac 地址( FF:FF:FF:FF:FF:FF)
非同一:路由方式找到对方网络(网关之间的链接),由网关 广播 ip 地址和 mac(这个基础是建立在网络中各个主机互相信任的基础上的)
非目标源丢弃,目标源 接收到信息,并记录下 发送方ip 和mac 地址放到缓存中,并且回复 发送方,自己的ip 和 mac 地址。
发送方接收到信息,放到缓存中,然后正式发送数据。
ARP数据具体的流转:
发送方:
网络层 包含 本机ip 和对方ip ;
向下给到 链路层,链路层添加 自己mac 和对方 mac 然后第一次链接不知道对方Mac (写成 FF:FF:FF:FF:FF:FF)包成以太网包;
物理层:数据发送,这次数据很小,相当于探测,所以本网络都发送一遍(本网络的机器都 物理层 都收到这个包);
对方:
物理层 解析出 0,1的包给到 传输层,链路 层进行 解析 ip 和mac 都不是自己的,丢弃包;
是自己的,记录并回复。
数据传输到链路层,这里在包裹上 我们的mac 地址,和对方mac地址(对方的mac 地址已经在ARP 中获取到了),在将数据包到 以太网 包中
然后在走到 物理层,这样物理层通过 0,1将数据发送出去。(ARP 之后就是确定地址传输了,不再是所有网络都发一次数据)
接收方:接到0,1 识别mac 地址,然后解码,找到对方ip 地址 和分包方式,在向上传输到 传输层,解析出对方接口号和 这层的分包方式,然后在向上 解读这是http 协议,解读标头,解读出这是图片,展示出来。
关于 web service 和 hessian
他们都是RPC 框架的一种,是在http/tcp 协议上(跨了一层或多层)的协议
Web service :
Soap:http传输协议+特定的xml
wsdl:文档说明书
Uddi: 发布服务会用到
Hession 是 二进制的传输协议,里面自己进行了序列化 和反 序列化。
扫VX 领Java资料,前端,测试,python等等资料都有