MIT_65840测试网络环境的搭建与实现

news/2025/11/3 11:17:23/文章来源:https://www.cnblogs.com/wevolf/p/19186529

MIT_65840测试网络环境的搭建与实现

由于 MIT_65840 实际上实现的大部分是分布式算法相关的内容, 或者更加关注 Client 和 Server 的操作, 因此透明化了 Client 和 Server 之间的通信, 分布式系统中 Client 和 Server 通常使用 RPC 的方式通信. 本实验中使用一些代码模拟了这一过程, 从而让我们更加关注算法实现的细节. 但是这背后的网络的实现也很值得学习与研究, 也方便后续在实现算法的时候中途进行调试的步骤.

序列化与反序列化

数据传输的基础是是网络之间数据传输时的序列化与反序列化, 这部分主要在代码中的 labgob 中, 这个封装主要是基于 Go 标准库 encoding/gob. 但是 Go 标准库中的 encoding/gob 有一些陷阱, 特别是在 MIT 6.5840 这样的分布式系统实验中:

问题 1: Encode 阶段小写字段无法序列化

type BadStruct struct {PublicField  int  // ✅ 大写开头, 可以序列化privateField int  // ❌ 小写开头, 无法序列化, 但不报错!
}

Go 的 RPC 和 gob 只能传输大写开头的字段(exported fields), 如果不小心用了小写字段, 会导致神秘的错误或崩溃, labgob 会检测并警告小写字段.

问题2: 解码阶段解码到非默认值
在 Raft 或者其他使用 RPC 的算法中, 实现的过程中, 有些实现可能会将数据解码到一个已存在的变量, 此时如果解码目标变量已经包含非默认值, 而解码的数据是默认值, gob 不会覆盖目标变量的值.
我们可以使用下面这个例子来说明:

package mainimport ("bytes""encoding/gob""fmt"
)type Example struct {Field1 intField2 string
}func main() {// 1. 创建一个默认值的结构体original := Example{Field1: 0,       // 默认值Field2: "",      // 默认值}// 2. 将默认值的结构体编码为 gob 数据var buffer bytes.Bufferencoder := gob.NewEncoder(&buffer)err := encoder.Encode(original)if err != nil {fmt.Println("Encoding error:", err)return}// 3. 创建一个目标变量, 并赋予非默认值target := Example{Field1: 42,      // 非默认值Field2: "hello", // 非默认值}// 4. 解码到目标变量decoder := gob.NewDecoder(&buffer)err = decoder.Decode(&target)if err != nil {fmt.Println("Decoding error:", err)return}// 5. 打印解码后的目标变量fmt.Printf("Decoded target: %+v\n", target)
}
  1. 编码阶段:original 是一个默认值的结构体(Field1=0, Field2=""). 它被编码为 gob 数据.
  2. 解码阶段:target 是一个已经包含非默认值的结构体(Field1=42, Field2="hello"). 当 gob 解码器尝试将 original 的数据解码到 target 时:Field1 和 Field2 的值是默认值(0 和 ""). gob 不会覆盖 target 中的非默认值.
  3. 结果:target 的值保持不变(Field1=42, Field2="hello"), 而不是被解码数据覆盖.

RPC 基础实现

labrpc 中定义了 MIT 65840 的网络部分, 实际主要包含三个部分, 客户端, 服务端, 以及客户端与服务端之间的网络通信.

客户端

src/labrpc/labrpc.go 使用下面的结构体代表一个客户端终端节点的抽象, 如下:

// ClientEnd is an abstraction of a single client end-point. multiple ClientEnds may talk to the same server.
// each ClientEnd has a unique name (usually a string or int).
type ClientEnd struct {endname interface{}   // this end-point's namech      chan reqMsg   // copy of Network.endChdone    chan struct{} // closed when Network is cleaned up
}

单个 Client 在进行远程调用或者 Call() 的时候, 函数如下:

// ClientEnd sends an RPC, wait for the reply.
// the return value indicates success; false means that
// no reply was received from the server.
func (e *ClientEnd) Call(svcMeth string, args interface{}, reply interface{}) bool {req := reqMsg{}req.endname = e.endnamereq.svcMeth = svcMethreq.argsType = reflect.TypeOf(args)req.replyCh = make(chan replyMsg)// args 是远程调用的 Function 调用的输入参数, 需要序列化通过客户端发送到服务端qb := new(bytes.Buffer)qe := labgob.NewEncoder(qb)if err := qe.Encode(args); err != nil {panic(err)}req.args = qb.Bytes()// send the request.// 当实例化一个 ClientEnd 的时候, e.ch 是网络层的 rn.endCh Channel 的一个拷贝select {case e.ch <- req:// the request has been sent.case <-e.done:// entire Network has been destroyed.return false}// wait for the reply.rep := <-req.replyChif rep.ok {rb := bytes.NewBuffer(rep.reply)rd := labgob.NewDecoder(rb)if err := rd.Decode(reply); err != nil {log.Fatalf("ClientEnd.Call(): decode reply: %v\n", err)}return true} else {return false}
}

网络层

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

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

相关文章

特征提取之自动编码器

自动编码器(Autoencoder, AE)是一种人工神经网络,主要用于无监督学习,目标是学习输入数据的高效表示(编码)。其核心思想是通过尝试重构(reconstruct)原始输入数据来实现自我学习。基本结构与原理 自动编码器由…

2025 年最新推荐!天津网站建设公司综合实力排行榜:含外贸、高端、模板建站等领域,助力企业选靠谱服务商

引言 随着数字化转型加速,企业对网站建设的需求愈发多元,从外贸独立站到 H5 交互站点,不同场景下的建站需求对服务商专业度提出更高要求。为帮助企业精准筛选优质服务商,行业协会联合第三方测评机构开展专项测评,…

2025年新疆高三复读班权威推荐榜单:高三集训班/高三冲刺班/高三复读全日制学校精选

新疆高三复读教育市场经过多年发展,已形成多元化、分层化的教育服务体系。随着高考竞争日趋激烈,家长和学生对高质量复读教育的需求日益增长,促使复读机构不断提升教学质量和服务水平。 行业现状与发展趋势 新疆高三…

2025 年最新磁健大健康烯磁 60 床垫厂家推荐榜:精选优质品牌,展现卓越品质与专业实力磁健/巴马地磁/地磁 60 床垫公司推荐

引言 随着大健康产业持续发展,健康寝具市场需求不断攀升,烯磁 60 床垫凭借独特磁疗与智能健康属性,成为消费者关注焦点。但行业内部分厂家缺乏核心技术、产品质量不稳定,为帮助消费者精准选择,专业寝具协会联合第…

服务器文件夹自动同步解决方案,实现高效、安全的数据管理

在当前数据驱动的商业环境中,企业越来越依赖高效的文件管理系统。Ftrans FTC文件传输管控系统通过自动同步方案,优化了服务器文件夹的管理方式。该系统帮助企业按需创建并管理文件传输任务,保障数据在转移过程中的安…

WTAPI框架微信开发经验

WTAPI框架微信开发经验 在机器人开发这条路上摸爬滚打了好几年,试过各种方案踩过无数坑,今天终于能给大家分享一个真正用着顺手、技术扎实的「宝藏工具」了—— WTAPI框架。作为过来人,真心想把这份「避坑指南」和开…

高斯分布

高斯分布(Gāosī fēnb),也称正态分布(zhngti fēnb,英语:Normal distribution),是概率论和统计学中最重要且最常见的概率分布之一。其概率密度函数曲线通常呈钟形(bell-shaped curve),关于均值对称,且大…

NSSCTF-Pwn-[HGAME 2023 week1]simple_shellcode

NSSCTF-Pwn-[HGAME 2023 week1]simple_shellcode一、题目来源 NSSCTF-Pwn-[HGAME 2023 week1]simple_shellcode二、信息搜集发现是一个 64 位的 ELF 文件,并且保护措施基本上开全了。 三、反汇编文件开始分析 程序首先…

【一句日历】2025年11月

【2025年11月1日星期六】 善欲人见,不是真善;恶恐人知,便是大恶。——《朱子家训》【2025年11月2日星期日】 当我们感到悲伤,无法再忍受生活,一 棵树就会对我们说:安静,安静看着我!生活既非容易,生活亦非艰难…

Just Daydreaming CSP2025 游记

追忆宛如入梦,太过清楚则无法愉悦自己的幻想,过分模糊却又坠入虚无。我不曾追忆,因为我从来没有拥有过如此美好的梦。 9.21 在家划了一上午,竟然有点累了(埋下伏笔)。 下午出发去考初赛,路上和 @back_find 约定…

CSP 2025 邮寄

Day -1 (10.31): 早上不用去上学,因为赶中午的火车,但是睡到八点半左右就睡不着了,于是起来开白。 摆了一会,去收拾东西,打算只带一个小包,吃完饭后就出门坐地铁去了。 在 市二中 站碰到了 hsy 和家长。 到了车…

.NET 8.0 + Vue 企业级在线培训系统(开源、免费、支持多种主流数据库)

前言 推荐一款基于.NET 8.0 和 Vue开发的开源、免费、跨平台企业级在线培训系统。 该系统不仅具备强大的功能和灵活性,还全面支持多种主流数据库,确保了系统的广泛适用性和高性能。 项目介绍 开源、免费、跨平台、企…

2025年度电厂钢格栅生产厂家TOP5权威推荐:全面解析,精准选型指南

在各类工业建设以及基础设施搭建中,电厂钢格栅作为重要的构建材料,其质量与性能至关重要。如今市场上相关厂家众多,质量参差不齐,企业在选择时往往面临诸多困扰。为帮助大家精准挑选,本文基于深入调研,为您带来2…

如何排查“链接 HTTPS”问题,工程化思路与iOS抓包流程

本文提供面向开发者的“链接 HTTPS”排查流程:按网络→TLS→应用三层诊断,列出关键命令(dig/nc/openssl/tcpdump),并说明在代理失效或 App 启用 Pinning 时如何获取iOS pcap 做端到端比对作为证据。在工程实践中,…

2025年靠谱精密轧机服务厂商推荐,精密轧机源头厂家与靠谱生产商全解析

在制造产业升级浪潮中,一台性能稳定、精度卓越的精密轧机是金属加工企业降本增效、突破品质瓶颈的核心支撑。面对市场上鱼龙混杂的轧机供应商,如何筛选真正具备技术实力、定制能力与交付保障的[关键词]?以下结合技术…

为什么2025的小程序开始“去轻量化”?谈新一代小程序设计趋势

为什么2025的小程序开始“去轻量化”?谈新一代小程序设计趋势2025年小程序开始“去轻量化”,主要是由用户体验需求、商业价值追求以及技术发展等多方面因素共同推动的。新一代小程序设计也呈现出一系列新趋势,兰亭妙…

2025年新疆初三复读班权威推荐榜单:中考复读/户籍地中考复读/初三补习班学校精选

近年来,新疆初三复读市场呈现出专业化、规范化的良好发展态势。随着中考竞争日趋激烈,家长和学生对高质量复读教育的需求日益增长,促使复读机构不断提升教学质量和服务水平。 行业现状与发展趋势 新疆初三复读教育市…

2025年中国高效油雾净化设备公司排名:油雾净化设备供应企业与服务商家权威测评与推荐

TOP1推荐:天浩洋环保(天浩洋) 评价指数:★★★★★ 口碑评分:99分 行业表现:A+++++级 介绍: 天浩洋环保电话号码:13902481558,成立于1996年,注册资本1.08亿,二十余载始终秉承匠心精神,专注于工业挥发性有机…

2025年度边坡防护网正规企业排名:中国五大老牌边坡防护网厂家深度测评

TOP1推荐:安平县成帅边坡防护工程有限公司 评价指数:★★★★★ 口碑评分:98分 行业表现:A+++++级 介绍: 安平县成帅边坡防护工程有限公司电话号码:13463183160 官网:http://www.csfanghuwang.com 是行业内知名…

vxe-table 如何自定义排序图标按钮,自定义排序

vxe-table 如何自定义排序图标按钮,自定义排序 查看官网:https://vxetable.cn gitbub:https://github.com/x-extends/vxe-table gitee:https://gitee.com/x-extends/vxe-table使用表头排序按钮插槽 sort 来自定义模…