网络包教包会之/网络模型

 

第一节:网络参考模型。

 

OSI参考模型 / TCPIP参考模型 / 数据的封装跟解封流程

 

写在前面:

——网络其实很大程度上和编程思想是有共通设计的,但对于没有接触过计算机系的人来说,分层结构/模块思想在前期会很抽象,初学者乍一看

计算机/网络庞大复杂的体系很容易让人产生退缩和自我怀疑,并且很多所谓的教材并不是由浅入深,加之描述歧义,很容易让学习者浪费时间,

而该系列文章即是我为了解决这个问题而做的总结。

 

1.网络模型概述

首先,什么是网络模型?要了解网络首先需要大致知道概念,其本质上是在描述数据怎么从一个地方经过各种设备/线缆到达另一端的,

数据在这期间会路过各个层级,就像我们打游戏也需要闯关才能得见终章一样,网络模型正是代表这其中的层级。

通过70年代末的OSI早期网络参考模型,我们可以对网络结构有一个大概的认知,它总共分为了7层,其由低到高分别为:

 

1.物理层(Physical Layer):

  网络通信的最底层,也就是第一层,它定义了数据传输的物理介质,即我们的能见设备,如电缆、光纤、无线电波等。

  主要涉及数据的编码、传输速率、电压水平等。

 

  该层中数据被称为“比特”。

 

  该层核心:比特数据/介质类型。

  概念速通:

  我们常见的各种网络线缆都在这一层,但是物理底层的传输方式我们不需要关注,知道怎么回事就行:
  —— 双绞线、同轴电缆,也就是常见网线,它传的是电信号
     —— 光纤(光缆), 传输
"光子",即光脉冲
  —— 无线
/微波(Wi-Fi、5G、蓝牙)—— 传输“电磁波”,即无线电波
  
  比特:即bit,物理层上传输的正是比特,它只有0和1。
  
  字节:即byte,一个字节是8bit,后面我们会再提到它。

  该层中还有个重要概念是全双工/半双工通信,这是以太网规范IEEE802.3里规定的,早期网络是共享总线,物理半双工。

  半双工:数据在单行道上进行发送接收,会有冲突,典型设备就是对讲机,HUB集线器。

  全双工:数据在双向通道上进行发送接收,因此利用率是100%,且能同时收发决定了它在物理层上不会冲突。

 

  层级小讲堂:

  在70年代初。几台大学里的电脑想互相通信,最笨也最直接的办法,就是用一根电缆把它们全串起来。而这根电缆就是物理层,它能传输代表0和1的电信号。

  但问题马上就来了,早期的以太网线是用一根铜芯总线,属于刚刚提到的半双工通信,如果两台电脑同时开始发送电信号,两股电波在电缆里一混,压根分不清,

  于是形成了冲突,但是物理层本身的性质并不适合处理这些冲突

  于是也就引入了接下来的数据链路层——

 

 2.  数据链路层(Data Link Layer):

  数据链路层就是我们常说的“二层网络”,从这一层开始正式步入了网络通信内容。

  首先这一层通常是由网络设备(交换机/无线AP)和终端设备(电脑/手机)构成,一般描述一定范围内的以太网/无线网。

  核心是MAC地址,由6个字节(48位)组成,通常写作12个十六进制字符,如 00-1A-2B-3C-4D-5E,用于标识设备唯一性,类似于我们的身份证号,区分设备则是依靠MAC。

  如图——

  image


  有了MAC地址来标记各自身份,数据也就有了目标和源头,从哪个设备到哪个设备一目了然,此时运行在物理链路上的数据逻辑链路也就随之诞生。

  之前的小讲中我们知道以前是一根物理总线半双工通信,而通过载波监听/退避算法,早期的CSMA/CD协议解极大缓解了逻辑链路上的冲突问题,

  但物理链路上始终只能有一个信号的问题依然存在,共用总线的多个用户之间数据频繁 撞车-重传 会占用大量无效时间,导致有效吞吐量远低于实际宽带数据。

  而 交换机 的出现则成功缓解了这一局面,同样是一根线路接入多个用户,跟HUB集线器不同的是,它没有再让多用户挤在一个冲突域里,每个网线端口都被划进了一个单独冲突域,

  各个用户的数据能并行到达交换机,然后依次从总线串行发送,即使同时收到数据,交换机也能通过缓存+排序来让数据不会冲突,这样数据也就能最大程度接近理论带宽。

  到了90年代末,全双工通信标准出现,此时CSMA/CD被彻底废除,物理层冲突终于彻底消失。

  ——如果要简单描述该层的话,即:将网络层的网络层报文封装,并在物理介质上进行可靠传输的层级。

  该层中数据被称为“帧”。

 

    该层核心:数据帧/MAC地址表/交换机。

 

 概念速通:

  冲突域:信号在该区域内没有顺序/缓存/调度,即 同时发送。互相会产生互相碰撞。(对线路会产生抢占)

  广播域:交换机中广播数据帧能够到达的所有端口范围即为广播域,被交换机分割的每个端口都是一个独立冲突域。

  2层交换机的通信行为只有三种,分别是:

  泛洪:在交换机不知道目的MAC在哪时,就会执行泛洪,将数据从所有端口广播出去给每个用户。 

  转发:知道目的MAC时,则会直接转发。

  过滤:当同个数据帧在交换机上收发都是都是同一接口,此时交换机会自动将其丢弃。

 

  层级小讲堂

  回到70年代末,之前用一根电缆串起来的电脑,已经扩展到了同一栋楼里的几十台。数据链路层用MAC地址给每台电脑贴上了唯一的“门牌号”,

  得益于CSMA/CD协调了谁先占用电缆,看起来大家已经能在同一个局域网里稳定地互发数据帧了。

  但在这个还没有出现全双工和交换机的年代,MAC地址的扁平设计已经暴露无遗,尽管在一个局域内通信看起来还算效率,可一旦把视角放大到城市,甚至世界,

  我们就不难发现问题所在了:试想一下,设备要存放全球MAC或者任意数据泛洪给所有电子设备,这听上去就非常荒诞,如果没有像“国家-地区”这样的地址分层结构存在,

  单纯的把网络规模放大显然是不可取的,加上当时的二层网络五花八门,以及电缆长度等各种物理限制,从业者不得不考虑设计出一种更上层/更统一二层网络的产物:

  于是网络层应运而生——

 

   3.网络层(Network Layer):

  这层就是我们常说的“三层网络”了,既——通过IP寻址的通信方式。

  如通过前面两层的学习,我们已经了解MAC地址能精准描述设备唯一性,那么接下来就要做的就是对整个网络规模分层,将庞大的线路网分割成小的区域。

  因为二层网络关注的是MAC地址,即"目标"信息,此时再引入更宏观的"位置"信息,就让数据具备了更大范围内跨地域传输的能力。

  在讲述网络层之前,我们得知道IP(Internet Protocol Address)是什么,它是一个32位的2进制数,一般写成点分十进制,由“网络号”和“主机号”两部分组成。网络号标识你所在的“区域”:

  IP地址格式:image

 

  主机号则是这个区域里的“几号楼几号房”。有了IP地址,设备在世界范围内就有了一个“逻辑住址”。而实现这一层通信的核心设备是路由器(Router)。

  路由器的任务就是查看数据包的目标IP地址,然后根据自己维护的“路由表”(相当于一张世界地图),决定把数据包扔向哪个方向(下一跳),最终把数据送去它的要找"位置"。

  当数据数据进入目标区域后,此时主机号才会派上用场,因此此时三层网络的使命已经完成了,即:从一个区域送达另一个区域,接下来就是二层网络的工作了。

  设备通过泛洪或者内部的ARP表,即(IP/MAC)映射表,ip对应的MAC地址会被告诉设备,此时目标的身份信息得到,数据最终送达到具体的目标用户上。

  

  该层中数据被称为“数据包(Packet)”。

 

  该层核心:IP地址 / 路由表 / 路由器。

 

  概念速通

  内网:即无法在公网上被路由的IP。
  目前常用的内网IP为 ——
  A类:10.0.0.0 ~ 10.255.255.255 
  B类:172.16.0.0 ~ 172.31.0.0 
  C类:192.168.0.0 ~ 192.168.255.255
  
  外网:也就是公网,早期网络层设计中是没有内外网说法的,这是后来对IPV4地址不够用而做的补救,所以我们不难发现无论内外网,只要网段不同(网络号),就必须经过3层通信。

  路由器:三层核心设备,连接不同的网络。通过路由表维护网络。

  网关:是指一个网段内所有数据的出口,它通常被设置成该网段下的首位或末尾IP。

  ARP: 即地址解析协议,运行于网络层,同网段通信时,设备就会往所在段的整个2层网络广播ARP报文,目标IP收到后会回复单播包并告知自己的MAC建立IP/MAC映射。非同网段时,则用网关的IP去请求网关的MAC,由网关继续转发.


  子网掩码:和IP一样同样是32位的2进制数,也写作点分十进制,一般跟IP结合使用,它划定了IP中哪部分是网络位,哪一部分是主机位。写法固定,网络位全为1,主机位全为0,如255.255.0.0.

  NAT:网络地址转换,用于映射内外网IP,通常是1对多的方式。

 

  层级小讲堂

  尽管80年代已经有了主机/网络位的设计,但当时设计非常死板且僵硬,直接按地址的开头几位把地址锁死为 A、B、C 三类,对应8/16/24位开头,

  这自然导致了一个显而易见的问题,中公司拿B类用不完,小公司拿C类又不够用,非常的浪费IP,虽然80年代中出现的子网掩码能将公司IP切割开,但这些IP其实依然在公网,

  而当时的类路由器根本不看掩码,它只会根据前缀来判定这个IP的所在类,直到90年代初,国际标准协议CIDR出现,它彻底终结了有类IP时代,并规定了可以使用子网掩码来任意切割网络,

  至此子网掩码开始大规模的使用,路由也变成了最长掩码匹配规则。随着1994年和1996年出现的NAT网络地址转换跟私有网段地址划分到来,现代意义上的内外网才算是真正诞生。

 

   4.传输层(Transport Layer):

  要了解传输层,就必须得从跟他捆绑出生的“端口”这个概念聊起。

  之前我们说过,三层网络等于把数据从一个区域运送到另一个区域,而二层网络则负责区域内的MAC寻址,这相当于我们找到了具体的“人”,但就像我们日常聊天话题很多,

  需要选择某个来具体沟通一样,“端口号”正是关注该问题的,它告诉了数据到达目标电脑后,应该交给哪个应用程序(比如网页浏览器、邮件软件),而这正是传输层的目标。

  在早期试验中,数据到了目标主机,却不知道该交给哪个进程。于是有人提议在数据头部加上一个“进程ID”,但不同操作系统之间,

  系统进程ID不同,根本没法全球通用,于是研究者决定另起一套独立于操作系统的数字编号,也就是今天被熟知的“端口号”。

  端口号是一个16位整数,从0到65535,为了全球统一IANA讲其大致分为了三类:

  • 0-1023:知名端口,固定分配给常见服务。例如:

    • 80 → HTTP网页服务

    • 443 → HTTPS加密网页

    • 25 → SMTP邮件发送

  • 1024-49151:注册端口,留给非知名但需要注册的应用程序,比如某些数据库或专有服务。

  • 49152-65535:动态/私有端口,通常由客户端的操作系统临时随机分配,用于一次性的通信(如打开浏览器访问网站,电脑会随机生成一个临时端口

  了解完端口,那么我们再聊一个很显而易见的问题——数据包就像快递,难道不会有丢件、乱序这种问题?

  答案显然是有的,因为网络层不可靠,所以就只能依靠两边的电脑来解决,

  最被人们熟知的两大网络协议出现了:即TCP(传输控制协议)和UDP(用户数据报协议)。

  后者的UDP是在不可靠的IP协议上加入了"端口"实现了应用区分,即IP+端口(不可靠)。

  前者的TCP则是在加入端口的基础上又多了一套链接建立机制,来保证数据不会丢包/重复/乱序,即IP+端口+TCP机制(可靠)。

  尽管在70年代就已经有了TCP协议雏形,但直到1983年传输层协议(TCP/UDP)才真正投入大规模使用,这一的标志性时刻也被视为现代互联网的生日

  通过下面这张图片我们能更直观的了解目前已讲到的网络层级:

    

  image

   

 

  该层核心:TCP/端口/数据流。

 

  层级小课堂:

  依旧是80年代初期,当时TCP和IP并没有分得那么清楚,传输层的功能雏形都混在一起。设计者们的最初想法,就是写一个大的、统一的协议来完成这个任务。

  它既要处理端到端的可靠性(TCP的事),也要负责分组路由和转发(IP的事).在今天看来是很扯淡的网络功能“混合体”。不过很快设计者们意识到,

  应用场景的需求是根本冲突的,不可能用“一个完美协议”满足所有。对于聊天/登录这种实时交互的场景,TCP因为一两个包丢失就重传,等待,用户会感觉延迟巨大,没法使用。

  而对于文件传输场景又恰恰相反,哪怕过程中偶尔卡顿一阵,只要最终拿到的文件不出错,并且完整正确就行。如果丢一个包导致文件损坏,那整个传输都毫无意义。

  于是至此传输层协议才被拆分为了两个,各司其职。

 

 5. 会话层(Session Layer):

 

  会话层跟表示层在如今的TCP/IP参考模型中已跟表示层/应用层合并,在现代教材中我们几乎找不到任何会话层的协议,功能被应用层和传输层完全瓜分。

  所以对于该层我们不再像前几层一样详细讲解,大概了解即可:

  传输层只负责建立一个可靠的端到端“通道”,但它不关心这个通道上的“对话”是什么情况,比如,你下载一个10GB的文件,中间网络断了一分钟,而传输层的连接已经断开重连好几次了。

  所以传输层只管每次连接的数据可靠,但不会记录传输状态:“文件传输进度40%,重连后继续传”。这个“断点续传”的记忆功能,就是会话层的工作。

  即:对“会话”的管理。

  它的具体职责包括:

 

  1.建立、维持和结束会话。

  2.断点同步和标记续传:这是最核心的功能。比如传输一个100页的文件,会话层可以每10页插入一个标记。如果传到第85页时崩溃了,恢复时不需要从第1页重传,而是从最后一个标记(第80页)继续。

  3.对话控制:管理通信方式是单工、半双工还是全双工。

 

  而这些职责在现代分别对应:

 

  1.基础连接生命周期都交给了TCP的三次握手四次挥手机制;需要长期持续对话的场景,由 WebSocket、SSH 这类上层应用协议自行维护长会话。

  2.TCP 内置报文重传、滑动窗口机制,能对微小数据纠错;大文件、批量数据的断点续传,交由HTTP 分片、FTP、下载工具等应用侧实现

  3.TCP 协议默认采用全双工传输;HTTP属于典型半双工交互,遵循客户端发起请求、服务端应答回复的单向轮询逻。

 

 6. 表示层(Presentation Layer):

       

  第和前面几层不同,表示层非常特殊,我们已经说过它已被合并,所以必须得跟应用层结合起来看。首先表示层是一个实际意义上的"僵尸层",在1984年的OSI7498标准中,

  表示层的职责被定义为:“为应用层提供数据语法转换、数据加密和数据压缩服务。”,也就是所谓的:转换、加密、压缩,只要接触过计算机的人对这些都不陌生。

  但这个理想层级在实际执行中出现了巨大的问题,一是当时的ASN.1/BER编解码需要消耗大量CPU资源,其对于网络设备而言是不能接受的,二就是应用层认为,

  与其让一个“中间层”把数据变来变去,不如自己定一套简单的格式。1989年诞生的HTTP/0.9 直接用纯文本ASCII传输,字节序用网络字节序(大端序)约定死,根本不给表示层插手的空间。

  那么站在如今的角度看,表示层三大职能转换、加密、压缩去哪了呢?

  —————

  1. 数据格式转换:被应用层协议“内化”
  在TCP/IP四层模型中,根本就没有表示层,各种转换操作全被应用层搞定了。

  2. 数据加密:进入了一个"灰色地带"。
  也就是SSL/TLS协议,它位于传输层(即TCP协议)之上、应用层之下,叫做“套接字层”,但其实是TCP/IP的寄生层,并不是独立层级。

  3. 数据压缩:被应用层或硬件吞噬
  图片、视频的压缩放在了应用层由编码器处理。而Web传输中的gzip压缩,直接在HTTP头里声明,依然是应用层处理。

 

  总的来说,表示层是OSI的理想产物。像接触过开发的人都知道前后端中都有不少进行数据类型转换的函数,它正是过去表示层的职能之一。

 

7.   应用层(Application Layer):

  作为 OSI七层模型顶端的应用层,是电脑上的软件程序对接网络的层级,也是普通用户唯一能感知观察到的层级。

  之前的六层总的来说其实只干了一件事:把数据从一台电脑稳妥送到另一台电脑,并不关心数据包里装的是什么内容;

  只有应用层规定:两台电脑之间该发什么内容、按什么格式说话、要完成什么业务目的。

  在现今使用的 TCP/IP 互联网体系里,会话层、表示层、应用层三层合并统一为了应用层。

  而相比于前面几个层级,它的复杂度是肉眼可见的,不过其核心职能可以描述为:

 

  1.为应用程序提供网络服务接口

  2.定义数据的格式、语义和交互时序

  3.将我们可视的各种内容,转化为更底层的原始数据类型
    

  相信和我一样接触过编程的朋友对这一层肯定非常熟悉,也更清楚这一层的复杂性,相比于之前解决一类问题的层级,应用层范围之大,涉及也之多。

  对一些非计算机专业或者不了解的人,这里先讲讲"接口"这个概念,它并不是文娱或者商务上的意思,

  它最早源于19世纪的工程学和物理学。词根是拉丁语 inter(之间)+ facies(面),本意就是“两个物体或系统之间的公共边界”。

 

  早期用于描述硬件的连接处、咬合面、插孔等,直到计算机时代才被抽象到软件,并定义为“一组行为规范”。

  而说来说去"接口"的概念其实也不难理解,我们去银行取钱需要卡号/密码/身份信息,就是约定了某种规范的"接口"行为。

 

  那么回到应用层,前面的学习我们已经知晓了数据怎么被精准交给了正确的应用程序,但送到之后呢?浏览器收到的是一串0和1,它怎么知道这串数字是网页文字、一张图片,还是一段视频?

  通俗地讲,英文中文日文德文字母图片视频等等,它们最后都会被转化为字节(byte)流然后交给传输层,而原始数据怎么经历各种编码规则,字符算法变成字节,都属于应用层的内容。


  
层级小讲堂:

  随着时代变迁,计算机的辉煌落幕,很多开发者们不得不身兼数职,让自己也变为应用层里的一部分。

  相信不少从业者都被甲方或者客户经理搞崩溃过,他们压根不关系应用层是个多严谨的契约,现实中往往能听见的只有:“

  “你这个功能怎么这么慢?”“这按钮怎么不让一直点?”——

  应用层作为网络模型中唯一直面人类任性需求的层级,现实中其实是非常残酷且混乱的,无论你的协议/规范设计的多么优雅,轻量,也无法纠正对方的奇思妙想。

  因而无数从业者不得不绞尽脑汁把那些抽象的,虚无的东西转化为能在应用层里被规范和实现的数据。

 

 

posted @ 2026-03-23 18:02  淮生  阅读(10)  评论(0)    收藏  举报