网络传输是怎么工作的 -- 详解 OSI 模型

2020-08-08 18:08:19   最后更新: 2020-08-08 18:08:19   访问数量:230




公众号收到私信,希望我写一篇关于计算机网络是如何传输的文章,既然如此,本文就来详细说一说

事实上,此前我们介绍过 OSI 模型,介绍过 TCP/IP 协议族,其实已经包含了计算机传输的内容

OSI模型

TCP/IP 协议族简介

 

但这样框架性的介绍毕竟较为粗略,本文,我们就来详细介绍一下计算机网络究竟是如何工作的

 

 

计算机硬件是不同厂商生产制造的,运行在计算机硬件之上的计算机操作系统又有着 unix、windows、macos、linux 等等,而在操作系统之上,又有着千千万万的软件服务提供商制造的应用软件和服务,如何让他们能够互相通信,而不出现“鸡同鸭讲”的情况呢?

这个时候,我们就需要制订一套规范化的协议来约束整个计算机体系内的每一环节,让他们能够用相互可以理解的“语言”进行交流,这就是网络协议所做的事情

但整个计算机体系内充满了丰富的细节,我们必须对大量的通信协议进行抽象、分类和管理,同时,计算机的设计中有着明确的分工和依赖关系,因此,1984 年,国际标准化组织提出了 OSI 七层模型,用来规范计算机的网络通信

 

 

每一层实际上都是一个协议包,包含了很多协议

 

我们平常所熟知的 http、telnet、pop3、imap、stmp、ftp、dhcp 等等这些协议都是应用层协议

每一个协议,都有着他们自己独特的标识,同时也有着各自独特的数据解析方式,例如,当我们在浏览器中输入网址,浏览器就会根据 http 协议规定的格式将网址和其他一系列数据进行封装,生成一个 http 帧,以目前最常用的 HTTP1.1 协议来说,http 帧具体包含了请求行、header、空行和 body,具体可以参看:

HTTP 协议简介

 

总之,应用层协议是用户操作的计算机应用直接使用的协议,在这些协议的框架内,应用程序产生了仅与应用程序的工作有关的数据

 

应用程序生产应用数据后,还有一些必要的事情要做,这就是表示层和会话层协议所描述的

表示层主要做了下面三件事:

  1. 翻译 -- 将应用层数据格式转化为通用数据格式,例如 IBM 使用的是 EBCDIC 编码的数据,而其他计算机都是使用 ASCII 编码,这就需要进行翻译
  2. 数据压缩与解压缩 -- 为了便于接下来的网络传输,对于大的图片、音频、视频等等数据,他们体积过大传输困难,会非常影响用户体验,因此需要进行数据压缩,而接收方则需要进行数据解压缩,从而节省网络传输过程中的资源占用,优化用户体验
  3. 加密与解密 -- 基于上面的例子,如果浏览器访问的是 https 网站,浏览器还会按照 ssl 协议通过对应的公钥对信息进行加密,而获取到数据的应用,则需要凭借自身的私钥对数据进行解密,从而实现数据安全的保障

 

仍然是上面网站访问的例子,我们知道,HTTP1.0 增加了身份认证机制,也就是支持用户名密码登录和校验,如果浏览器进行过一次登录操作,则此后通信过程中,需要依据协议将身份认证信息拼接在应用数据中,而接收侧的应用程序,则需要按照协议对接收到的身份认证信息进行校验

这个过程中使用到的协议就是会话层协议

会话层,顾名思义,就是维护通信过程中会话的协议,例如会话建立所必须的身份认证和校验就是会话层的一个组成环节,除此之外,对于下载应用来说,会话层还承担着对收到的数据进行解析和存储,维护是否已传输完成等会话信息的任务

 

上面我们讲述的三层都是在应用程序内部实现的:

  1. 应用层负责获取和处理原始数据
  2. 表示层负责对原始数据进行加工,包括翻译、压缩和加密
  3. 会话层则负责验证身份并建立和管理会话

 

但在 TCP/IP 协议族中,上面我们讲述的三层全部被归为“应用层协议”,这是为什么呢?

在 1984 年,国际标准化组织提出 OSI 协议框架的时候,他们的理想是非常好的,但实际上,由于会话层、表示层、应用层都是在应用程序内部实现的,最终产出的是一个应用数据包,而应用程序之间是几乎无法实现代码的抽象共享的,这也就造成 OSI 设想中的应用程序维度的分层是无法实现的,例如,我们几乎不会认为数据的压缩、加密算法算是一种协议,而会话的概念则更为抽象,难以用协议来进行描述,所以在后来的 TCP/IP 协议框架的设计中,干脆将这些应用程序做的事统一归入“应用层协议”,让整个过程更为清晰明了

但近年来,由于 SSL、TLS 这些在应用程序中实现的数据加密协议又让人们感到 TCP/IP 协议框架的分层方式有所欠缺,于是增加“安全层”的呼声也很高,但实际上,是否分层这样概念上的争论意义不大,对我们来说,最为重要的是掌握其中的精髓,知道网络传输过程中到底干了些什么

 

你的浏览器、邮件管理器或是终端应用经由上面说的步骤,产生了一个数据包,接下来就需要调用操作系统接口,实现对这个数据包的发送和接收了

传输层协议最为有名的就是 TCP、UDP 协议了

以 TCP 协议为例,首先,操作系统会将获取到的应用数据进行切分,切分为固定大小的小段,并且为每个小段拼装上 TCP 协议的标识、源端口号、目的端口号、序列号等信息,从而让接下来的环节知道将数据发给谁,并且让接收者知道如何对这些小段排序、重组为应用数据

如果接收应用发现数据缺失或出错,还需要发起数据的重传,这就是传输层的错误控制

在传输层,操作系统还需要进行流量控制,可以参看:

Nagle 算法与滑动窗口协议

发送端流量控制算法

 

与 TCP 相比,UDP 为了数据传输的效率,去除了上面提到的错误控制和流量控制的特性

 

传输层协议将数据切分为小段,接下来就要准备进行网络通信了,这就是网络层需要做的事情

网络层最有名的协议就是 IP 协议,除此之外,当我们在系统中执行 ping 命令,实际上是应用程序调用了操作系统封装 ICMP 协议的接口,他也是一种网络层协议

要想实现通信,我们首先需要知道对方在哪,例如当我们写一封信的时候,都要在信封上写上邮寄地址,这样才能让邮递员知道信要送到哪,网络层协议要解决的也是同样的问题

每个设备连接到网络都会被分配一个 IP 地址,我们要和网络上另一台主机进行通信,就必须知道对方的 IP 地址,在得到对方的 IP 地址以后,网络层做的事情就是逻辑寻址、路由和路径确定

具体的过程是,每台机器都在内存中缓存有一份路由表,操作系统会在路由表中查询应用指定的 IP,如果找到对应的 IP,就调用路由表中指定的数据包传输协议,进行数据的发送,如果找不到匹配的 IP,就选择默认表项指定的路由器 IP

在网络层中,设备通过 OSPF 协议、边界网关协议等协议找到可以在尽量少的转发环节实现通信,这就是路径选择协议

 

网络层在上述打包好的数据包前面添加上包含源 IP、目的 IP 地址等信息的 IP 首部后,由操作系统调用网卡驱动程序交给网卡

网卡驱动程序在 IP 报文的基础上添加源 MAC 地址、目标 MAC 地址,并在尾部添加以太网尾部信息等信息后形成一个以太网帧

那么,什么是 MAC 地址呢?MAC 地址就是网卡物理地址,也就是网卡的 48 位硬件编码,那么,计算机是如何获取网络上其他计算机的物理地址的呢?这就是链路层地址解析协议 -- ARP 协议

当我们要发送一个数据包给一个指定的 IP 时,我们的计算机不知道对方的 MAC 地址,只知道 IP 地址,此时是不能进行通信的,于是计算机先发送一个 ARPA 请求,相当于说“如果你是这个 IP 地址的拥有者,请回答你的 MAC 地址”

目标 IP 地址上的主机获取到 ARP 请求中的目标主机 IP 与自己的主机 IP 地址相同,就会发送 ARP 应答给发起者,于是发起者知道了对方的 MAC 地址,就可以进行通信了

链路层除了负责上面提到的连接多个不同介质并在不同的网卡间通信的逻辑链路控制与 MAC 地址维护的介质访问控制两个功能外,还承担着载波侦听多路访问/冲突检测的功能(CSMA/CD)

当你开着汽车驶出小区,你不可能闭着眼睛直接开到小区门口的路上,因为小区前面川流不息的车流可能会和你的汽车发生碰撞,你会等到前面没车的时候再开上去,同样,链路层发现以太网上正在进行着数据传输,就会稍作等待直到以太网空闲再进行发送,这就是 CSMA/CD 协议,保证了网络上数据不会发生冲突

因此,我们可以知道,为了减少冲突等待的发生,提升网络质量,最好在网络搭建过程中采用星型结构,而不是总线结构

 

 

现在,我们的计算机已经生成了一个以太网帧,就要进行发送了,此时数据的发送离不开物理层的实现

物理层通过网卡硬件、双绞线、光纤等设备,实现了电信号高低电位的传输,也就是 0、1 二进制数据信号的传输

 

欢迎关注微信公众号,以技术为主,涉及历史、人文等多领域的学习与感悟,每周三到七篇推文,只有全部原创,只有干货没有鸡汤

 

 

《TCP/IP 详解》

https://www.youtube.com/watch?v=vv4y_uOneC0

 

 

TCP/IP 详解






技术帖      ip      osi      计算机网络      tcp      udp      http     


京ICP备15018585号