最近在公司做一些和其他外部系统接口调用的工作,遇到一些网络传输的问题,趁周末的时间记录、整理一下。

提到网络我们不得不提网络的分层架构:

我们通常听到 网络七层架构/五层架构/四层架构,但是不了解很容易被弄迷糊:什么是分层?这几层架构有何不同?我们为什么要分层?

不要着急,我们先来了解一下这七层、五层、四层 是什么有何区别:

  1. 七层:OSI开放式系统互联通信参考模型理念由ISO(国际标准化组织)提出,现有的理念标准,并没说具体实现,只是概念模型 osi;
  2. 四层:在实际中先使用,然后再有的理念 ;(实际生产中为了解决网络通信问题,大家不约而同的使用某种方式(四层)来解决问题,各个厂家在具体分层的细节不一样,为了统一规范,更加合理规范使用从而提出四层理念 )
  3. 五层:方便理解 七层 和 四层,由此提出五层作为中间理解的概念(通常是教学中才出现的叫法)

我们上面可以理解:七层、五层、四层的 各种叫法都是我们自己抽象出来的规范,具体的做事情是四层模型。

下面我们具体来看一下各个层具体是用来做了什么事情(我们这边为了方便理解,所以使用了五层结构):

物理层

解释:从字面看来就是我们实际接触到的实物层:电缆线、光缆线、无线电波等,是传输的基础;

作用:将信号(0,1)由一端 传输到 另一端 ,具体形式是二进制(0,1)。

例子:电信号可以将电压不同作为 0,1 的表示;无线电波以波长作为 0,1 的表示……

说白了其实就是做为传输信号的载体而已。

但是由此引出来一个问题:

信号可以传递过去,但是对方 面对一堆0,1信号,怎么去理解,也就是如何去划分?(单纯的0,1 是没有意义的,重要的是如何进行解读?)

各个厂家都有一套自己的规范(也就是0,1分组的方式不一样),同一厂家的机器进行通信是没有问题的,但是如果不通厂家的话还需要进行转换,一个不小心就容易造成分组错误,导致传递的意思发生改变。这也就急需一个方案来具体解决厂商之间的通信问题(解决物理层解决不了的问题)。

设计这种规范问题,都是这层解决不了,在前面加一层去解决,我们在物理层前面加一层去规范各个厂商的通信问题不就行了。这就引出-->链路层

链路层

为了解决物理层问题,在链路层,我们提出了划分数据的规范:以太网协议

以太网协议:

  1. 一组数据(多个0,1)需要构成一个数据包:叫做 :解决数据识别的问题。

  2. 这个数据包的形式包含 标头数据

  1. 标头包含 发送者/接收者 的信息,从而来进行解释划分

  2. 所有接入网络的设备必须要有 网卡 数据的真实流向其实是从 一端 网卡 =》 另一 网卡

网卡:

网卡就是各个厂商 自己去分组解释 二进制数据的。

网卡:由48位二进制/12个6进制 (前6个数字是厂商编码,后6个是该厂商的流水号)组成,这就是网卡的 mac 地址

Mac 地址是独一无二的。

好了,现在我们解决了物理层数据的划分问题,现在又出现了两个新问题:

1、发送者是自己,怎么知道对方的 mac 地址呢? ARP协议,这个稍后解释

2、有了双方的MAC地址,系统如何准确将包送到对方

对于第2个问题解决方案:使用广播:

向本网络内所有机器发送数据(此时标头:(发送者mac\接收者mac))由所有的机器自己判断是/否接受数据

但是 这个只能是本网络 ,是需要将所有的机器都连到一个网络上的?

可是这样我们想象一下:一个机器发送数据,所有的机器都要接受到数据,这是灾难性的(数据传输会很大,并发问题)

从而我们提出 划分子网的概念,但是子网怎么半?(子网是找不到mac地址的),所以我们不得不去解决 mac 地址问题,从而在往前加一层(网络层)

网络层

这层我们是用来解决 链路层 提出以太网协议 中 网卡mac 地址 寻找的问题(就是 标头中 怎么找到对方信息)。

这好办啊,我们在加一个地址,也就是给mac地址,在绑定一个地址,以此区分是不是同一个网络:

  1. 是同一网络:广播 查找
  2. 不是同一网络:路由(新地址的查找)

新地址就是ip 协议:

IP协议

  1. 32 个 2 进制;
  2. ip 和 以太网 协议一样,也是包含 标头 和 数据两部分;
  3. 标头包含 本机 ip 地址,和 接收方 ip 地址。
  4. Ip 包在 以太网 数据包的 “数据”里

(这点可能有点绕,解释一下为啥是包在 以太网的 数据包里 :我们从 上层拿到数据,然后包到 ip 数据包里,然后ip包给了 以太网,以太网 只认 以太网的标头包,只有解析出 才能得到 ip 包的数据,从而找到 对方以太网地址)

好了,我们整理一下,目前我们有两个地址

  1. mac 地址:主要解决厂商之间通信兼容问题;
  2. 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 浅谈的更多相关文章

  1. Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)

    Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器    定义:       ...

  2. Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理

    Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博 ...

  3. 网络架构,七层协议,三次握手四次挥手,socket套接字简单编程

    一.单机架构 应用领域: 植物大战僵尸 office 二.CS架构 应用领域: QQ 大型网络游戏 计算机发展初期用户去取数据,直接就去主机拿,从这里开始就分出了客户端和服务端. 客户端:用户安装的软 ...

  4. 网络之OSI七层协议模型、TCP/IP四层模型

    13.OSI七层模型各层分别有哪些协议及它们的功能 在互联网中实际使用的是TCP/IP参考模型.实际存在的协议主要包括在:物理层.数据链路层.网络层.传输层和应用层.各协议也分别对应这5个层次而已. ...

  5. Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver

    今日内容:socket网络编程    1.OSI七层协议    2.基于tcp协议的套接字通信    3.模拟ssh远程执行命令    4.tcp的粘包问题及解决方案    5.基于udp协议的套接字 ...

  6. 8.6 day27 网络编程 osi七层协议 Time模块补充知识 TCP协议

    Time模块补充知识 date和datetime区别是什么? date 就是年月日 datetime就是年月时时分秒 以下代码为什么会报错? import json from datetime imp ...

  7. 软件开发架构与网络之OSI七层协议(五层)

    本期内容概要 python回顾 软件开发架构 网络理论前瞻 osi七层协议(五层) 以太网协议 IP协议 port协议 交换机 路由器 局域网 广域网 TCP协议 三次握手 四次挥手 UDP协议 内容 ...

  8. 数据层的多租户浅谈(SAAS多租户数据库设计)

    在上一篇“浅析多租户在 Java 平台和某些 PaaS 上的实现”中我们谈到了应用层面的多租户架构,涉及到 PaaS.JVM.OS 等,与之相应的是数据层也有多租户的支持. 数据层的多租户综述 多租户 ...

  9. [转载]数据层的多租户浅谈(SAAS多租户数据库设计)

    原文:http://www.ibm.com/developerworks/cn/java/j-lo-dataMultitenant/index.html 在上一篇“浅析多租户在 Java 平台和某些 ...

随机推荐

  1. Shell脚本实现监视指定进程的运行状态

    在之前的博客中,曾经写了自动化测试程序的实现方法,现在开发者需要知道被测试的进程(在此指运行在LINUX上的主进程的)在异常退出之前的进程的运行状态,例如内存的使用率.CPU的使用率等. 现用shel ...

  2. Hadoop生态圈学习-1(理论基础)

    一.大数据技术产生的背景 1. 计算机和信息技术(尤其是移动互联网)的迅猛发展和普及,行业应用系统的规模迅速扩大(用户数量和应用场景,比如facebook.淘宝.微信.银联.12306等),行业应用所 ...

  3. 云原生应用管理,像管理手机APP一样管理企业应用

    我们在使用智能手机的时候,手机APP从应用市场一键安装,安装好即点即用,当有新版本一键升级,如果不想用了长按图标删除,整个过程非常简单,小朋友都能熟练掌握.而对于企业应用,由于结构复杂.可用性要求高. ...

  4. Offset函数(Excel函数集团)

    此处文章均为本妖原创,供下载.学习.探讨! 文章下载源是Office365国内版1Driver,如有链接问题请联系我. 请勿用于商业!谢谢 下载地址:https://officecommunity-m ...

  5. SpringCloud微服务实战——搭建企业级开发框架(三十四):SpringCloud + Docker + k8s实现微服务集群打包部署-Maven打包配置

      SpringCloud微服务包含多个SpringBoot可运行的应用程序,在单应用程序下,版本发布时的打包部署还相对简单,当有多个应用程序的微服务发布部署时,原先的单应用程序部署方式就会显得复杂且 ...

  6. mysql使用自定义序列实现row_number功能

    看了一些文章,终于知道该怎么在 mysql 里面实现 row_number() 排序 话不多说,show you the code: 第一步:建表: create table grades( `nam ...

  7. flexpaper上传带中文名字的文档,在页面显示若出现404错误时,请在server.xml文件中进行编码utf-8

    flexpaper上传带中文名字的文档,在页面显示若出现404错误时,请在server.xml文件中进行编码utf-8

  8. libevent源码学习(6):事件处理基础——event_base的创建

    目录前言创建默认的event_baseevent_base的配置event_config结构体创建自定义event_base--event_base_new_with_config禁用(避免使用)某一 ...

  9. Springcloud(二) feign

    Feign Spring Cloud Feign对 Ribbon 负载均衡.Hystrix 服务熔断进行简化,在其基础上进行了进一步的封装,不仅在配置上大大简化了开发工作,同时还提供了一种声明式的 W ...

  10. flink使用命令开始、停止任务

    命令操作 进行flink的安装目录 动态上传jar包启动job ./bin/flink run -c com.test.CountMain -P 3 Test-1. 0-SNAPSHOT.jar -- ...