任何系统之间,如果需要通信,都需要一套自己的协议系统。这个协议系统一般要定义互相通信的语言,以及硬件。

OSI是被提取抽象出来的系统间通信模型,中文意思是“开放式系统互联”,是描述多个系统之间交流的通用模型。

OSI模型

OSI初步

在讲OSI之间,我们首先看一个例子,PC a向PC b发送数据包的过程如下:

  • a在内存中通过定义的语言生成数据包
  • 将数据包通过总线传给TCP/IP协议处理单元,告诉对方的IP地址、UDP还是TCP、端口号
  • TCP/IP处理模块收到包之后,封装,通过总线发送给以太网卡
  • 以太网卡再进行编码,变成高低电平震荡发给交换机
  • 交换机将数据包交换到b的接口
  • b输送到以太网卡的解码芯片,去掉以太网头然后产生中断,将数据包送到内存
  • TCP/IP处理模块提取IP头和TCP头,以便区分应该输送到哪个应用程序的缓冲区内存。
  • 送到b的应用程序缓冲区内存

可以发现里面最重要的就是三个元素

  • 连:通信双方需要连通起来。
  • 找:指的是通信双方必须能区分自己和对方。
  • 发:定义了如何将数据发到对方。

OSI的七个层次

OSI模型将系统通信划分为了7个层次,最上面的三个层次可以归属到应用层。这个层不需要关心如何将数据传送到对方,只关心如何组织和表达数据。

应用层

应用层是OSI的最上层,表示一个系统对另一个系统要传达的最终消息。

只关注数据, 不关注指令如何发送

表示层

表示层就是对应用层数据的一种表示。

发送方必须用双方规定好的格式来表示信息:可以嵌入在实体数据中。

会话层

会话层:建立会话交互机制。实际是双方的应用程序之间的交互。

应用层、表示层、会话层的数据内容都被封装起来,交给押运员传输层

TCP/IP只有4层:应用层、传输层、网络层、物理链路层,它将OSI的应用层、表示层、会话层合并为一层,即应用访问层。意思是这个层全部与应用程序相关的逻辑,与网络通信无关。应用程序只需要调用下层的接口就可以完成通信。

下四层的作用是把上三层的数据成功送到目的地。

传输层

典型的传输层程序如下:

  • TCP协议的作用是保证上层数据能传输到目的地。类似货运公司的押运员,不管通过什么渠道(直达还是下一跳),不管物理链路的类型,只要送到即可。
  • 如果出现错误,需要重新发送。每件货物到了目的地必须找收件人签字(TCP的ACK应答包)或者一批货物到了以后一次性签收。(滑动窗口
  • 最后回公司登记

TCP主要处理拥塞和流量控制。路由器是调度中心,它可以决定走哪条路。TCP不能调度,它只是在发生了拥挤就只能通知后续的货物慢点发。如果道路畅通,则通知后面的货物加速发送。

那么TCP是怎么知道链路是否拥塞呢?它可以通过接收方返回的ACK应答来判断链路拥挤的。如果半天都没收到对方的签字,说明拥塞,有丢失

** 传输层的程序一定运行在通信双方的终端设备上。**而不是在中间的互联设备上。

因为传输层是一种端到端的保障机制,必须保证成功收到了并成功处理数据,才算发送成功了。如果只到了对方的网卡,但是断电了,也不叫端到端保障。

具体的可以再看从输入网址到浏览器返回内容(二),TCP/IP篇

网络层

上面说到了传输层其实只是一个押运员,它并不能进行调度,那么如何选路就交给了网络层。

同样以客户寄货物为例,当客户把货物交给货运公司的时候,会填写目的地址,至于应该走哪条路,统统不管,全部交给网络层处理。

  • 货运公司为每件货物贴上IP头地址标签
  • 货运公司掌握了全球范围的地址信息(路由表
  • 选择了一条路就上路。
  • 货物每中转到一个地方就交给那个地方的调度,由调度来决定下一站到哪里。
  • 旧调度不必告诉新调度最终的目的怎么走,因为所有调度都知道最终的目的。

总结一下就是,客户寄送货物的时候需要给出最终的目的地址,不管这个货物途径哪个中转站,所有的中转站都会知道最终的目的地址。

比如,要从新疆将货物寄到青岛,但是新疆到青岛没有直到的火车,所以只能去北京转出。

那么新疆的调度会去查找路由表,发现必须先到北京。注意此时在货物上贴上的还是青岛的标签,而不是北京的标签,但是会将货物发到去北京的火车上。

货物到北京,查看最终的目的地,会查找北京调度中心的路由表,此路由表与新疆的表不同。于是将货物送到去青岛的火车。

可以看出** 路由器就是调度的角色**

比如从青岛访问北京的服务器,具体步骤如下:

  • 首先必须知道服务器的IP地址,用这个IP地址作为最终目的地址组装成数据包,发送给青岛的Internet提供商(下面叫运营商)的路由器
  • 运营商的路由器解析目的IP地址,发现应该从1号端口发送出,于是发到了河北的另一台路由器。
  • 河北路由器根据目的IP查找路由表,发现需要从8口出
  • 多次中转以后,发到了北京的路由器。
  • 最终到了北京的服务器,将这个包传送到这台服务器的网卡,并提交到TCP/IP协议处理的内存空间。
  • 发现是一个TCP握手数据包,所以返回一个确认包,三次握手完成后,就可以向服务器发送HTTP请求来获取网页资源。

在中转的过程中,目的IP并不会改变,改变的只是MAC地址,也就是说会将MAC地址改为下一站的地址。

数据链路层

数据链路层:连通两个设备之间的链路,将上层的数据包再次打包成对应链路特定的格式。按照对应链路的规则在链路上传输给对方。

数据链路就好比交通规则:上路之前还需要看公路的质量怎么样,和对方商量传输的事宜。

链路层的作用:

  • 协商链路参数:双工、速率、链路质量
  • 打包成,加上同步头,一次传输一句或者一个字符一个字符(取决于上层的选择)
  • 链路层程序调用物理层提供的接口,将帧交给物理层。
  • 提供一些保障机制,在每个帧之后加一个校验字段。如果不符说明链路干扰,直接丢弃,不过不会报告错误,因为上层对链路层的错误不关心。接收方的传输层会感知某个包没有到达,重新传送不完整的包。链路层只侦错,不纠错。

两台PC之间的通信和两个路由器之间通信是有区别的。

路由间的通信:

简单的路由设备工作在OSI的第三层,即网络层,没有上4层的处理逻辑。

所以收到包之后,只检查包中的IP地址,不改变IP头之上的其他内容。

如果有NAT功能的路由器,会对IP包的源或者目的IP地址做修改

下图为通信路径上各个设备所作用的层次示意图:

  • PC A上的浏览器要访问PC B上的Web服务,首先调用WinSock接口,访问OS内核中的TCP/IP协议栈,将目的IP和目的端口以及数据(HTTP GET请求)告诉TCP/IP协议栈
  • 协议栈发现与PC B不存在链接,所以通过三次握手与B的协议栈建立连接。(A的协议栈组装第一次握手包,发给OS的内核缓冲区,调用网卡驱动从缓冲区将IP包编码并传递出去,因为握手包很小,所以只需要一个帧。)
  • 帧到达路由器A的缓冲区,产生中断信号,去掉以太网头,发送到路由器A的内存,等待IP转发逻辑块处理(IP路由协议计算模块),分析出IP包的头部目的IP地址,查找路由表确定出去的端口号,所以IP路由运算一定要高效。
  • 查找出后,从网卡2出发送到路由器B的网卡2.通过同样的过程,发送到PC B的网卡缓冲区,网卡产生中断,通过总线传送到TCP/IP的协议栈缓冲区内存。
  • PC B的协议栈分析出IP是自己的,端口号是80,同时握手标识位是二进制1,就知道是从源设备向Web服务程序所监听的端口发起的握手连接。所以回复IP包给PC A,PC A再回一个最终确认的包。
  • 握手成功,PC A的协议栈将缓冲区中有浏览器发送过来的HTTP GET请求数据组装成TCP/IP数据包发送给PC B。PC B获得数据包之后,分析TCP 端口号,根据对应关系将数据放到监听这个端口的应用程序的缓冲区内存。
  • 应用程序收到GET请求后,触发Web服务逻辑流程,返回Web数据。同样由B的协议栈发送给PC机 A

未收到确认的包会放到缓冲区中,不会删除,直到收到对方的确认。

所以即使中途的设备把包丢弃了,运行在两端的TCP/IP协议依然会重传,这就是端到端的保障,因为设备中途网络设备不会缓存发送的数据,更不会自动重传。

现在我们来对比一下IP头和TCP头的区别:

  • IP头是个标签,用来查看是谁发的货物。
  • TCP头是用来确认由哪个上层应用程序来处理收到的包。(用端口号来决定)

物理层

物理层:在一种介质上将数据编码发送给对方。

注意链路层是控制物理层的。

我们可以把物理层看做传送带,不会进行货物分批,所以需要链路层给每批货物加标志性的头,接收方看到标志了以后就知道新一批货物来了。

经过物理层编码后,最终变成了一串bit流。通过电路振荡传输给对方,收到bit流之后,提交给链路层程序,剥去链路层同步头、帧头帧尾、控制字符。

MTU ,最大传输单元:每种链路都有自己最合适的分批大小

如果一次传输传送大于这个大小的货物,超过了链路接收放的处理吞吐量,会造成缓冲区溢出。

不过TCP和IP协议都会给货物分批。TCP会首先给货物分批,到了IP层,会按照链路层的分批大小来进行分批,如果TCP的分批大小已经小于链路层的分批,不会再分。

被IP层分批的货物,最终会由接受方的IP层再组装,但是由TCP分批的货物,接收方的TCP层不会合并。对货物的处理分析全部交由上层的应用程序来处理

转载于:https://www.cnblogs.com/dy2903/p/8422587.html

【大话存储】学习笔记(7章), OSI模型相关推荐

  1. 大话存储学习笔记(4)

    七.逻辑卷管理 逻辑卷管理(简称LVM),是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层. 通过LVM管理可以轻松管理磁盘分区,如:若干个磁盘分区连接为一整块 ...

  2. 小吴的《机器学习 周志华》学习笔记 第二章 模型评估与选择

    小吴的<机器学习 周志华>学习笔记 第二章 模型评估与选择 上一周我们介绍了第一章的基础概念,这一次将带来第二章的前三节.后面的2.4 比较检验与2.5 偏差与方差,涉及概率论与数理统计概 ...

  3. CUDA学习笔记之 CUDA存储器模型

    CUDA学习笔记之 CUDA存储器模型 标签: cuda存储bindingcache编程api 2010-12-14 01:33 1223人阅读 评论(0) 收藏 举报 分类: CUDA(26) GP ...

  4. 《Go语言圣经》学习笔记 第九章 基于共享变量的并发

    <Go语言圣经>学习笔记 第九章 基于共享变量的并发 目录 竞争条件 sync.Mutex互斥锁 syn.RWMutex读写锁 内存同步 syn.Once初始化 竞争条件检测 示例:并发的 ...

  5. 《Go语言圣经》学习笔记 第二章 程序结构

    Go语言圣经学习笔记 第二章 程序结构 目录 命名 声明 变量 赋值 类型 包和文件 作用域 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记,几乎是书上的内 ...

  6. 《Go语言圣经》学习笔记 第一章 Go语言入门

    Go语言圣经学习笔记 第一章 Go语言入门 目录 Hello, World 命令行参数 查找重复的行 GIF动画 获取URL 并发获取多个URL Web服务 本章要点 注:学习<Go语言圣经&g ...

  7. Python数据挖掘学习笔记】九.回归模型LinearRegression简单分析氧化物数据

    #2018-03-23 16:26:20 March Friday the 12 week, the 082 day SZ SSMR [Python数据挖掘学习笔记]九.回归模型LinearRegre ...

  8. [go学习笔记.第一章] go可以做什么

    go可以做什么,go有以下三大学习方向: Golang的应用领域 1.区块链应用 区块链技术,简称BT(Blockchain technology),也被称之为分布式账本技术,是一种互联网数据库技术, ...

  9. 小吴的《机器学习 周志华》学习笔记 第一章 绪论

    小吴的<机器学习 周志华>学习笔记 第一章 绪论 近一年时间接触到不少机器学习的知识,虽然断断续续学了一些,总感觉还没有入门(只学会了疯狂调包).因此,最近开始系统学习Machine Le ...

  10. 计算机网络学习笔记---第一章

    计算机网络学习笔记 第一章 文章目录 计算机网络学习笔记 第一章 前言 一.计算机网络的概念 (一)计算机网络的功能 1.数据通信(连通性) 2.资源共享(硬件 软件 数据) 3.分布式处理 (Had ...

最新文章

  1. 悟道·文澜详解:目前最大的中文多模态通用预训练模型
  2. 互联网协议 — PPP 点对点协议
  3. java中什么是类型_什么是Java中基本数据类型?
  4. 3.4 svm人脸识别
  5. Objective-C代码学习大纲
  6. 程序员最爱用 Emacs 写 Python、Bash,调研了 7300 位开发者有这些发现
  7. unity 打开项目路径无效_unity3d建立的文件有中文路径,现在新建了项目打不开了...
  8. php变量存储过程,php - 从存储过程调用返回的变量作为用于可变的输出值 - SO中文参考 - www.soinside.com...
  9. axure数据报表元件库_axure图表元件库 axure教程:如何制作axure组件库
  10. 【答题游戏】最强王者--小游戏开发解析
  11. SSID的使用和中文设置
  12. Reflector使用详解
  13. 1、STM32通过软件IIC连接ADXL345(ADXL345使用遇到的一些坑)
  14. Vite:Error: Cannot find module ‘worker_threads‘
  15. php利用phpqrcode生成二维码,并将二维码盖在一张图上实现美化
  16. 和USB网络线有关的资料和我遇到的一些问题及解决
  17. CHAP MS-CHAPv2 EAP
  18. 爬虫B站任意视频 弹幕文字+时间
  19. 【数据挖掘】天池挑战赛 新闻推荐
  20. java 正则表达式 电话_Java使用正则表达式验证手机号和电话号码的方法

热门文章

  1. 数据库原理 知识点总结
  2. Android中文API (60) —— DatePicker.OnDateChangedListener
  3. 一本通 1282:最大子矩阵
  4. sublime重装后碰到Unable to read Packages
  5. Failed to connect to driver at XXXXXXx
  6. 淘宝Django书籍调研
  7. 哑编码官方代码自己的注解
  8. hexo的yelee主题本地搜索故障
  9. 安装sqoop以后,hive中的info信息无法禁止的问题解决
  10. Master PDF editor在ubuntu下面的配置