当前位置: 首页 > news >正文

计算机网络5

接上节——计算机网络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.dtcms.com/a/503777.html

    相关文章:

  • 【论文笔记】李飞飞 世界模型RTFM
  • 微信小程序开发哪个好优化关键词排名工具
  • Text2SQL与工作流实现:让数据库查询变得轻松又高效
  • 【Android】浅析 Android 的 IPC 跨进程通信机制
  • C#11--14新特性
  • 力扣热题100道之最大子数之和
  • 手机网站开发c 教程一嗨租车网站建设的功能特色
  • 购物网站 app网站建设时应该做的优化
  • 深圳网站建设raygf2022年免费ppt模板下载
  • 【Python】二.判断语句
  • 【数据集】最新全国景区A-5A级景区数据集(更新至2025年)-含矢量及Excel详细
  • Linux线程 --- 线程控制、pthread线程库、线程栈、线程本地存储
  • C++:从0开始学习链表(练习)
  • JAVA的Set集合类
  • linux系统中进程控制
  • 网站域名注册证书是什么视频拍摄设备
  • 下载 LibreCAD 并创建个人分支的 Git 操作指南
  • 石家庄大型网站建站网站开发能从事那些职业
  • JavaScript性能优化实战大纲性能优化的核心目标
  • 【Android】布局优化:include、merge、ViewStub的使用及注意事项
  • PHP 桌面端框架NativePHP for Desktop v2 发布!
  • 第7章 muduo编程示例(2)
  • 哪里有放网站的免费空间无锡市政务服务网站建设项目
  • 为什么Unity修改过物体,物体的位移和旋转还是会被改变
  • Dify 平台从 x86_64 迁移至 ARM64 架构完整指南
  • 站嗨建站适合小白的室内设计软件
  • 基于车速预测的燃料电池混合动力汽车能量管理策略:一种自适应ECMS方法及其Python实现
  • [嵌入式系统-149]:新能源汽车的三电系统以及其功能、硬件架构、嵌入式操作系统
  • 在iStoreOS系统中安装Docker:从基础到高级应用的完整指南
  • 建设银行 网站查询密码杭州清风室内设计学校