简介:这份PPT课件面向计算机与通信相关专业的学生及网络入门学习者,系统梳理网络基础与应用数据通信的核心知识,帮助读者建立从信号传输到网络交换的完整认知框架。内容围绕数据、信息与信号的区别展开,涵盖模拟与数字信号的分类、并行与串行传输、异步与同步传输、单工半双工全双工通信、点到点与多点连接,以及基带、频带、宽带传输等基本方式,并延伸至电路交换与包交换技术、信源信道信宿模型和奇偶校验、CRC等差错控制方法。资源包内含1个pptx文件,共22张幻灯片,压缩包约393KB,体积轻便,适合课堂讲授、自学复习或考前梳理。目前已有100人学习浏览,可作为理解互联网工作原理、构建与维护网络系统的入门参考,也便于教师直接用于教学演示。
1. 数据通信基础:从22页PPT里拆出能动手的网络底座
很多人第一次接触「网络基础与应用数据通信基础」这类PPT,翻完22页只觉得全是概念:信号、编码、复用、交换、差错控制,一页一个名词,合上文件什么也没留下。但真正做过网络工程的人知道,这22页里藏着的是后面所有协议栈的底座——你调不通SSH自动化传输、搞不定串口DMA收数据、排查不了HDMI画面断流,根子往往不在应用层,而在数据通信这层没吃透。这篇笔记不逐页复述PPT,而是把数据通信基础拆成能动手验证的路径:信号怎么变成比特、比特怎么可靠地送到对端、交换技术怎么选、差错控制怎么配。适合刚入行的网络运维、嵌入式通信开发者,以及想把「传输」这件事从玄学变成可测量参数的工程师。
2. 信号、编码与传输介质:比特到底怎么上了线
2.1 从模拟信号到数字比特的转换链路
数据通信的第一步,是把上层要传的信息变成物理介质能承载的信号。这个过程分三段:信源编码把字符/字节变成比特流,信道编码加冗余做差错控制,线路编码把比特流变成适合介质传输的电平或光强变化。很多人跳过前两段直接看「网线怎么接」,结果遇到串口乱码、HDMI无画面时完全不知道从哪查。
以最常见的UART串口为例,它用的是异步传输,没有单独的时钟线,靠起始位和停止位来对齐收发双方的节奏。一帧数据通常是:1个起始位(低电平)+ 5~9个数据位+ 可选校验位 + 1~2个停止位(高电平)。波特率和时钟配置不匹配,接收端就会在错误的位置采样,表现为乱码或帧错误。
# Linux下查看串口当前配置(以ttyUSB0为例) stty -F /dev/ttyUSB0 -a # 典型输出中关注这几项: # speed 115200 baud; rows 0; columns 0; # cs8 -parenb -cstopb 表示8数据位、无校验、1停止位逻辑说明:stty -a把串口的波特率、数据位、校验位、停止位全部列出来。参数说明:speed是波特率,必须和发送端一致;cs8是8位数据位;-parenb表示无奇偶校验;-cstopb表示1位停止位。如果对端是7位数据位加偶校验,这里就必须改成cs7 parenb,否则收到的每个字节都会错位。
2.2 传输介质的选型:双绞线、同轴、光纤怎么选
PPT里通常会列一张表对比双绞线、同轴电缆、光纤的带宽、抗干扰和成本。落到实际项目,选型逻辑其实就三条:距离、电磁环境、预算。
| 介质 | 典型带宽 | 可靠传输距离 | 抗电磁干扰 | 常见场景 |
|---|---|---|---|---|
| 双绞线(Cat5e/Cat6) | 1Gbps/10Gbps | 100m | 中等,需屏蔽 | 办公网、家庭布线 |
| 同轴电缆 | 10Mbps~1Gbps | 500m | 较好 | 有线电视、旧监控 |
| 多模光纤 | 10Gbps | 550m | 极好 | 机房内、园区骨干 |
| 单模光纤 | 100Gbps+ | 10km+ | 极好 | 城际、跨楼宇 |
选型时最容易翻车的是把双绞线拉到超过100米还奇怪为什么丢包。双绞线的100米限制不是随便定的,是信号衰减和延迟畸变共同决定的。超过之后,眼图闭合,误码率飙升。如果必须超距,中间加交换机中继或换光纤收发器,不要试图用「好一点的网线」硬扛。
另一个高频问题是屏蔽双绞线接地。屏蔽层只在一端接地,两端都接会形成地环路,反而引入干扰。这个坑在工业现场特别常见,表现为网络时通时断,用ping看延迟忽高忽低。
2.3 用Python模拟基带编码验证采样位置
想真正理解为什么采样位置这么关键,可以用Python把NRZ编码和曼彻斯特编码画出来,再模拟接收端在不同相位采样。
import numpy as np import matplotlib.pyplot as plt # 原始比特流 bits = [1, 0, 1, 1, 0, 0, 1, 0] samples_per_bit = 100 # NRZ编码:高电平表示1,低电平表示0 nrz = np.repeat(bits, samples_per_bit) # 曼彻斯特编码:1是低到高跳变,0是高到低跳变 manchester = [] for b in bits: if b == 1: manchester.extend([0]*50 + [1]*50) else: manchester.extend([1]*50 + [0]*50) # 模拟接收端在比特中间采样(正确)和比特边界采样(错误) t = np.arange(len(nrz)) fig, axes = plt.subplots(2, 1, figsize=(10, 4)) axes[0].plot(t, nrz) axes[0].set_title("NRZ encoding") axes[1].plot(t, manchester) axes[1].set_title("Manchester encoding") plt.tight_layout() plt.show()逻辑说明:这段代码把同一串比特用两种编码方式画出来。NRZ在连续相同比特时电平不变,接收端如果时钟有漂移,采样点会逐渐偏移到比特边界,读到错误值。曼彻斯特编码每个比特中间都有跳变,接收端可以从跳变沿恢复时钟,这就是它抗时钟漂移的原因。参数说明:samples_per_bit控制每个比特的采样点数,调大可以让波形更平滑;曼彻斯特的50是半个比特周期,对应中间跳变的位置。
理解了编码层面的时钟恢复,再看UART的起始位对齐、以太网的4B/5B编码,逻辑就通了。
3. 交换技术:独占、分包、报文怎么选不踩坑
3.1 三种交换方式的本质差异
电路交换、报文交换、分组交换,PPT上一般用三张图带过。实际做方案时,选择依据是「业务对时延抖动和带宽利用率的敏感程度」。
电路交换在通信前建立一条独占的物理通路,时延稳定但带宽浪费。典型场景是传统电话网。报文交换把整个报文存储转发,时延大且对中间节点缓存要求高,现在基本不用。分组交换把报文切成小包,每个包独立选路,带宽利用率高但时延有抖动。互联网就是分组交换。
热搜里有人问「独占、分包两种传输方式的特点及适用场景」,这其实对应电路交换和分组交换。做视频会议选电路交换思路(专线),做网页浏览选分组交换。但现实是大部分场景用分组交换加QoS来模拟专线的稳定性。
3.2 分组交换的排队时延怎么估算
分组交换的核心问题是排队。每个路由器接口都有发送队列,队列满了就丢包。估算排队时延可以用经典的M/M/1模型:
# M/M/1排队时延估算 # 到达率 lambda(包/秒),服务率 mu(包/秒) def queue_delay(lam, mu): if lam >= mu: return float('inf') # 系统不稳定,队列无限增长 rho = lam / mu # 利用率 # 平均排队时延 = rho / (mu - lam) return rho / (mu - lam) # 示例:接口速率100Mbps,平均包长1250字节=10000比特 mu = 100_000_000 / 10_000 # 10000包/秒 for lam in [5000, 8000, 9500, 9900]: delay = queue_delay(lam, mu) print(f"到达率 {lam} 包/秒,利用率 {lam/mu:.2f},排队时延 {delay*1000:.3f} ms")逻辑说明:这个模型告诉你,当链路利用率超过80%后,排队时延非线性上升。参数说明:lam是实际到达速率,mu是接口线速处理能力。输出中可以看到,利用率从0.5升到0.99,排队时延从0.1ms涨到约10ms。这就是为什么核心链路要做流量工程,不能让任何一条链路长期跑满。
实际排查网络卡顿时,如果发现某条链路利用率长期高于70%,不用看应用层,先扩容或做负载分担。
3.3 用Wireshark观察分组交换的实际情况
理论讲完,用Wireshark抓一次实际传输,看分组是怎么被切分和重组的。
# 在Linux上抓取eth0的包,限制100个 sudo tcpdump -i eth0 -c 100 -w capture.pcap # 然后用Wireshark打开capture.pcap # 过滤条件:tcp.port == 443逻辑说明:tcpdump抓包,-c 100限制数量避免文件过大,-w写入文件。参数说明:-i eth0指定网卡,如果抓无线网卡可能是wlan0。打开后在Wireshark里看TCP流,能清楚看到大文件被切成多个MSS大小的段,每个段独立确认。如果看到大量重传,说明中间链路有丢包或拥塞。
提示:抓包时如果看到TCP ZeroWindow,说明接收端应用读取太慢,缓冲区满了,不是网络问题。
4. 差错控制:从奇偶校验到CRC的落地配置
4.1 差错控制的三个层次
差错控制分检错和纠错。检错用奇偶校验、校验和、CRC,发现错误后请求重传。纠错用汉明码、卷积码,接收端直接纠正。实际网络里,链路层用CRC检错加重传,传输层用校验和,应用层有时再加一层哈希。
CRC在以太网帧里是4字节,覆盖目的地址到数据字段。如果CRC错,帧直接被网卡丢弃,不会上报给协议栈。所以抓包时看不到CRC错误的帧,只能通过网卡统计计数看。
# 查看网卡统计中的CRC错误和丢包 ip -s link show eth0 # 关注RX errors、dropped、overruns # 如果errors持续增长,检查网线、光模块、双工模式逻辑说明:ip -s link输出网卡的收发统计。参数说明:RX errors累计接收错误,包括CRC错、帧对齐错;dropped是缓冲区满导致的丢包;overruns是内核来不及处理。如果errors在涨而dropped不涨,基本是物理层问题,换线或换模块。
4.2 串口通信中的校验位配置
回到热搜里提到的「UART传输通信时序」,串口通信的差错控制主要靠校验位和停止位。校验位分奇校验、偶校验、无校验。配置时收发双方必须完全一致。
import serial # 配置串口:波特率115200,8数据位,偶校验,1停止位 ser = serial.Serial( port='/dev/ttyUSB0', baudrate=115200, bytesize=serial.EIGHTBITS, parity=serial.PARITY_EVEN, stopbits=serial.STOPBITS_ONE, timeout=1 ) # 发送数据 ser.write(b'Hello UART\n') # 读取响应 response = ser.readline() print(response) ser.close()逻辑说明:serial.Serial初始化串口,参数必须和对端设备手册一致。参数说明:parity可选PARITY_NONE、PARITY_EVEN、PARITY_ODD;stopbits可选STOPBITS_ONE、STOPBITS_TWO。如果对端是7位数据位加奇校验,这里就要改成bytesize=serial.SEVENBITS和parity=serial.PARITY_ODD。配置不匹配时,readline会超时或返回乱码。
4.3 CRC校验的Python实现与验证
想理解CRC为什么能检错,自己实现一遍最直接。
def crc16_modbus(data: bytes) -> int: """计算Modbus CRC16""" crc = 0xFFFF for byte in data: crc ^= byte for _ in range(8): if crc & 0x0001: crc = (crc >> 1) ^ 0xA001 else: crc >>= 1 return crc # 测试 test_data = b'\x01\x03\x00\x00\x00\x01' result = crc16_modbus(test_data) print(f"CRC16: 0x{result:04X}") # 输出应为 0x840A逻辑说明:Modbus CRC16初始值0xFFFF,多项式0xA001(反向)。每个字节先异或到CRC低字节,然后逐位处理。参数说明:data是要校验的字节串,不包含CRC本身。发送时把CRC低字节在前、高字节在后附加到数据末尾。接收端对包含CRC的完整帧计算,结果应为0。
这个实现可以直接用在嵌入式Modbus通信里,比查表法省空间,比调库可控。
5. 避坑与排查:数据通信里那些血泪经验
5.1 串口乱码:先查波特率再查线
现象:串口助手收到乱码,偶尔能收到正确字符。原因:波特率不匹配或时钟源误差累积。解决:确认双方波特率一致,检查晶振精度。如果波特率是115200,晶振误差要小于2%。用示波器量一个字节的位宽,115200对应8.68微秒,偏差超过5%就会出错。
5.2 网线超距:100米不是建议是红线
现象:90米能通,110米时通时断。原因:双绞线信号衰减随距离增加,超过100米后眼图闭合。解决:中间加交换机或换光纤。不要用「超五类」「六类」来赌,类别只影响带宽和抗串扰,不改变100米的基本限制。
5.3 双工不匹配:延迟忽高忽低的元凶
现象:ping延迟大部分正常,偶尔跳到几百毫秒。原因:一端全双工一端半双工,半双工端检测到冲突后退避重传。解决:两端都设全双工或都设自协商。如果自协商失败,手动强制全双工。用ethtool eth0查看当前双工模式。
5.4 CRC错误增长:换线之前先看光模块
现象:网卡RX errors持续增长。原因:光模块脏了、光纤弯折半径过小、电口线序错误。解决:先清洁光模块端面,检查光纤弯曲半径大于3厘米。电口用测线仪看线序,1-2、3-6必须成对双绞。如果线序不对,近端串扰会导致CRC错。
5.5 分组交换的缓冲区膨胀
现象:高负载时延迟从1ms涨到100ms。原因:路由器缓冲区过大,队列排满后延迟累积。解决:在边缘设备配置主动队列管理(AQM),如CoDel或FQ-CoDel。Linux下用tc qdisc add dev eth0 root fq_codel开启。这个坑在家庭路由器上特别常见,缓冲区几百毫秒,一下载就卡。
6. 用Python+Scapy做一次端到端差错控制验证
最后一章落到一个具体技巧:用Scapy构造带校验和的数据包,故意改错校验和,观察接收端行为。这个实验能把前面所有概念串起来。
from scapy.all import IP, UDP, Raw, send, sniff # 构造一个正常UDP包 pkt = IP(dst="192.168.1.100")/UDP(dport=9999)/Raw(load=b"hello") send(pkt) # 构造一个校验和错误的UDP包 pkt_bad = IP(dst="192.168.1.100")/UDP(dport=9999, chksum=0x1234)/Raw(load=b"hello") send(pkt_bad) # 在接收端抓包,观察内核是否丢弃 # 接收端运行:sudo tcpdump -i eth0 udp port 9999 -vv逻辑说明:Scapy默认自动计算校验和,手动指定chksum可以构造错误包。参数说明:chksum=0x1234是一个故意错误的校验和。接收端网卡或内核会校验UDP校验和,错误则丢弃,应用层收不到。如果接收端开了UDP校验和卸载,可能网卡不校验,需要ethtool -K eth0 rx off关闭卸载后再测。
这个实验的价值在于:你能亲眼看到差错控制在哪一层生效。如果错误包被丢弃,说明校验和生效;如果应用层收到了,说明校验和没开或被卸载绕过。
我自己的习惯是,每接手一个新的通信链路,先做三件事:用ip -s link看物理层统计,用ethtool看双工和速率,用Scapy发一个错误校验和的包看链路层是否丢弃。这三步做完,基本能判断问题在物理层、链路层还是更上层。数据通信基础不是背概念,是把每个参数和实际现象对应起来。希望帮到你。
本文还有配套的精品资源,点击获取