网络为什么分层?

作者:无名 - 其它综合 -

在自然世界中,分层无处不在。大到社会阶层,小到细胞层次结构。

为什么会这样?因为复杂的事物组成复杂,完成的功能复杂,把所有的步骤都放到一个层次处理,那么这一层就会变得越来越复杂,耦合度非常高,不容易理解和对事物的解剖,就不能分析出事物的规律。

分层需要分得对。层次间的分界线虽然无须有非常清晰的界限,但一定要有内在的层次划分根据。

对于软件世界来说,某大牛(太大大牛,记不住是谁了)说过,在计算机领域,任何问题到了某个复杂的阶段,如果当前方法不能解决问题,必定可以通过加多一层来解决,如果加多一层都解决不了问题,那肯定是这个问题模型的层次已经到极限了。

通过这句话可以理解到,在计算机领域,任何问题都可以通过中间层来解决问题,现在的中间件如此就行,就是为了适应当前的快速开发和微服务架构吧。

在网络协议中的分层。不仅仅是根据负责的功能来简单的划分层次,而且层与层之间会有不可缺少的的封装与传递。对于网络模型各层的封装是根据整个网络模型从上到下的工作流程来划分的。但是,每层之间会有一定的联系,不是独立工作的。

在这里以熟悉的协议 tcp协议 分析。对于网络从上到下的流程为 应用层的网络请求经过传输层加上tcp头,经过网络层加上端口号和ip源地址和目的地址等信息,经过数据链路层加上mac头。

通过层层的封装,得到一个完整的网络包。注意:在网络中,网络包都是完整的,可以没有上层只有下层,但一定不能有下层而没有上层。这样会破坏了网络协议层从上到下的完整性。

到这里,应该可以知道,网络为什么要分层了。这是从功能需求划分,协议维护与方便升级,降低网络通信复杂性出发考虑,可以毫不客气的下定义,只有把网络分层,才会有如今的互联网繁荣世界。

上面是说了网络为什么分层,在这里我提出一个问题,为什么需要mac地址,只有ip地址可以吗?

这个问题可以得到网络层次间的联系。举个栗子,在现实世界中,在虚拟定义中,身份证号码是一个人的唯一标识(正常来说,一个人只有唯一的身份证号码吧)。如果我要邮寄一封信给另外一个人,但我只填写他的身份证号码在信封上。这样要怎么把信送到那个人手上?

假设一,各个邮局之间是有联系,并且存储下当地所有身份证对应的人的身份证地址。

那么可以这样做,在邮局的qq群吼一声,帮我查下这个身份证前几位是哪里的,然后各个邮局就开始查找,然后查到这个身份证是符合自己这个地方的。就回一声,是我这里,然后就把信根据身份证号码送过去,在整个地区吼一声,这个身份证是谁的?只能这样做啊,因为身份证号码前几位只能确定到一个地区。这样做效率就很低,或者根本找不到这个人,因为身份证上的信息只是出生当时记录下的地址而已。

在这里,引出了一个概念,相对性,身份证虽然具有唯一性,但是记录的地址是不变的,然后人是可移动的,所在地址是会变的,所以根据身份证找一个人的具体地址是不正确的。

所以在网络协议中,单单有mac地址,没有ip地址信息是不科学的。

解决上面问题的办法是,在寄信时应该加多一个信息,这个人现在的具体地址。类比网络协议,就是在mac之余增加ip。

ip地址是这个网络包的来源和去向的具体地址,当然真实用到的有公有ip和私有ip,网络包在局域网出去时经过路由转换为公有ip,然后就可以在网络世界中畅游,找到对应的目的地公有ip,然后才根据mac地址来确定唯一的目的地机器。

至此,网络的分层和联系告一段落。。。

网络为什么分层?

原文地址:https://www.cnblogs.com/liangjf/p/9822402.html

这篇内容就是由IT人知识库 小编为各位整理 原文链接:http://www.itpeo.net/9999/4539834.html





mysql数据增删改的总结

一、在mysql管理软件中,可以通过sql语句中的dml语言来实现数据的操作,包括1.使用insert实现数据的插入2. ...

linuxdmesg查看系统故障信息

dmesg 可以查看linux 内核信息 dmesg’命令设备故障的诊断是非常重要的。在‘dmesg’命令的帮助下进 ...

企业级SpringBoot教程(八)springboot整合mongodb

准备工作 安装 mongodb jdk 1.8 maven 3.0 idea 环境依赖 在pom文件引入spring ...

关于pytorch在windows上编辑的问题集合

cmake在windows上自动寻找v140(vs2015)的编译器,现在只有vs2013的ide,所以要修改编译器 修 ...

macos使用pyenv管理python多版本

1 安装pyenv brew install pyenv 2配置~/bash_profile export py ...

linux内存不足,swap交换分区创建

为什么需要swap 根 据redhat公司的建议,linux系统swap分区最适合的大小是物理内存的1-2倍.不过lin ...

科学计数问题解决

bigdecimaldb=newbigdecimal(transmoeny); system.out.println( ...

babel-preset-es2015,babel-polyfill与babel-plugin-transform-runtime

babel-preset-es2015 是一个babel的插件,用于将部分es6 语法转换为es5 语法。转换的语法包括 ...

一、javaSE(十七)set集合、Collection集合、针对Collection集合我们到底使用谁、在集合中常见的数据结构

1:set集合(理解) (1)set集合的特点 无序,唯一 (2) hashset集合(掌握) a:底层数据结构 ...

康托展开与康托展开的逆运算

康托展开用来求数组是该全排列的第几项,康托展开的逆运用用于求全排列的第几个排列。已知对于1-n个数的全排列,总共的可能 ...

第八天:错误异常处理

错误类型 1、语法错误 syntaxerror:代码拼写出错 attributeerror:属性异常 try: ...

Python_re模块

一、re简介   正则表达式是一种对字符串(包括普通字符、非打印字符、通用字符(称为原子)、特殊字符(称为元字符))操作 ...

C#基础篇之语言和框架介绍

1.如何描述c#和.net的关系? .net的是平台,c#是为了微软公司为了.net平台开发的面向对象语言。 2.c# ...

golang基础学习-strings包常用函数学习

package main import ( "fmt" "strings" ) //strfunc 字符串说明 ...

Leetcode672.灯泡开关II

灯泡开关ii 现有一个房间,墙上挂有n只已经打开的灯泡和 4 个按钮。在进行了m次未知操作后,你需要返回这n只灯泡可能有 ...

vue中的ref,refs使用

使用elementui时,tree遇到的坑 1、发现,this.$refs每次都是undefined; 问题原因:渲染组 ...

EffectiveJavaP2CreatingandDestroyingObjects

this chapter concerns creating and destorying objects : wh ...

wepy小程序入门和项目初始化

前言: wepy小程序项目初始化的操作,官方文档看了好几遍,感觉写得不是很清楚。 这篇写得挺好的:小程序开发之wepy ...

docker部署nginx服务器

1,下载nginx镜像 docker pull nginx 2,启动 docker run --name runo ...

Markdown:Syntax

markdown: syntax main basics syntax license ...