计算机网络5 - 指南

news/2025/11/15 18:41:05/文章来源:https://www.cnblogs.com/gccbuaa/p/19226035

接上节——计算机网络4

停止等待协议

数据传输时的四种情况:

  • 正常:DATA0 → ACK0 → DATA1 → ACK1
    作用:说明“发一帧、等确认、再发下一帧”的基本节拍(流量控制)。

  • 数据帧出错(收到但校验错)
    处理:B 回NAK0(或沉默不回 ACK)→ A 重传 DATA0。
    体现:差错控制;错误由 NAK/无ACK + 超时触发重传。

  • 数据帧丢失(B完全没收到)
    处理:A 等不到 ACK超时→ 重传 DATA0。
    体现:超时重传机制保证最终送达。

  • 确认帧(ACK)丢失(B已收妥数据)
    处理:A 等不到 ACK 超时 → 重传 DATA0;
    B 用序号(0/1) 识别为重复帧丢弃素材但再发 ACK0
    体现:序号判重确保“不重复上交、仍可继续前进”。

    event_type

    • frame_arrival—— 帧到达(有效帧/ACK 到来)。

    • cksum_err—— 校验错误(收到的帧损坏)。

    • timeout—— 超时(未在规定时间内收到期望的 ACK)

    1) Protocol 1 — Utopia(理想单工)

    假设:信道无差错;接收端处理能力无限。
    目的:演示最根本的“从网络层取包→封成帧→发出”的单向数据流。
    机制:无 ACK、无计时器、无序号、无流量控制。
    核心循环

    • Sender:from_network_layer → s.info=buffer → to_physical_layer(一直泵数据)

    • Receiver:wait_for_event(frame_arrival) → from_physical_layer → to_network_layer
      意义:仅用于引入接口与数据路径;不具备工程可用性。

    2) Protocol 2 — Stop-and-Wait(流量控制,信道仍“理想”)

    假设:信道无差错;但接收端缓存/处理速度有限。
    目的:防止发送端“淹没”接收端——流量控制
    机制:发一帧就停等接收端的“许可”(dummy/确认帧)再发下一帧;仍无差错控制。
    核心循环

    • Sender:发一帧 → wait_for_event(等对端许可)

    • Receiver:from_physical_layer → to_network_layer → to_physical_layer(s)(回一个允许/占位确认,唤醒发送端)
      关键词停—等= 每次只允许1个在途帧(窗口=1),克服流量控制而非可靠性。

    3) Protocol 3 — Stop-and-Wait ARQ(有噪声单工,可靠传输)

    假设:信道可能丢帧/出错/ACK丢失
    目的:在不可靠信道上构建可靠、按序、恰好一次交付。
    新增机制

    • 序列号(1 bit:0/1)——判重与判新;

    • ACK(肯定确认)——对已收妥的帧确认;

    • 计时器(timeout)——ACK没来就重传

    • 事件集:frame_arrival / cksum_err / timeout
      核心循环

    • Sender:装帧(带 seq) → 发送 → start_timerwait_for_event → 收到匹配 ACKstop_timer & 换下一个;否则超时重发。

    • Receiver:到达就校验;若 r.seq==frame_expected 则上交并切换期望号;否重复就是无论都回 ACKack=1-frame_expected)。
      关键词ACK + Timer + Seq(0/1)三件套 = 可靠的停—等。

    4) Protocol 4 — One-Bit Sliding Window(双工,捎带确认)

    假设:有噪声;双向同时通信(两端同构)。
    目的:在全双工下维持可靠传输与更高信道利用率。
    新增机制

    • 仍是窗口=1(本质还是停—等),但双向

    • 捎带确认(piggybacked ACK):把对对方上一帧的 ACK 塞进自己要发的帧头;

    • 两端都维护:next_frame_to_send(发端窗口左边界)与 frame_expected(收端窗口左边界)。
      核心循环(两端对称)

    • 处理入站:若 r.seq==frame_expected → 上交并 inc(frame_expected);若 r.ack==next_frame_to_send → 停表并 inc(next_frame_to_send)

    • 构造出站帧:s.seq=next_frame_to_send; s.ack=1-frame_expected; to_physical_layer; start_timer
      关键词双工 + 捎带ACK + 1bit序号;效率高于单向停—等。

    滑动窗口协议

    三种

    one-Bit

    后退N帧

    Go-Back-N 协议 中:

    • 发送方窗口大小 = N(可以连续发送 N 帧,不必等每个确认)

    • 接收方只按顺序接收:

      • 如果收到了期望的帧(按顺序的),就发送 ACK;

      • 如果收到乱序帧(比如期望1却收到了2),就丢弃并重复发送上一个确认号(ACK0)

    • 当发送方超时或收到累计确认时:

      • 若帧 i 超时,则从i 开始的所有未确认帧都要重发

    累积确认机制
    若收到 ACK k,表示 0~k 的所有帧都已正确收到。

    数据链路层采用后退 N 帧(GBN)协议,发送方已发送了编号为 0~7 的帧。
    当计时器超时时,若发送方只收到了 0、2、3 号帧的确认,则发送方需要重发的帧是 4567

    名称类型/取值含义/作用出现场景
    MAX_PKT常量(如 1024)网络层包packet.data 的最大字节数protocol.h
    MAX_SEQ常量(=1 于 Prot.3/4)序列号最大值(一位序号 → 取值 {0,1})Prot.3/4
    booleanenum {false,true}自定义布尔类型protocol.h
    seq_nrunsigned int序列号/确认号的数值类型全部协议
    frame_kindenum {data, ack, nak}帧类别:素材/确认/否认protocol.h
    event_typeenum {frame_arrival, cksum_err, timeout}(Prot.2 为 {frame_arrival}wait_for_event() 可能返回的事件类型Prot.2/3/4
    packetstruct { unsigned char data[MAX_PKT]; }网络层交付的素材单元全部协议
    framestruct { frame_kind kind; seq_nr seq; seq_nr ack; packet info; }链路层帧:头部(kind/seq/ack) + 负载(info)全部协议
    名称类型/取值含义/作用出现场景
    next_frame_to_sendseq_nr(0/1)发送窗口左边界/ “将要发送或刚发送的帧号”。收到匹配 ACK 后自增(0↔1)Prot.3/4
    sframe发送缓冲帧:待发或等待确认的那一帧(用于可能的重传)Prot.1/2/3/4
    bufferpacket当前待发的网络层包(由 from_network_layer() 取来)全部协议(发送端)
    eventevent_typewait_for_event() 返回的当前事件全部协议
    s.infopacket装入待发数据(帧负载)全部协议
    s.seqseq_nr待发帧的序列号Prot.3/4
    s.ackseq_nr捎带确认号(Prot.4)或专用 ACK 帧的确认号(Prot.3)Prot.3/4
    名称类型/取值含义/作用出现场景
    frame_expectedseq_nr(0/1)接收窗口左边界/ “期望收到的下一帧编号”;收到期望帧后自增(0↔1)Prot.3/4
    rframe接收缓冲帧:刚从物理层取到的帧Prot.1/2/3/4
    r.infopacket接收帧中的数据,交给网络层全部协议(接收端)
    r.seqseq_nr收到帧的序列号,与 frame_expected 比较判新/重复Prot.3/4
    r.ackseq_nr收到帧中携带的确认号(用于发送端停止计时、推进窗口)Prot.3/4
    s.ack(接收端构造)seq_nr = 1 - frame_expected要回给对端的确认号(确认上一帧)Prot.3/4(回 ACK)
    名称含义/作用触发/配合的变量
    wait_for_event(&event)阻塞等待事件frame_arrival / cksum_err / timeoutevent
    start_timer(s.seq) / stop_timer(s.ack)已发送但未确认的帧启动/停止超时计时s.seqs.acknext_frame_to_send
    to_physical_layer(&s) / from_physical_layer(&r)发/收 的抽象接口sr
    from_network_layer(&buffer) / to_network_layer(&r.info)取/交 网络层包 的接口bufferr.info
    inc(k)序号循环自增宏:k = (k < MAX_SEQ) ? k+1 : 0next_frame_to_sendframe_expected

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/966443.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    2025年境外商务出差保险哪里有卖:TOP10平台专业解析

    2025年境外商务出差保险哪里有卖:TOP10平台专业解析在当今全球化的商业环境中,境外商务出差已成为众多企业和商务人士的常态。然而,对于有境外商务出差需求的人来说,面临着诸多难题。“选品难(产品繁杂无从下手)…

    2025年开除申诉靠谱机构推荐:专业学术申诉机构评测指南!

    2025年开除申诉靠谱机构推荐:专业学术申诉机构评测指南!留学途中遭遇学术紧急情况?面临开除、停学或学术不端听证会,一家靠谱的申诉支持机构至关重要。本文基于教育部涉外监管认证信息、机构服务响应速度、申诉成功…

    Day39(9)F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project01\jdbc-demo+springboot-web-quickstart

    DQL条件查询-- =================== DQL: 条件查询 ====================== -- 1. 查询 姓名 为 柴进 的员工 select * from emp where name = 柴进;-- 2. 查询 薪资小于等于5000 的员工信息 select * from emp where…

    # Android Compose 实现 左滑删除

    Android Compose 实现 左滑删除Android Compose 实现 左滑删除 直接看源码 private enum class CardState {Collapsed /* 收缩 */, Expanded /* 展开的 */ // 哈哈哈,还能学点英文 (: } @Composable private fun Pers…

    win10pro sn

    win10pro snVK7JG-NPHTM-C97JM-9MPGT-3V66T

    完整教程:PMBT2222A,215 开关晶体管功率二极管 NXP安世半导体 音频放大电路 LED驱动 应用

    pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

    用递归的方式输出各位数字

    include <stdio.h> include <stdlib.h> void f(int n){ if(n<10){ printf("%d ",n); return; }//输出到最后一位 else{int r=0;int x=n;int k=0;//n是k位数while(x!=0){r=x%10;x=x/10;k++;}i…

    WebServer类 - 指南

    WebServer类 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "C…

    EFCore中巧妙利用ToQueryString()实现批插(不借助第三方包)

    dotnet10发布了,ef10也快发布了,但是还是只有批量更新(ExecuteUpdateAsync)和批量删除(ExecuteDeleteAsync)功能,没有批量插入。 今天给个办法,在不引用第三方库的情况下,巧妙利用ToQueryString()实现批插。 …

    2025 年 11 月门窗十大品牌综合实力权威推荐榜单,产能、专利、环保三维数据透视

    引言 2025 年 10 月门窗十大品牌综合实力权威推荐榜单由中国建筑金属结构协会、全国工商联家具装饰业商会联合发布。本次榜单突破传统单一性能评选模式,以《铝合金门窗》(GB/T 8478-2008)为技术底版,创新性构建 “…

    20232426 2025-2026-1 《网络与系统攻防技术》实验五实验报告

    20232426 2025-2026-1 《网络与系统攻防技术》实验五实验报告 一、实验目标选择指定域名,用要求工具查询DNS、IP相关信息及地理位置。 获取某平台好友IP并查询其具体地理位置。 用nmap扫描靶机,确认其活跃度、端口、…

    AzuraCast:自托管一体化网络电台管理套件

    AzuraCast是一个功能强大的自托管网络电台管理套件,提供完整的电台解决方案,包括流媒体广播、节目编排、用户管理和API接口,支持多种广播格式和协议,轻松搭建专业级网络电台。AzuraCast:自托管一体化网络电台管理…

    2025年11月安徽省有实力的旧房翻新企业综合推荐排行榜

    摘要 随着国内城市化进程加速和居民生活品质提升,2025年旧房翻新行业迎来爆发式增长,安徽省特别是合肥地区的旧房翻新需求显著上升。本文基于行业数据、用户口碑、技术实力等多维度评估,为您推荐2025年11月安徽省最…

    【前缀和+差分+二分】LeetCode 2528. 最大化城市的最小电量

    View Post【前缀和+差分+二分】LeetCode 2528. 最大化城市的最小电量题目 https://leetcode.cn/problems/maximize-the-minimum-powered-city/description/ 题解 以stations = [1,2,4,5,0], r = 1, k = 2为测试用例进行…

    Springboot启动时记录进程ID

    Springboot启动时记录进程ID 1. 背景说明 springboot项目打包成可执行jar包以后,需要通过java -jar xxx.jar启动项目.启动方式对非技术人员不太友好.所以需要项目构建时,生成一个start.bat和stop.bat的脚本.关闭采用ta…

    019数据结构之栈——算法备赛 - 实践

    pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

    详细介绍:【Linux】07.Ubuntu开发环境部署

    pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

    GESP考试报名附考试报名流程

    GESP 考试报名 附考试报名流程 一、考试时间安排 1.报名时间 一般为每次认证考试前1-2个月,具体时间以GESP官网公布时间为准。 2.考试时间 CCF每年安排4次GESP认证考试,分别在3月、6月、9月和12月。2025年的考试时间…

    2025 最新电缆品牌权威推荐:耐火 / 阻燃 / 智能 / 光伏等全品类优质厂商榜单,附国际认证测评

    引言 随着全球电力基建、新能源产业及智能建筑的高速发展,电缆作为核心传输载体,其品质直接决定工程安全与运行效率。据国际电线电缆制造商协会(ICEA)最新测评数据显示,全球合格电缆产品仅占市场总量的 68%,32% …

    2025 最新电缆制造厂家推荐!电缆品牌权威榜单发布,耐火 / 智能 / 特种电缆优选企业全解析

    引言 随着全球能源转型与工业智能化加速,电缆作为核心基础设施的战略价值愈发凸显。据国际电线电缆制造商协会(ICEA)最新测评数据显示,全球优质电缆品牌市场集中度仅 32%,超 60% 的采购风险源于产品质量不达标与技…