网络划分和各层协议以及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 平台和某些 ...
随机推荐
- celery开启worker报错django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE o
其实挺简单的问题,但花了自己一个下午来解决,先是浏览各种博客,无果:没办法,然后去看celery官方文档,无果,近乎绝望,最后仔细看代码,找到问题所在(如下),自学狗这效率...... 下面是自己ta ...
- OpenStack之八: network服务(端口9696)
注意此处用的一个网络,暂时不用启动第二个网官网地址 https://docs.openstack.org/neutron/stein/install/controller-install-rdo.ht ...
- OpenStack之二: 安装OpenStack的yum源及相关组件
#: 在所有节点执行 [root@localhost ~]# yum install centos-release-openstack-stein -y #: 安装相关组件(只在管理端和计算几点安装) ...
- linux下把一个用户从某个组中删除,而不删除用户
查看当前用户/登录用户 基本语法 whoami / who am I 用户组 介绍 类似于角色,系统可以对有共性的多个用户进行统一的管理. 新增组 语法 groupadd 组名 案例演示 添加test ...
- idea集成开发工具快捷键大全
1 执行(run) alt+r 2 提示补全 (Class Name Completion) ...
- Go语言核心36讲(Go语言实战与应用二十四)--学习笔记
46 | 访问网络服务 前导内容:socket 与 IPC 人们常常会使用 Go 语言去编写网络程序(当然了,这方面也是 Go 语言最为擅长的事情).说到网络编程,我们就不得不提及 socket. s ...
- CURD系统怎么做出技术含量惊艳面试官
在<CURD系统怎么做出技术含量--怎样引导面试>有朋友开玩笑说都用上了领域驱动了,就不叫CURD系统了吧.这里我解释一下,怕大家对DDD领域驱动设计有什么误解. DDD是为解决软件复杂性 ...
- Linux的命令行基础
1.对于全局配置文件和用户配置文件的认识 全局配置都存储在etc目录下,如/etc/profile文件,/etc/bashrc文件以及/etc/profile.d/目录下的.sh文件 用户配置都存储在 ...
- Java(变量和常量)
变量 可以变化的量.可以通过变量来操控内存中的数据:变量可以指代的是内存中的一块空间,而这块空间的位置是确定的但里边要放什么东西还不确定. Java是强类型语言,每个变量都要声明其类型. Java变量 ...
- ThreadLocal的使用方法
ThreadLocal的使用方法 (2011-10-10 22:05:48) 转载▼ 概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个 ...

