1 OSI七层模型

  • 由ISO组织制定的一套数字通信标准流程模型,这个模型是一个建议模型,不是强制的
  • 七层模型从高到低
  • 应用层
    • 提供用户的交互接口
  • 表示层
    • 提供数据的编码解码,压缩解压缩,加密解密等处理
  • 会话层
    • 提供会话ID,会话管理
  • 传输层
    • 提供数据的分段,提供具体传输方式,再应用数据前加上TCP/UDP的数据头部,此层叫做数据段
    • TCP
      • 可靠传输,使用序列号和确认号来确保每个数据都被正确的接受
      • 应用层不需要指定额外的机制,就可以保障数据的准确传输
      • TCP需要有额外的网络开销
    • UDP
      • UDP不保证可靠传输,不提供确认、重传和排序机制。若数据超过MTU,会在IP曾进行分片
      • 发送后,无法获取到对方是否成功无误的接受
      • 使用UDP如果需要可靠传输,需要应用层面定制额外的机制保障
    • 端口号
      • 将数据与应用的进程号进行绑定
      • 区分电脑上的不同网络应用
      • 源和目的端口号
        • 端口号范围:1~65535
        • 其中1~1024是预留给公用服务的
        • 80:http
        • 443:https
        • 22:ssh
        • 53:dns
        • 23:telnet
        • 3306:mysql
        • 3389:windows远程桌面
  • 网络层
    • 数据链路层定义了最大传输单元(MTU),常见为1500字节。网络层根据MTU决定是否对IP数据包进行分片。此曾的数据单元叫做数据包
    • 提供了远程访问的IP地址寻址功能,相当于门牌号码,可以帮助快递找到你在的大概位置
    • 基本概念
      • 公网IP地址,私有IP地址
      • 子网掩码用于定义网络位,网络位相同表示在同一个局域网
      • 广播地址是主机都是1,向此地址发送数据,全部局域网都能收到
      • 网络号是主机位都是0,此地址无法用于通信,是用来代指此局域网的
    • 源和目的IP地址
  • 数据链路层
    • 根据数据完整性校验,需要确保每一个二进制都是正确的,此层叫做数据帧
      • 使用CRC循环冗余校验算法,将二进制计算得到校验值吗,此校验值在接收的时候会拿来与新计算比较,如果一致,就说明数据有效
    • 提供物理传输接口的编号(MAC地址),此地址是烧录在芯片上的,无法轻易改变,能够确定具体的设备的具体接口
    • MAC地址理论上应全球唯一,但在虚拟机等场景下可以自定义。在同一个局域网下必须唯一。虚拟机的网卡MAC地址随机产生,可自定义,为了保障通信。在一个局域网中,必须唯一
    • 源和目的的MAC地址
  • 物理层
    • 定义数据传输介质的电气规范(二进制,数据位)
    • 有线
      • 电缆
      • 光缆
      • 接口类型
        • RJ45水晶头
        • SC连接器,LC连接器
    • 无线

附录参考:下图展示了按OSI七层模型组织的常用网络通信协议结构,可作为上述内容的扩展参考

OSI七层模型常用通信结构

1.1 数据封装

  • 物理层

  • 数据链路层

    • MAC地址

    • ARP协议

      • 向局域网发送二层广播(目的mac地址为全F(FF:FF:FF:FF:FF:FF)),查询目的的IP所对应的MAC地址

      • 收到正确的回应,就会记录在本地的ARP表中,在限定的时间内下次再访问就可以直接完成数据的封装

      • ARP表是为了保障局域网内通信的

      • 数据在局域网中,具体是从哪个设备的什么接口接收,由MAC地址决定

      • 在Windows或者Linux查看arp表的命令arp

  • 网络层

    • IP地址
    • 广播传递的范围仅限于同一个局域网,无法跨越IP网段传播
    • 网络会维护一个路由表,路由表可以指明去往其他网段应该用什么接口出发,每台具备转发能力的网络层设备,都会查询路由表,然后进行转发,经过多跳之后,数据就可以到达目的地所在局域网
    • 维护路由表的方法
      • 静态路由,手动把路由表条目写上去
      • 动态路由,通过协议,路由器相互协议
        • RIP
        • OSPF
        • BGP
  • 传输层

    • 端口号
    • 发送端往往是随机端口号,接收端是常用端口号
  • 应用层

    • 端口号对应的进程

1.2 数据流实例

  • 以电脑访问百度(www.baidu.com)为例

  • 需要的设备:电脑,无线路由器,互联网服务提供商网络,远程Web服务器

  • 第一阶段:电脑->路由器

    • 应用层(客户端发送请求)

      • 访问www.baidu.com
      • 应用层生成HTTP/HTTPS请求报文GET / HTTP/1.1 Host:www.baidu.com...
      • 此时数据单位:应用层报文
    • 表示层(安全处理)

      • 对数据进行加密处理
      • 如果是HTTPS,表示层通过TLS库将HTPP报文加密
      • 添加TLS头部,变成TLS记录
      • 此时数据单位:加密后的PDU(PDU协议数据单元 的缩写。它指的是在计算机网络体系结构的特定层中,数据包或数据块的标准格式
    • 会话层(建立会话)

      • 管理这次Web会话
      • 封装
        • 建立和维护与服务器的会话状态
        • 分配会话ID,管理会话生命周期
      • 此时数据单位:会话消息
    • 传输层(端到端控制)

      • 准备可靠的传输

      • 封装

        • 添加TCP头部
        源端口:随机高位端口(如54321)
        目标端口:443(HTTPS)
        序列号:初始序列号
        标志位:SYN(例如在TCP连接建立时)
        • 形成TCP段
      • 这里是第一次出现端口号。标识了哪个应用程序(浏览器)与服务器的哪个服务(HTTPS)通信

    • 网络层(跨网络寻址)

      • 添加逻辑地址

      • 封装

        • 添加IP头部
        版本:IPv4
        源IP:内网地址
        目标IP:通过DNS解析得到的百度服务器IP
        TTL:64(每经过一个路由器减一)
        协议:6(表示上层是TCP)
        • 形成IP数据包
      • 这里是第一次出现IP地址,用于跨网络寻址

    • 数据链路层(局域网内传输)

      • 准备在Wi-FI链路上传输

      • 封装

        • 添加无线帧头部(或以太网头部,取决于当前链路类型)
        目标MAC地址:路由器Wi-Fi接口MAC
        源MAC地址:无线网卡MAC
        类型:0x0800(表示承载的是IP数据包)
        • 添加帧尾部(FCS(Frame Check Sequence),用于错误检测)
        • 形成无线数据帧
      • 这里第一次出现MAC地址,用于局域网内设备识别

    • 物理层(无线信号传输)

      • 转换为无线信号
      • 封装
        • 将帧的比特流转换为无线电波
        • 使用2.4GHz或5GHz频段,特定信道
        • 调制方式:如OFDM
      • 此时数据单位:比特流
此时完整的数据单元:[前导码][MAC头部][IP头部][TCP头部][TLS头部][HTTP数据][FCS]
  • 第二阶段:路由器处理

  • 路由器通常不处理传输层以上的内容,但为了NAT功能,它会“查看”TCP/UDP端口号

    • 物理层
      • 无线网卡接收无线电波,转换为比特流
    • 数据链路层
      • 检查帧的目标MAC地址,确认是发给自己的
      • 去掉MAC地址和帧尾部
      • IP数据包交给录由的网络层处理
    • 网络层(路由器核心工作)
      • 检查IP包头部的目标IP地址
      • 发现是公网IP,而源是私有IP
      • 执行NAT(网络地址转换)
        • 将源IP从私有IP改为路由器的公网IP:新端口
        • 在NAT表中记录映射关系
      • 重新计算IP头部校验和
      • 查询路由表,确定从WAN口发送到ISP网关
    • 数据链路层(出口)
      • 添加新的MAC头部
        • 目标MAC:ISP网关的MAC地址
        • 源MAC:路由器WAN口的MAC地址
    • 物理层
      • 通过光纤将比特流发送给ISP
  • 第三阶段:互联网传输

  • 数据包经过多个路由器跳转,每经过一个路由器都会发生一下操作

    • 物理层接收
    • 数据链路层检查MAC地址并解封装
    • 网络层
      • TTL减1,如果TTL为0,那么丢弃并发送ICMP超时报文
      • 查询路由表,决定下一跳
      • 更新新的MAC头部
    • 重新封装并转发
      • IP头部基本不变
      • MAC头部每一跳都在变
  • 第四阶段:到达百度服务器

  • 服务器接收到数据后,进行反向解封装

    • 物理层
      • 网卡接收光/电信号
    • 数据链路层
      • 检查MAC地址,解封装
    • 网络层
      • 检查IP地址,确认是发给自己的
      • 如果是负载均衡器 ,可能将请求转发给后端的实际服务器
    • 传输层
      • 根据目标端口443,将TCP段交给Web服务器进程
      • TCP协议栈处理序列号,确认,重组等
    • 会话层
      • 识别或建立会话(如果是新的HTTPS连接,会进行TLS握手)
    • 表示层
      • TLS解密,将密文恢复为明文HTTP请求
    • 应用层
      • Web服务器(如Nginx)解析HTTP请求
      • 生成HTTP响应
  • 第五阶段:响应原路返回

    • 源IP和目标IP(此时的目标IP为路由器gongwangIP)进行转换
    • 经过互联网路由,达到最开始的路由器
    • 路由器查询NAT表,将目标IP改为服务端IP,改回端口为54321
    • 通过Wi-Fi发送给电脑
    • 电脑解封装,最终在浏览器中显示百度首页
层次 数据单元名称 关键地址/标识 在何处封装/解封装 典型设备
应用层 报文/消息 URL、HTTP方法 应用程序内 浏览器、服务器软件
表示层 格式化数据 加密算法、编码类型 系统库/加密库 SSL/TLS库
会话层 会话/消息 会话ID 操作系统/中间件 会话管理器
传输层 段/数据报 端口号 操作系统内核 主机、防火墙
网络层 数据包 IP地址 操作系统内核、路由器 路由器、三层交换机
数据链路层 MAC地址 网卡驱动、交换机 交换机、网桥、AP
物理层 比特流 无(电气特性) 网卡/物理接口 网卡、Hub、线缆
  • 三次地址变化:应用层用URL,传输层用端口,网络层用IP,数据链路层用MAC
  • 两层不变:IP地址端到端基本不变,MAC地址每跳都变
  • 路由器处理下三层,但为NAT会"偷看"端口
  • 交换机/AP只处理下两层,基于MAC地址转发
  • 防火墙可以工作在3-7层,深度包检测可看到应用层内容

1.3 常见协议与OSI层级的对应关系(参考)

OSI层级 典型协议举例
应用层 HTTP、HTTPS、DNS、SMTP、POP3、SSH、Telnet
传输层 TCP、UDP
网络层 IP、ICMP、ARP、OSPF、BGP
数据链路层 以太网、Wi-Fi(802.11)、PPP
物理层 双绞线、光纤、无限频段