网络划分和各层协议以及webservice 浅谈
最近在公司做一些和其他外部系统接口调用的工作,遇到一些网络传输的问题,趁周末的时间记录、整理一下。
提到网络我们不得不提网络的分层架构:
我们通常听到 网络七层架构/五层架构/四层架构,但是不了解很容易被弄迷糊:什么是分层?这几层架构有何不同?我们为什么要分层?
不要着急,我们先来了解一下这七层、五层、四层 是什么有何区别:
- 七层:OSI开放式系统互联通信参考模型理念由ISO(国际标准化组织)提出,现有的理念标准,并没说具体实现,只是概念模型 osi;
- 四层:在实际中先使用,然后再有的理念 ;(实际生产中为了解决网络通信问题,大家不约而同的使用某种方式(四层)来解决问题,各个厂家在具体分层的细节不一样,为了统一规范,更加合理规范使用从而提出四层理念 )
- 五层:方便理解 七层 和 四层,由此提出五层作为中间理解的概念(通常是教学中才出现的叫法)
我们上面可以理解:七层、五层、四层的 各种叫法都是我们自己抽象出来的规范,具体的做事情是四层模型。
下面我们具体来看一下各个层具体是用来做了什么事情(我们这边为了方便理解,所以使用了五层结构):
物理层
解释:从字面看来就是我们实际接触到的实物层:电缆线、光缆线、无线电波等,是传输的基础;
作用:将信号(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地址;不一样 丢弃 包数据
图解:
到此,实现了网络之间 主机 与 主机 之间的通信了
但是有个新问题:一台机器,多个程序同时进行 网络 收/发 包,如何判断 包(数据)的归属?也就是说这个包到底归谁?
这是同一个机器内的问题。
由此我们引出 传输层的概念。
传输层
这层为了解决 机器内部包的归属问题,提出了UDP 协议:
给每个程序 分配不同的 端口 号,引入 “第三个" 地址:端口号
其实就是每个程序 使用网卡 的编号而已
当然,我们的udp 协议也是 有标头、数据两个部分
与此同时 还有个tcp协议,这个说白了就是 有确认机制的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 是 二进制的传输协议,里面自己进行了序列化 和反 序列化。
以上是自己理解的,如果有不对的地方,请各位大佬帮忙指正,在此感激不尽!!!
网络划分和各层协议以及webservice 浅谈的更多相关文章
- Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)
Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器 定义: ...
- Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理
Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博 ...
- 网络架构,七层协议,三次握手四次挥手,socket套接字简单编程
一.单机架构 应用领域: 植物大战僵尸 office 二.CS架构 应用领域: QQ 大型网络游戏 计算机发展初期用户去取数据,直接就去主机拿,从这里开始就分出了客户端和服务端. 客户端:用户安装的软 ...
- 网络之OSI七层协议模型、TCP/IP四层模型
13.OSI七层模型各层分别有哪些协议及它们的功能 在互联网中实际使用的是TCP/IP参考模型.实际存在的协议主要包括在:物理层.数据链路层.网络层.传输层和应用层.各协议也分别对应这5个层次而已. ...
- Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver
今日内容:socket网络编程 1.OSI七层协议 2.基于tcp协议的套接字通信 3.模拟ssh远程执行命令 4.tcp的粘包问题及解决方案 5.基于udp协议的套接字 ...
- 8.6 day27 网络编程 osi七层协议 Time模块补充知识 TCP协议
Time模块补充知识 date和datetime区别是什么? date 就是年月日 datetime就是年月时时分秒 以下代码为什么会报错? import json from datetime imp ...
- 软件开发架构与网络之OSI七层协议(五层)
本期内容概要 python回顾 软件开发架构 网络理论前瞻 osi七层协议(五层) 以太网协议 IP协议 port协议 交换机 路由器 局域网 广域网 TCP协议 三次握手 四次挥手 UDP协议 内容 ...
- 数据层的多租户浅谈(SAAS多租户数据库设计)
在上一篇“浅析多租户在 Java 平台和某些 PaaS 上的实现”中我们谈到了应用层面的多租户架构,涉及到 PaaS.JVM.OS 等,与之相应的是数据层也有多租户的支持. 数据层的多租户综述 多租户 ...
- [转载]数据层的多租户浅谈(SAAS多租户数据库设计)
原文:http://www.ibm.com/developerworks/cn/java/j-lo-dataMultitenant/index.html 在上一篇“浅析多租户在 Java 平台和某些 ...
随机推荐
- Shell脚本实现监视指定进程的运行状态
在之前的博客中,曾经写了自动化测试程序的实现方法,现在开发者需要知道被测试的进程(在此指运行在LINUX上的主进程的)在异常退出之前的进程的运行状态,例如内存的使用率.CPU的使用率等. 现用shel ...
- Hadoop生态圈学习-1(理论基础)
一.大数据技术产生的背景 1. 计算机和信息技术(尤其是移动互联网)的迅猛发展和普及,行业应用系统的规模迅速扩大(用户数量和应用场景,比如facebook.淘宝.微信.银联.12306等),行业应用所 ...
- 云原生应用管理,像管理手机APP一样管理企业应用
我们在使用智能手机的时候,手机APP从应用市场一键安装,安装好即点即用,当有新版本一键升级,如果不想用了长按图标删除,整个过程非常简单,小朋友都能熟练掌握.而对于企业应用,由于结构复杂.可用性要求高. ...
- Offset函数(Excel函数集团)
此处文章均为本妖原创,供下载.学习.探讨! 文章下载源是Office365国内版1Driver,如有链接问题请联系我. 请勿用于商业!谢谢 下载地址:https://officecommunity-m ...
- SpringCloud微服务实战——搭建企业级开发框架(三十四):SpringCloud + Docker + k8s实现微服务集群打包部署-Maven打包配置
SpringCloud微服务包含多个SpringBoot可运行的应用程序,在单应用程序下,版本发布时的打包部署还相对简单,当有多个应用程序的微服务发布部署时,原先的单应用程序部署方式就会显得复杂且 ...
- mysql使用自定义序列实现row_number功能
看了一些文章,终于知道该怎么在 mysql 里面实现 row_number() 排序 话不多说,show you the code: 第一步:建表: create table grades( `nam ...
- flexpaper上传带中文名字的文档,在页面显示若出现404错误时,请在server.xml文件中进行编码utf-8
flexpaper上传带中文名字的文档,在页面显示若出现404错误时,请在server.xml文件中进行编码utf-8
- libevent源码学习(6):事件处理基础——event_base的创建
目录前言创建默认的event_baseevent_base的配置event_config结构体创建自定义event_base--event_base_new_with_config禁用(避免使用)某一 ...
- Springcloud(二) feign
Feign Spring Cloud Feign对 Ribbon 负载均衡.Hystrix 服务熔断进行简化,在其基础上进行了进一步的封装,不仅在配置上大大简化了开发工作,同时还提供了一种声明式的 W ...
- flink使用命令开始、停止任务
命令操作 进行flink的安装目录 动态上传jar包启动job ./bin/flink run -c com.test.CountMain -P 3 Test-1. 0-SNAPSHOT.jar -- ...