文章

关于通讯

通讯知识小记

关于通讯

信道

信道工作模式

单工和半双工 的区别在于能不能转换方向
相同点就是同一时刻只能有一个方向通信
单工像瀑布 半双工就是独木桥
全双工就是 可以同时双向传输

带宽

区别 电气领域 计算机领域
类型 模拟带宽 数字带宽
本质 频率范围 数据速率
单位 赫兹/Hz 比特/bps
含义 信道能通过的
最高、最低频率
单位时间内能
传输多少比特
  • 模拟带宽是”频率宽度”。比如一个信道能通过300Hz到3400Hz的信号,那它的模拟带宽就是3100Hz
  • 数字带宽是”吞吐能力”。比如100Mbps的带宽,意思是每秒能最多传100兆比特数据。

信噪比

信道传输的有用信息和无用的干扰噪声的比值 就是信噪比
单位 分贝(decibel) 简写dB deci 十进制
bel 贝尔 电话之父

香农定理 C=W*log₂(1+S/N)
C 最大数据速率 bps
W 模拟带宽 Hz
S/N 信噪比
模拟带宽越大、信噪比越高 理论上数字带宽上限就越高
而物理信道的带宽上限 就是整个协议栈的带宽上限

端点

 对于“⽹络通讯”,⾄少得有 N 个端点参与,并且N ≥ 2才有意义。
通俗地说:
单播(unicast)——发送给⽹络中的指定的单个端点
组播/多播(multicast)——发送给⽹络中的指定的多个端点
⼴播(broadcast)——发送给⽹络中的所有端点
选播(anycast)——发送给⽹络中随机选择的单个端点

OSI模型

协议是水平的 服务是垂直的 而垂直的焦点就是api
同层靠协议通信 上下层靠api
应用层之间的直接对话,是一种建立在物理信道之上的逻辑通信。
一般不可跨级 要层层过渡翻译才能让调用者看懂

但也有例外 越往上越懂业务需求 越往下 越懂物理实现
跨层不是常态,而是为了解决分层太细致而导致的性能损失

  • TCP向IP查询MTU 避免分段
  • 应用层告诉传输层/网络层服务质量需求:比如 低时延、高可靠
  • 无线网里,链路层把信道质量反馈给传输层或网络层:用来调整拥塞控制、调度或路由。

多路复用

  • 频分多路复⽤/FDM(Frequency-Division Multiplexing)
    按频率拆分。不同的线路占⽤不同的频段,互不⼲扰。
    • 依赖足够宽的频段,而频段是稀缺资源。
    • 若某个频段空闲,则整个频段浪费。
  • 时分多路复⽤/TDM(Time-Division Multiplexing)
    分时机制。只用很窄的频段。把时间切割成很⼩的时间⽚,每个线路占⽤⼀个时间⽚。周⽽往复。像红绿灯,每隔一段时间,路就通了。
    • 频段很窄
    • 线路越多,其每条线路的等待时间就越长
    • 即便某个线路空闲,依然会占用时间片,浪费资源。
  • 码分多路复⽤/CDM(Code-Division Multiplexing)
    借鉴某种编码技巧,使得多个端点在同一时间点使用同一频段发送数据。因他们的编码不同,所以可以互不干扰。
    • 一般依赖扩频技术spread spectrum,需占用的频道范围比较宽。
    • 可以支持N个线路 N动态变化。
    • 及时任何线路的的流量动态变化,也不会限制物理信道的资源。

物理层协议

  • USB 协议
  • 蓝⽛协议的⼀部分
  • IEEE 802.11 的⼀部分(Wi-Fi)
  • IEEE 802.16(WiMAX)
  • IEEE 1394(⽕线接⼝)
  • RS-232 协议(串⾏接⼝/串⼝)

数据链路层与物理层

在网卡驱动的分界

网卡驱动可以看成两段

  • 一部分是mac驱动,负责 struct net_device、ndo_start_xmit、TX/RX ring、DMA、中断处理、NAPI poll,它处理的是”以太网帧”。
  • 一部分是PHY驱动,负责链路是否up、10/100/1000M、全双工/半双工、EEE、自协商,它通过MDIO总线读写PHY寄存器。

他们之间的数据通道是 MII/RMII/RGMII/SGMII 等介质无关接口; 管理通道是 MDIO/MDC 总线,用来配置和监控PHY。

MAC驱动段 靠近协议栈,负责把sk_buff 送进硬件、从硬件取出帧、通知协议栈
PHY驱动段 靠近物理介质,负责把数字比特流转换成网线/光纤上的物理信号

碰协议、碰帧、碰DMA 属于链路层;碰电信号、碰链路状态、碰自协商属于物理层。

Linux中 drivers/net/ethernet下的是mac驱动 ;而PHY驱动通常在drivers/net/phy下,通过 phylib 和MAC驱动协作。

PHY和调制解调器

对比 PHY Modem
定位 网卡内部
物理层组件
独立网络
接入设备
作用 把MAC的数字码
流转成线缆/光口
上的物理信号
把数字信号调制成
适合运营商线路传输
的模拟信号
应用场景 以太网网卡、
交换机端口、
光口
ADSL、Cable、
光纤入户、4G/5G
网络角色 接入局域网
(LAN)
接入广域网/运营商
网络(WAN)
包含关系 可看作”本地物理
层收发器”
通常包含调制解调
+路由/NAT+交换
+有时还带PHY
面向 短距离、标准化介质
:双绞线、光纤、背板
长距离、非以太网
介质:电话线、同轴
电缆、光纤、无线
频谱
  • PHY通常只负责把MAC送进来的帧变成线缆上的电平或光信号,不做复杂的载波调制、频段搬移、运营商协议封装。
  • Modem是把数字数据调制成适合这些介质的模拟载波
    • ADSL 把数字数据调制成电话线上的高频模拟信号
    • Cable 把数字数据调制成有线电视同轴电缆上的射频信号
    • 光纤 Modem/ONU 把电信号转成光信号,并处理运营商接入协议
    • 4G/5G 把数字数据调制成射频信号,接入蜂窝网络

Modem不止作物理层收发,还承担着WAN接入、运营商认证、协议适配、NAT、路由等任务。
Modem是通往运营商网络的”网关”

PHY面向LAN 电脑 ⇔ 交换机 ⇔ 路由器
Modem面向WAN 路由器 ⇔ 运营商网络 ⇔ 互联网

中继器 集线器

MAC 地址

在计算机中,1 octet 通常等于 1 byte。
一个完整的 MAC 地址 由 6 octets / 6 bytes 组成,共 48 位。
先看 48 bits 是不是全都是 1。若是,则为广播地址。
若不是,则把这 6 octets / 48 bits 分成两部分:

  • 前半部分 3 octets / 24 bits
    组织唯一标识,简称 OUI
    由 IEEE 统一分配给硬件厂商,用来标记制造商是谁
    其中前八位中:
    • b0 位是 全局唯一 / 本地管理 标志
      • 0:全局唯一地址,由厂商在出厂时写入,全球不重复,也叫 OUI enforced
      • 1:本地管理地址,由网络管理员在软件层面手动修改或分配,不再具有唯一性,常见于虚拟机环境或特定网络测试中
    • b1 位是 单播 / 组播 标志
      • 0:单播,数据只发给一个特定设备
      • 1:组播,数据会发给一组设备
  • 后半部分 3 octets / 24 bits
    网卡特定标识,简称 NIC
    厂商在获得 OUI 后可以自由组合这三个字节的值,确保其生产的网卡每个 MAC 地址都是独一无二的

链路层

主要协议有:

  • MAC 协议
  • LLC 协议
  • ARP 协议
  • IEEE 802.3
  • IEEE 802.11 的一部分
  • L2TP 协议
  • PPP 协议
  • SLIP 协议

必要性:把比特流打包成帧,方便上层协议处理。
在 OSI 模型中,打包的结果称为 帧frame。

差错控制

物理介质传输受环境影响,可能会导致比特流出错,例如某个比特从 0 变成 1。
因此链路层还负责检查物理层的传输是否出错:

  • 检错算法
  • 纠错算法

流量控制

两端点通过同一物理信道进行通讯,若发送方输出信息的速度超过接收方处理的速度,通讯就会出问题。
流量控制的作用就是确保发送方的发送速度不会超出接收方的处理速度。

经典以太网在十兆时代常使用集线器。集线器是物理层设备,看不懂协议,采用广播模式。
百兆以太网之后,交换机成为常见的链路层设备。它能识别以太网帧中的目的 MAC 地址,并将数据转发到对应的网络接口。此外,交换机还能实现 MAC 地址过滤、VLAN、QoS 等功能。

交换机主要用于连接同一类型的局域网段;如果要连接不同网络,通常需要路由器在网络层进行转发。

交换机和网桥

二者都可以看懂帧、查 MAC、决定往哪发。
从本质上来说,交换机就是多端口、硬件加速版的网桥。

对比 网桥 交换机
本质 早期二层转发设备 多端口高性能网桥
实现方式 多靠软件/CPU 多用 ASIC 硬件查表转发
端口数 通常 2-4 个 常见 8/24/48 口
转发性能 较低,延迟较高 线速转发,延迟更低
功能 基本学习、过滤、转发 支持 VLAN、QoS、STP、链路聚合等
现状 基本退出主流 现在局域网核心设备

链路层工具:嗅探工具包

嗅探工具可以捕获流经网卡的数据包,通常能看到链路层及以上的数据内容,但不会直接保留物理层的原始电信号或光信号。

因为每一层都会把收到的上层数据包作为自己的数据部分,然后套上自己的头尾,且不拆开上层数据,只把它当作整体 payload,再加上自己的标识。

应用层数据
↓ 传输层加 TCP 头
TCP 段
↓ 网络层加 IP 头
IP 包
↓ 链路层加 MAC 头和 FCS
以太网帧

也就是说:

  • 以太网帧的载荷通常是整个 IP 包
  • IP 包的载荷是整个 TCP 段

所有这些信息都藏在信道里的比特流、电平、光脉冲或射频信号中。每一层都会按自己的协议格式去解码,各取所需。

  • 链路层先看 MAC 头,判断这个帧是否应该接收
  • 网络层看 IP 头,判断往哪里送、是否为本机
  • 传输层看 TCP/UDP 头,判断交给哪个端口、哪个连接
  • 应用层拿到业务数据

发送时,从上往下打包,一层层套标识。
接收时,从下往上解包,每层拆掉自己的头,把 payload 交给上一层。

帧封装就是套上 MAC 头和帧尾 FCS。
帧 = MAC 头 + 载荷 + 帧尾 FCS。
这里的载荷通常是 IP 包,但也可能是 ARP、LLC 等其他协议数据。

帧封装并不是把物理层的比特流打包成帧,而是将 IP 包加上头尾打包成帧,再交给物理层。
从物理层过来的比特流,去掉 MAC 头和帧尾后,就可以交给网络层处理。

以太网帧如何变成比特流

在 MAC 层把以太网帧准备好后,PHY 层按以太网标准进行线路编码:

  • 10M 常用曼彻斯特编码
  • 100M 常用 4B/5B + MLT-3
  • 千兆双绞线常用 PAM-5
  • 光纤千兆常用 8B/10B

编码后的结果变成电压跳变、光脉冲或射频信号,进入网线、光纤或空气。

由于物理层本身没有“帧”的概念,所以帧边界需要靠特殊标记来识别:

  • 前导码:10101010 反复出现,用于让接收端同步时钟
  • 帧起始定界符 SFD:10101011,告诉接收端”帧内容从这里开始”

接收端靠这些标记找到帧边界,再按照以太网格式切出目的 MAC、源 MAC、类型、数据和 FCS。
物理层负责比特同步、编码和信号传输;链路层在物理层提供的比特流基础上识别帧边界,并解析 MAC 头、目的 MAC、源 MAC、类型、数据和 FCS。

如果目的 MAC 匹配,则拆出载荷,交给网络层协议栈处理。匹配情况包括:

  • 匹配到本机
  • 广播 MAC:FF:FF:FF:FF:FF:FF,所有主机都接收
  • 组播 MAC:加入对应组播组的主机接收

关于并发,工程上常见的做法是:

不同流之间并发,同一条流内部保持顺序。
实现方式包括:流水线 + 多核并行 + 多端口并发。

网络层

网络拓扑

树状拓扑便于管理,例如域名系统、公司组织结构、官僚系统。
互联网拓扑从局部看,很多是星形拓扑;从宏观上看,更像网状拓扑。

路由机制

当网络有很多端点、拓扑结构变复杂时,总会有一些端点之间没有直连,此时就需要让其他端点转发数据,这就是路由机制。
链路层虽然已经提供了全球唯一的 MAC 地址,但由于它是固定的、且编码基于厂商,无法体现网络拓扑结构,因此需要抽象出一种更高层的地址,也就是网络层地址。常见的 IP 地址就是网络层地址的实现方式之一。
MAC 地址可以类比成身份证号,而网络地址则可以看成进入公司后分配的员工号,其意义在于方便管理。

引入网络层的另一个目的,就是屏蔽不同类型网络之间的差异,从而有利于网际互联,建立网络中的网络。
联通异种网络,需要每个网络中有一台主机充当网关,起到翻译的作用,帮助不同网络互通信息。
在网络层,IP 协议作为统一标准,把 IP 协议当成“母语”,然后通过各种网关和路由设备,就可以在不同网络之间互通信息。

再说回路由。当主机 A 往主机 B 发送网络层数据时,A 主机的协议栈先通过子网掩码判断 A、B 是否在同一个子网。

  • 若在同一个子网,则直接发给对方
  • 若不在同一个子网,则发给本网的默认网关

默认网关要么自己就是路由器,对数据进行路由;要么把数据丢给其他能进行路由的设备。如果始终找不到路径,只能丢弃,此时网络通讯会出错。

当数据到达某个路由器后,有如下可能:

  • 刚好是 B 所在子网的网关,与 B 直连,那就直接发给 B
  • 路由器把数据丢给另一个路由器,如此反复,直到找到对应子网的路由器
  • 始终找不到主机 B,可能断线、关机或根本不存在

为了避免数据包长时间在网络上逗留,引入了 TTL 机制。

TTL 表示数据包能存活多久。
当数据包被发出时,TTL 就已经被设置好了。每当数据包被路由器转发一次,TTL 就会减 1;当 TTL 变为 0 时,数据包会被丢弃。

路由算法

对于大型网络,每个路由器可能和多个路由器相连,因此需要算法优化路径。

一般来说,路由器内部会维护一张路由表。每当收到一个网络层的数据包,先取出数据包中的目标地址,然后查这张路由表,看哪个下一跳距离目标最近,就把数据包转发给谁。

本文由作者按照 CC BY 4.0 进行授权