十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

数据通信原理详解:分层封装、分组交换与差错控制实战

数据通信原理详解:分层封装、分组交换与差错控制实战 刚开始做网络工程那阵子我一度以为数据通信是理论课上学完就忘的东西协议栈、分组交换、差错控制听起来离插根网线就能上网很远。直到后来在项目现场排除故障眼睁睁看着一根光纤里明明有光、物理链路都通可业务就是不通又或者明明误码率极低数据却反复重传。我才意识到那套原理里的每个机制都在真实网络里日夜运转。这篇是数据通信原理介绍的下篇我打算把数据到底如何跨过层层设备安全到达对端中间节点靠什么转发出错后系统怎么自救这些上篇没展开的内容写透给正在学网络基础、或者刚转做数通方向的读者一份可以直接对照排障思路的笔记。1.1 没有分层一次改动就要全链路推倒先想一个最简单的问题两台设备用一根串口线直连需要那么多协议吗不需要。发送方按约定好的波特率把电平发出去接收方按同一节奏采样即可。但现实网络不是两台设备而是成百上千台异构设备互联。我从笔记本访问一个云端服务请求至少要经过无线路由器、光猫、运营商的接入交换机、城域网的汇聚设备、骨干网的多个路由节点最后落到目标服务器。每一段的物理介质可能不同有的是双绞线有的是单模光纤有的是无线空口每一段的服务质量要求也不同视频流需要低时延文件下载需要高吞吐远程登录则需要低丢包。如果整个通信过程不分工任何一处的链路升级、地址规则调整或者应用变更都会迫使整条链路上所有设备一起跟着改。这在工程上是不可接受的。分层模型的核心动机就是把一个大问题切成若干个小问题每一层只需要对上提供稳定的服务、对下利用好底层能力内部怎么改都不影响别人。这就是为什么所有数据通信的讨论都要从分层开始。1.2 快递包裹的类比每一层都在做封装和拆包理解分层最偷懒的办法是看快递。你寄一件商品先自己用气泡膜包好放进纸箱快递公司贴上运单写上收件人和地址分拣中心根据地址分到对应区域的运输车辆卡车司机只负责把车开到下一个城市。整个过程里你不需要知道卡车走哪条高速司机不需要知道纸箱里装了什么分拣员也不关心商品本身的价值。每个人只需要处理好自己负责的那层信息。数据通信的封装也是这个逻辑。应用层的HTTP请求到了传输层会被加上TCP头里面存放源端口、目的端口、序号到了网络层又会被加上IP头里面是源IP、目的IP、TTL到了数据链路层再被加上以太网头里面是源MAC、目的MAC。每一层把上层传下来的整个数据块当作自己的数据部分在前面贴上自己的标签然后继续往下交。接收端则是反向操作从物理层收到一串比特二层先看MAC地址是不是自己的是则剥掉二层头往上交三层看IP地址剥掉IP头继续上送直到应用层看到完整的HTTP报文。你在Wireshark里看到的每一层协议头就是这一路被逐层贴上去的标签。1.3 TCP/IP四层模型的通信语义说给谁、怎么走、对不对现在的数据通信实际运行基础是TCP/IP四层模型不是教科书里那个七层OSI。应用层决定要说什么。HTTP、FTP、DNS、SSH都在这一层它们定义的是业务语义比如请求一个网页、查询一个域名。传输层决定说给谁听、说得对不对。TCP负责建立可靠连接、编号、确认和重传UDP则只负责把数据报扔出去不保证一定到达。这一层最重要的标识是端口号它把同一台主机上的不同应用区分开。网络层决定走哪条路过去。IP地址标识一台主机在网络中的位置路由器依据IP地址查找路由表决定下一跳方向。数据链路层和物理层决定比特在介质上怎么放着走。以太网帧、MAC地址、双绞线里的电信号、光纤里的光信号都在这一层收尾。实际排障时按这个顺序逐层检查思路会非常清晰先看链路层通不通再看网络层能不能路由再检查传输层端口通不通最后才是应用层业务报错。很多刚入行的朋友一上来就抓HTTP包结果发现二层就没起来方向就反了。2. 交换方式数据在节点间穿行的三种不同逻辑分层解决了每层干什么的问题下一个问题是数据从一个节点到下一个节点、再到目的地中间经过那些转发设备时到底按什么规则占用线路。这就是交换方式。传统的通信教科书会把交换方式归纳成三种电路交换、报文交换、分组交换。它们各有各的适用场景而现代数据通信几乎都是第三种。2.1 电路交换先修一条专属通道再说话电路交换的代表是传统电话网。主叫拨号后交换机逐段为用户建立一条物理通路从A地到B地的中间每一段线路都被这一通电话独占直到挂机才释放。好处是通话期间时延非常稳定没有排队没有竞争双方按一个固定的速率说话就行。坏处也相当明显建立通路需要时间而且线路一旦被占用哪怕双方都不说话别人也用不了这段资源。这种交换方式适合恒定速率、持续性的业务比如语音通话。换成计算机数据就非常浪费因为数据业务往往是突发性的可能几分钟安静没数据突然又涌出一大堆再安静。让这种业务独占一条64kbps的话路绝大部分时间都是在浪费带宽。所以后来的计算机网络没有走电路交换这条路。2.2 报文交换与分组交换存储-转发的两个版本报文交换同样先把数据发给相邻节点但没有预先建立连接。每个节点收到完整报文先存下来检查目的地址再按路由策略转发给下一跳。这种方式比电路交换灵活线路利用率更高。问题在于如果报文很大中间节点要把整个报文完整收完才能转发占用大量存储空间也带来明显时延。分组交换是对报文交换的改良发送端把应用层报文切成一个个较小的数据块每个数据块加上协议头后形成独立的分组packet。分组在每个节点上可以边收边转不需要等整个报文都到达。这种先切碎再转发的思路带来几个实在的好处中间节点只需要有限缓存不必为单个大报文准备大容量存储。多个分组可以在不同节点上形成流水线式处理降低端到端时延。某个分组出错或丢失只需重传该分组而不是整个大文件重传。不同用户的分组可以穿插使用同一段链路统计意义上显著提高线路利用率。2.3 数据报与虚电路分组交换内部的两种流派分组交换根据是否需要事先建立连接又分成数据报方式和虚电路方式。数据报方式中每个分组都携带完整的目的地址路由器为每个分组独立选路所以同一个报文的不同分组可能走不同路径到达接收方时顺序可能被打乱需要由高层通常是传输层负责重新排序。IP网络就是标准的数据报方式。虚电路方式则在发送前先通过信令建立一条逻辑连接所有分组沿同一条预先选好的路径依次到达顺序不会乱也更有利于保证服务质量。但虚电路对中间节点状态有要求一旦某个节点宕机所有经过它的已建虚电路都要重新建立。Frame Relay、MPLS这类技术在设计上就带有虚电路思想。实际部署中MPLS常用于需要路径可控、流量工程能力强的骨干网普通互联网走的则是纯数据报模式。三种交换方式的对比如下交换方式时延特性线路利用率是否需建连典型应用电路交换固定低时延低是物理通路PSTN语音、传统专线报文交换时延较高受报文长度影响中否早期电报网络分组交换数据报时延可接受有排队抖动高否IP网络、互联网分组交换虚电路相对稳定高是逻辑连接MPLS、帧中继3. 差错控制噪声环境里数据如何自证清白物理链路不是理想信道。光纤老化、双绞线被强电干扰、接头氧化、无线信号多径衰落任何一项都可能让接收方读到一个与发送方完全不同的比特。数据通信系统必须在协议层面加一道保险让接收方能够判断帧里的数据是否被改过必要时还要能直接还原原始内容。这套机制就是差错控制。3.1 检错码与纠错码一个负责发现一个负责恢复差错控制分成两个流派检错和纠错。检错码只能告诉你这帧数据有问题但说不清是哪一位错了。纠错码不仅能发现问题还能通过冗余信息反推出正确比特。成本差异在于冗余度检错码开销小发现错误后依靠重传来解决纠错码开销大适合传输时延很长、重传代价极高的场景比如深空通信、卫星链路或者磁头和光盘这类读取一次性完成的存储场景。这里要理解一个关键点检错和纠错不是二选一而是可以组合使用。TCP/IP网络里普遍的做法是底层用CRC这类检错码快速把损坏的帧丢掉上层TCP靠序号和确认机制触发重传。这样既节省了底层纠错码带来的大额开销又保证了端到端的可靠性。3.2 循环冗余校验以太网为什么选了这一种循环冗余校验也就是CRC是数据链路层最常见的检错方式。它的思想可以这样理解发送方把待发送的数据当作一个大整数用约定的生成多项式做模2除法只做异或不进位不借位得到的余数就是校验码即帧校验序列FCS。接收方用同一个多项式去除收到的完整数据余数为0说明数据大概率没错不为0就说明帧传输中出现了比特翻转。举个具体例子。假设要发送的数据是1101选生成多项式 G(x)x^31对应二进制除数1001最高次数为3因此需要补3个0。第一步在数据末尾补3个0得到被除数1101000。第二步用1001做模2除法1101 XOR 1001 0100移入下一位0得到01000即10001000 XOR 1001 0001继续移入剩余的0后有效位数已经小于除数最终余数按低3位取值为100第三步真正的发送帧是原始数据拼接余数即1101 100。接收端收到1101100后仍然用1001做模2除法。如果能被整除、余数为0就认为没有错误余数不为0就丢弃该帧同时让上层感知到丢包。CRC的参数选择非常重要不同的生成多项式对应不同的检错能力。实际工程里以太网使用的CRC-32由多项式0x04C11DB7定义检错能力相当强能覆盖所有长度不大于32位的突发错误以及绝大多数更长的突发错误。3.3 自动重传请求ARQ发现错误之后怎么办检错码只能指出错误真正把数据补齐的活要交给自动重传请求ARQ机制。ARQ的基本流程是发送方发数据接收方收到正确数据后回一个确认帧ACK超过一定时间没收到确认发送方就重传。ARQ有几种典型实现效率差别很大。停等式ARQ最老实发一帧等待确认确认到了再发下一帧。实现最简单但吞吐量极低一帧在链路上的传输时间加上往返时间都成了等待开销。回退N帧ARQ允许发送方连续发送多帧如果第k帧出错或丢失接收方从第k帧起后面的帧都不要发送方重传第k帧以及之后所有帧浪费了一部分已经发出去的有效数据。选择重传ARQ则只重传出错的第k帧接收方先把第k帧之后正确的帧缓存起来等第k帧重传成功后再把缓存数据按顺序上交给上层。实现最复杂但链路利用率最高。实际工程中最常见的是TCP的滑动窗口机制它结合了累积确认和超时重传接收方可以连续发回多个ACK发送方在窗口内连续发送数据收到重复ACK时快速重传。你可以把它理解为一种在不可靠的IP数据报传输之上构建可靠字节流的高级ARQ。4. 多路复用与同步一条物理链路如何同时服务N路业务通信资源是稀缺的一根光纤、一段频谱不可能只服务一个用户。多路复用的目标就是在一条共享的物理链路上划分出许多相互隔离的子通道让N路业务同时传输而互不干扰。与此同时所有复用方式都要面对一个基础前提——收发双方必须有共同的节拍否则连比特都对不齐。这两件事是理解物理链路效率的关键。4.1 频分复用与时分复用划分维度完全不同频分复用FDM把信道总带宽切成多个互不重叠的频段每路信号分配一个频段同时在线路上传输。传统广播电视就是典型的频分复用不同频道占不同的频率区间电视机通过调谐器选频把目标频段取出来。光纤通信里的波分复用WDM本质上是光频段的频分复用不同波长的激光在同一根光纤里并行传输互不干扰。时分复用TDM则把时间切成周期性的帧每帧再分成固定数量的时隙为每个用户固定分配一个时隙。时间片轮转用户在自己的时隙里使用整段带宽。和频分复用相比时分复用在数字系统里实现更简单因为它只需要精确的定时不需要复杂的滤波器。但从效率角度看固定时隙分配的缺陷也明显某个用户没有数据发送的时候分配给他的时隙空转别人也不能使用资源利用率上不去。4.2 码分复用靠暗号从同频同时间信号里捞出目标CDMA即码分复用采用了一套完全不同的思路所有用户在时间和频率上完全重叠区别在于每个人使用一组彼此正交的码片序列。发送方用自己专属的码片序列对原始比特做扩频接收方收到混叠信号后拿同一个码片序列做相关运算只认得出与自己匹配的信号其余的都当作噪声。理解CDMA有一个很贴切的生活类比一群人同时在一间屋子里讲话每个人都用自己听得懂的方言。你想听那个说粤语的朋友的内容那你就只盯着他发出的声音去理解其他语言形成嗡嗡声干扰但并不妨碍你提取出目标信息。CDMA的实际工程复杂度不低涉及功率控制、码同步、多径干扰抑制等问题但在第三代移动通信系统中曾是主流空口技术也正是在它身上我第一次真正理解了什么叫做用正交性换容量。4.3 统计复用与现代分组网络的效率逻辑数据通信中真正主导的是统计复用。统计复用的核心思想是谁有数据谁就用不固定分配时隙或频段。多个用户的数据分组在链路上按到达顺序排队发送空闲用户让出的带宽自动被活跃用户使用。因为数据业务天然具有突发性所有用户同时处于峰值概率极低统计复用可以做到用户看到的带宽比平均分配时大得多。这个效率可以用一个直观的量化指标来体会设业务的平均到达速率是λ链路服务速率是μ则线路利用率ρλ/μ。ρ越接近1意味着线路越繁忙但排队等待的时间也会快速增长当ρ超过1时排队队列会无限增长系统趋于不稳定。这就是为什么链路带宽规划不能只看平均流量必须同时考虑峰值突发和容忍时延。实际网络监控中我见过一些链路平均利用率只有40%但高峰时刻瞬时流量飙到90%以上排队时延明显增大应用体验立刻下降。这就是统计复用世界里平均和瞬时的差距。4.4 同步机制比特、字符、帧的三层节拍链路划分得再细接收方也得知道一个比特从什么时候开始、持续多久、一个字符或帧从哪里开始。同步分为三个层级。位同步要求收发双方对每个比特的持续时间有共同标准接收方通常用锁相环从数据信号里恢复出时钟曼彻斯特编码则干脆把时钟信息混合在信号里用电平的中间跳变来指示位边界。字符同步解决哪几位属于同一个字符的问题异步串口通过在字符前加起始位、字符后加停止位来隔离每个字符。帧同步则解决一个数据帧从哪里开始到哪里结束的问题以太网用前导码加帧起始定界符对齐帧边界再通过帧长度字段判断结束位置。实际排障中同步问题最常见的表现就是通了但全是乱码。串口设备的波特率设置不一致、双绞线收发线序不对、交换机端口自协商失败导致两端工作在半双工与全双工不匹配都会造成大量帧错误。遇到这类现象别急着怀疑上层协议先确认物理层和二层的基本参数有没有对齐。5. 从原理到实战数据通信项目实施中的关键判断前面几章讲的都是教科书上的核心概念但真正落到项目里时你会发现原理是底层约束工程是权衡取舍。最后这部分我想聊聊那些原理在现实中如何落地以及我在实际项目里踩过的一些坑。5.1 链路预算带宽估算不能只看峰值做数据通信方案设计首先面临的问题就是这条链路需要多大带宽、需要多高的可靠性。很多人按峰值流量乘个1.5倍系数就拍板结果出现拥塞或者丢包。我建议按这个思路做估算明确业务类型是恒定速率还是突发型。视频会议、语音这类是恒定速率文件备份、虚拟机迁移是明显的突发型。统计并发用户数和每用户平均速率算出平均流量。突发型业务还要再乘一个峰值系数通常按用户行为的汇聚比来定比如办公场景常见汇聚比在10:1到20:1之间。用ρλ/μ粗略评估链路利用率让设计峰值利用率不要超过70%。因为一旦利用率超过70%~80%排队时延的上升会非常明显。再叠加冗余保护需求。链路保护要预留50%以上的余量否则主用链路故障切换后备用链路会直接拥塞。这套方法不需要复杂的排队论软件但对项目初期的带宽申请和设备选型非常实用。5.2 传输介质和信号方式的选型介质选型的本质是距离、速率、成本和抗干扰的权衡。短距离室内布线普遍用双绞线六类线在100米内支持千兆六A类支持到万兆但超过100米就必须考虑光缆。楼宇间或跨园区长距离传输单模光纤是必然选择搭配不同速率的模块从10G到400G都有成熟方案。无线介质适合无法布线的场景但空口资源是共享的实际吞吐和信号质量、用户数量关系极大并不适合作为高保障低时延业务的主链路。双绞线和光纤的取舍还涉及电磁干扰问题。工业现场有大功率电机或变频器双绞线的屏蔽层处理不好就会引入大量干扰甚至误码宁可多花成本用光缆也不要指望软件层反复重传。光纤的优势不止在带宽更在于天然电气隔离在许多复杂电磁环境下是唯一可靠选项。5.3 四个容易翻车的实际环节翻车一设备接口协商不一致。交换机和网卡之间如果自协商失败链路会回落到10M半双工业务慢得明显。排查手段是先看端口状态和错误计数错误计数中CRC错和晚期冲突飙升就要怀疑双工不匹配或网线质量问题。稳妥做法是两端固定成同一速率和双工模式至少做到双工强制一致。翻车二二层环路导致广播风暴。数据链路层没有环路保护机制交换网络里两条互连链路就可能形成环路广播帧在里面无限转发瞬间打满所有端口。STP生成树协议就是为应对环路而生的它会阻塞冗余端口只在主链路断开后重新协商。项目里任何有冗余链路的二层网络都必须启用STP并且开启BPDU保护功能防止用户私自接入交换机诱发环路。翻车三忽略MTU不一致。以太网标准MTU是1500字节如果某段链路启用MPLS或PPPoE或使用隧道技术实际承载的有效载荷会小于1500。当两端MTU不一致且没有PMTUD路径MTU发现配合时大包直接被丢弃小包却能正常通行。典型现象是网页能打开但大附件上传失败ping大包不通、小包通。排查时用ping加不分片标志逐段探测MTU立刻就能定位。翻车四错把重传率高当链路问题。TCP丢包重传率高时首先被怀疑的是运营商线路误码但很多时候是接收窗口太小或者应用本身有性能瓶颈TCP被饿住了。此时不要只看重传率还要抓包确认是否存在零窗口通告零窗口说明是接收端应用处理不过来而不是链路丢包。链路误码往往伴随底层CRC错误要把二层差错计数的证据一起看再作结论。6. 最后再说一点个人体会写到这里数据通信原理里我认为最影响实战的部分基本都覆盖了分层封装、交换方式、差错控制、复用与同步还有项目中积累的判断方法。这些内容初看都是孤立的概念时间久了你会发现它们其实是一条线分层告诉你数据在逻辑上怎么组织交换方式告诉你数据在节点间怎么流动差错控制保护数据不被噪声破坏多路复用让有限资源服务更多业务同步又保证一切努力都建立在对齐的节拍上。我个人最深的体会是遇到网络问题不要一开始就想是不是路由器坏了、光纤断了先问自己三个问题——这条数据现在走到哪一层了正常情况下这一层应该发生什么当前现象和正常状态差在哪里把这三个问题回答清楚八成问题都能在半小时内定位到具体环节。数据通信的复杂并不在于某个概念难懂而在于每一层都可能出问题而且层与层之间的表现会互相掩盖。能一层层拆开、看见背后的机制这本身就是这个领域最有价值的乐趣。
返回列表