年夜饭刚收桌,我妈就开始交代第二天的任务:明天去你舅舅家,九点到,别空手,进门先叫人,递茶要双手接。我嘴上应着好好好,脑子里却自动把它翻译成了一个通信流程——角色明确了,时序定好了,异常处理也有了,连“双手接茶”都像是应用层里定义的一个字段校验规则。那一刻我意识到,技术人过年,真是连走亲访友都能看成一套协议。
这期文老师课堂做春节特别版,不聊晦涩的RFC文档,就聊一件事:把我们过年走亲访友这件事,拆成一个个协议场景来理解。串门、对暗号、一屋子人抢话、家族群里发红包、起身告辞——每一个环节背后,都藏着一类高频技术协议。从SPI、I2C、UART,到CAN、Modbus、MQTT,再到TCP的三次握手指四次挥手、TLS的证书认证,我会逐个用走亲戚的视角把它们讲明白。不管你是做嵌入式的、搞上位机的、写后端的,还是刚入门的学生,这篇都能当一份“春节技术唠嗑指南”来用。看完你再走进亲戚家门,估计满脑子都是报文。
1. 从年夜饭到敲门:走亲戚本身就是一套分层协议
1.1 协议的本质:先约好,再说话
我见过不少刚入行的朋友,一听到“协议”两个字就头大,觉得那是一堆复杂的二进制、帧格式、校验位。但说白了,协议就是“先约好,再说话”。你跟一个素未谋面的人打电话,第一句肯定是“喂,请问是XX吗”——这就是建立会话前的身份确认。对方说“你打错了”——这就是收到了一个响应,但状态码不是你期待的200。就这么简单。
人与人交流,其实自带一套隐式协议:你说普通话、我说普通话,这是语法约定;两个人语速一个飙车一个散步,这是时序问题;对方说“我到了”,你得确认“看到了”,这是可靠传输。走亲访友同理——几点到、带什么、进门什么流程、饭桌上聊什么话题、什么时候该起身告辞,这些全是约定。
1.2 用OSI七层模型复盘一次拜年
如果你能把一次完整的“上门拜年”套进OSI七层模型,那协议分层的概念基本就焊死在脑子里了。我去年在课上就这么讲过一遍,后来好几个同学私信说,以后再也不用死记硬背OSI了。
- 物理层:你坐地铁还是开车,路况怎么样。物理介质就摆在那里,承载你的肉身。
- 数据链路层:你到小区门口,保安问你找几栋几单元。门牌号就像MAC地址,负责在“同一个局域网里”把你送到正确的门前。
- 网络层:你用导航规划路线,避开拥堵,走最顺的一条路。这就是IP路由。
- 传输层:你人到了,但对方到底收没收到你的“我到了”这句话,需要确认。TCP在这里干活。
- 会话层:你进门寒暄“新年好”“叔叔阿姨身体怎么样”,建立一段对话,聊完收尾。会话建立和销毁就在这一层。
- 表示层:方言问题和编码问题都在这一层。你如果突然冒出一句特别地道的方言,对方听不懂,那就是编码不匹配,数据能到但解析失败。
- 应用层:你真正想表达的“祝您身体健康、万事如意”,这是最终的业务内容。
这个拆解不是开玩笑,是真的能帮你把抽象分层映射成日常直觉。下次面试官再问你“OSI七层是什么”,你就说“我去舅舅家拜年的全过程”,保准他印象深刻。
1.3 一条拜年消息要过多少道关
再换个视角,你现在不想上门了,改成在家族群里发一条拜年消息。从你按下发送键到长辈手机上弹出提示,消息经过了:应用层的微信封装、传输层的TCP可靠传输保证不丢不乱、网络层的路由寻址、数据链路层的Wi-Fi帧封装、物理层的无线电波。每经过一层,数据就多套一个“信封”,到了对面再一层层拆开。这就是封装与解封装。
这就像你把一盒年货交给快递:先装进纸箱(表示层),再套上快递袋(传输层),贴上收件地址(网络层),交给快递小哥(物理层)。中间任何一环出了问题,亲戚要么收不到货,要么收到一堆碎渣。所以我说,走亲戚这件事,从头到尾就是一套分层协议,谁也别笑谁。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 进门对暗号:三次握手、TLS认证与不加密的尴尬
2.1 TCP三次握手:在吗/在/快进来
我以前调试网络程序,总有人问:“为什么建立连接一定要三次握手,两次不行吗?”我后来想了个特别贴切的解释——你去亲戚家敲门。
- 第一次:你敲门,心里问“屋里有人吗”。这就是SYN报文,发起连接请求。
- 第二次:屋里传来声音“谁呀?在的在的,你是哪位”。这是SYN+ACK应答,告诉门外“我不仅听到了,我还准备跟你对话”。
- 第三次:你回一句“是我,文老师,来拜年的”。这是ACK确认,意思是“我也听到你的回应了,咱俩能正常说话”。
三次握手的本质,是让通信双方都确认自己的收发能力没问题。就像你俩隔着一扇门对话,你喊一声,对方应一声,你再补一句,双方才敢放心接下来聊正事。只喊一声就推门进去,万一屋里不是你亲戚呢?对面回了一句你就直接进门,万一那句话是邻居代答的呢?只有双方都完成“发送-接收-再确认”的闭环,才敢说连接建立。
顺手给你们看一眼抓包里的三次握手长什么样,以后用Wireshark看到别懵:
code复制[SYN] seq=0 -> “在吗?”
[SYN+ACK] seq=0, ack=1 -> “在呢,你哪位?”
[ACK] seq=1, ack=1 -> “是我,我来了。”
2.2 TLS握手与CVE-2016-2183:为什么老暗号不能再用了
普通TCP握手只解决了“你俩能不能说话”,但没解决“你是不是你”的问题。过年进门,亲戚接着会端详你一下——大半年没见,这孩子胖了还是瘦了。如果她多问一句“你真是文老师?你妈叫啥?”那你俩之间就多了一次身份认证。
TLS握手干的就是这事。它的完整流程比TCP复杂得多:客户端先发一个ClientHello,说“我来了,我支持这些加密套件”;服务器回ServerHello,亮出自己的数字证书,附带公钥;客户端验证证书是不是可信CA签发的,确认真的是那台服务器;然后双方协商出一个临时密钥,之后的所有内容加密传输。翻译成人话就是:先查户口、看身份证、确认是本人,然后建立一个只有你俩听得懂的悄悄话通道。
这也是为什么TLS相关漏洞一直高居扫描报告前列。比如热搜里那个“CVE-2016-2183【原理扫描】”,它本质上就是老旧的SSLv3/TLS加密套件存在弱点。类比一下:你自以为说的悄悄话,用的是十几年前的老暗号,而隔壁邻居早就把你这套暗号破解了。你以为安全,其实全文广播。所以现在主流的做法是:在Linux服务器上禁用SSLv3协议,关闭3DES这类弱加密套件,强制走TLS 1.2以上版本。你要是看到扫描报告报这个漏洞,不用慌,按这个思路去加固就行。
我调试HTTPS时还被Charles坑过一回,代理一开,手机浏览器就报“客户端和服务器不支持一般SSL协议”。原因就是抓包工具和服务器没有协商到都能支持的TLS版本。后来把抓包证书重新信任一遍、把TLS版本调到1.2才解决。这也是TLS握手“协商”环节的典型困难:双方必须找到共同支持的参数才能握上手。
2.3 认证、授权与“指纹锁”:谁能进我们家卧室
认证和授权是两个容易被搞混的概念,我拿进门举例:认证是确认“你是谁”——指纹锁验证你的指纹;授权是确认“你能进哪些房间”——客厅随便坐,书房和卧室你不能进。
对应到Web世界里,认证就是登录,授权就是登录之后你能访问哪些接口。而网站根目录下那个Robots协议文件,干的事特别像“授权说明”:告诉爬虫,哪些路径可以爬,哪些路径不能爬。你把它理解成贴在门口的告示——“客厅可以参观,卧室谢绝入内”。它不是强制锁,但懂规矩的爬虫会遵守。技术人的走亲访友也讲究这个:进了亲戚家门,别乱开人家抽屉,这就是最基本的路由边界。
3. 客厅里的通讯百态:谁在对讲、谁在抢话、谁在群发
3.1 SPI与I2C:被点名的亲戚和被叫到的门牌
坐到客厅里,你就会发现亲戚之间的交流模式完全不一样。有的长辈发红包很干脆,直接喊名字:“小文,过来拿。”这就是典型的SPI通信:主设备点名,从设备应答,一对一,干脆利落。
SPI有根片选线(CS),哪个从设备的片选被拉低,哪个就被选中。类比一下:长辈手里拿着红包,喊到谁,谁才被允许上前。同时它还有一根时钟线(SCK)打节拍,一根MOSI给主发数据,一根MISO给从回数据。优点就是快、全双工,缺点就是线多——每次只能点一个人的名,想点十个人得拉十根片选线。
I2C就是另一种风格:线少,一根时钟一根数据,靠地址找人。每个设备有自己的门牌号,主设备广播“请7号应答”,7号设备听见了回一句“在”。客厅里长辈喊的不是名字,而是门牌号,谁听见谁应。线是省了,但速度比不上SPI,而且一套总线上挂着几十个设备,地址冲突的时候,两个亲戚同时应答,场面一度十分混乱。
我把两者的区别画个小表:
| 维度 | SPI | I2C |
|---|---|---|
| 物理线数 | 4根起,片选随设备增加 | 2根 |
| 寻址方式 | 片选线选定设备 | 7位/10位地址寻址 |
| 速度 | 快 | 慢一些 |
| 通信模式 | 全双工 | 半双工 |
| 典型场景 | 闪存、屏幕、ADC | 传感器、EEPROM |
顺带说一句,热搜里那个MIPI协议,你可以把它理解成“客厅里拉了一根专用的高速视频线”,专门给手机屏幕、摄像头传图像用的,走的是高速差分信号,不是普通总线。它跟SPI、I2C不是一个量级的东西,别混着用。
3.2 UART:两个人约好语速才能聊
还有一种更朴素的沟通模式:两个人面对面单聊,没有第三方在场,这就是UART的典型场景。UART是全异步的,没有时钟线,怎么保证双方听懂?靠的是提前约好波特率——也就是语速。
你想象一下这个画面:你对着一个亲戚说“求你们家明年一帆风顺”,你说得又快又急,结果亲戚耳背,或者他平时说话慢悠悠,你这句祝福到他耳朵里就成了“求风顺顺顺”。技术上的表现就是波特率对不上,115200一端对9600一端,收出来的全是乱码。所以UART通信前第一件事就是两边商量好“语速”,这也是为什么排查串口问题时,十个里八个是波特率配置不一致。
UART每一帧还有起始位和停止位。我经常比喻成:说每句话之前先“咳”一声清嗓子,这就是起始位;说完话停半拍示意“我说完了”,这就是停止位。两个亲戚聊天,你说一句,停顿,对方接话,这节奏就刚刚好。如果一个人话没说完就被打断,在总线上就叫帧错误。
3.3 CAN总线与Modbus:一屋子人抢话怎么排优先级
过年人一多,场面就变了。一屋子亲戚七嘴八舌,你说你的我说我的,谁也不让谁。这在总线领域是先有的事,多主通信场景下,两个节点同时往总线上发数据,冲突谁来解决?
CAN总线的方案很有意思:它不搞中央调度,所有节点都能随时发言,但如果撞车了,靠“显性位”和“隐性位”来仲裁。说得玄乎,其实跟饭桌上的情况一模一样——大家都想开口,谁都声量大谁先说话。CAN的仲裁就是通过标识符优先级来定:ID越小的报文,在仲裁时占优,自动让其他节点闭嘴,相当于“辈分最高的人开口,其他人自动收声”。整个过程特别快,一点不耽误事。
跟CAN对应的另一种思路是Modbus。它不搞多主抢话,而是严格的主从问答:主机挨个点名,从机被点到了才允许回答,没点名就老老实实待着。你把它想成饭桌上的“家长主持”:姥爷发言,挨个问“老三,喝汤吗?”“老四,菜够吗?”,被问到的人才回话,不抢答。Modbus RTU是在串口上跑,走RS485物理层;Modbus TCP则是把问话装进TCP/IP包,前面加一个MBAP报文头——这个头就像信封上的收件人、协议标识和长度信息,告诉对方这封问话该转交给哪个从站、包含多少内容。RS485本身只是物理层,相当于客厅里拉了根“公用电话线”,谁来用它、怎么避免吵架,得靠Modbus这种链路层以上的协议说了算。
4. 家族群消息的可靠传输:QoS、心跳与“退了群的人”
4.1 HTTP点对点 vs MQTT群发:一大家子的消息分发
拜年消息怎么发,也是一门学问。你给每个亲戚单独打电话,问一句“身体好吗”,对方回一句“好得很”,然后挂断。这是典型的请求响应模式,HTTP干的就是这个事:你来我往,一问一答,完事断开。
但问题来了,家族群里有二十几号人,你要是一一圈电话拜年,嗓子都能哑掉。正确的做法是在微信群里发一条“新年快乐”,所有人都能看见。这就是发布订阅模式,MQTT的看家本领。在MQTT里面,你往一个主题(Topic)上发布消息,所有订阅了这个主题的客户端都能收到。发布者根本不需要关心对面有谁、有多少人订阅,发完走人。
你品品,这家族群是不是就是一个活生生的MQTT Broker?群主和管理员是Broker的角色,话题是Topic,你发言就是Publish,把群设为特别关注就是Subscribe。我还遇到过做后端的朋友吐槽“HTTP轮询查消息太浪费了”,我直接说:过年的时候你挨个打电话喊亲戚看群消息,就是HTTP轮询;在群里吼一嗓子所有人都能看见,就是MQTT。选谁不用我多说了吧。
顺带提一句OpenAPI和multipart上传。OpenAPI是一份接口说明书,把家族群的规矩写清楚:谁能发言、消息长什么样、有哪些字段。而multipart上传协议,你可以理解成把一整包年货塞进一个快递箱:里面有糖果、有瓜子、有春联,每样东西一个独立的载荷(part),但放在同一个请求体里一起寄出去。后端解析的时候按边界(boundary)拆开,就像你打开快递箱,一样一样往外拿。
4.2 QoS:拜年话可以丢,红包绝不能重复
群里发消息,有的能丢,有的不能丢。这句“不能丢”在MQTT里怎么实现?靠QoS分级。
- QoS 0(最多一次):发出去就当成功,不确认不重发。适合群里的“早上好”表情包,丢了也就丢了,没人较真。
- QoS 1(至少一次):确保对方至少收到一次,但可能重复。像重要的拜年话,万一没收全,系统会再发一次,你可能会收到两条一样的。
- QoS 2(恰一次):保证对方收到且只收到一次。这必须用在红包、转账上——钱这东西,丢了要命,重复了也要命。
| QoS级别 | 保证语义 | 春节类比 |
|---|---|---|
| QoS 0 | 最多一次 | 群里随手转发的表情包,丢了无妨 |
| QoS 1 | 至少一次,可能重复 | 拜年祝福,没收到会补发 |
| QoS 2 | 恰一次 | 红包转账,不多不少正好到账 |
我在物联网项目里给设备下发配置时,用的就是QoS 1,允许重复,但配合设备端的幂等处理,重复消息直接忽略。如果设备端没法做幂等,那就得老老实实上QoS 2。这就像过年给亲戚家送年货,如果是普通的零食,多送一份无所谓;如果是给小孩的压岁钱,你必须当面点清楚,既不能少给更不能多给。
4.3 心跳、遗嘱消息与“忽然不说话的亲戚”
你在群里发了一句“在吗”,半天没人回。你可能觉得大家忙,但在网络协议里,这已经算超时了。TCP和MQTT都有心跳机制(Keep Alive),目的就是定期确认对方还活着。就像你跟亲戚约定“每个月视频一次报平安”,时间到了自动发一个信号,对方响应,连接就保持着。如果连续几个心跳都没回,系统判定连接已死,主动清理。
MQTT里还有个特别有人情味的设计叫遗嘱消息(LWT)。客户端在连接Broker时可以预先声明:“如果我异常掉线了,麻烦替我告诉大家一声。”于是当连接因异常断开时,Broker会替他发布那一条预置的消息。这就好像饭桌上有人突然不见了,不算安静地退群,而是系统自动替他喊了一句“他有事先走了”。我当年第一次理解LWT时愣了一下,心想这协议设计得还挺人文关怀。
组播和广播也是这个章节的老熟人。广播就像在楼道里喊一嗓子“新年快乐”,整栋楼都能听见,用的是UDP。组播则精致一点,只喊给六层住户听。家族群里单独拉一个“长辈群”发祝福,这就是组播:数据包只发给订阅了那个组的人。再加上现在家里Wi-Fi覆盖不够,搞Mesh组网,本质上是几个无线路由器互相“接力转发”,让信号从一楼到三楼始终在线。一个亲戚搬不动消息,旁边人帮他传,消息最终能到,这就是Mesh的协作逻辑。
5. 告辞也是技术活:四次挥手、超时重传与长期联系
5.1 四次挥手:体面地说“我走了”
拜完年,起身告辞,这一套流程比进门还讲究。TCP的挥手也一样,要四次,我拿代码块展示一次:
code复制[你] FIN=1 -> “我准备走了哈”
[亲戚] ACK=1 -> “行,知道了”
[亲戚] FIN=1 -> “那我也送你到门口,下次再来啊”
[你] ACK=1 -> “好嘞,回见,不用送了”
很多人不理解,为什么握手三次就够了,挥手却要四次?因为TCP连接是全双工的,数据通道是两个方向各自独立的,必须分别关闭。你想走,你说“我要走了”,对方回“知道了”——这只是他确认了你的方向关闭,但他自己的发送通道还没关。等他也把话说完,再发一个“我也没什么要说的了”,你再回一个“好”,两个方向才都关干净。
还有一个细节叫TIME_WAIT,主动关闭方在发完最后一个ACK后会停留一段时间才彻底关闭。类比的话,就像你走出亲戚家门,又在走廊站了一会儿,回头确认亲戚确实把门关好了,没有突然再喊你回去拿落下的东西。这段“等待确认”的状态虽然看着多余,但少了它,很可能出现“你的最后一次确认没送到,对方只能重发的尴尬”。
5.2 超时重传与指数退避:不回复的亲戚,再发一次
你大年初一发了一条拜年短信给老同学,两分钟没回,十分钟没回。你会怎么做?大概率再补一条。偶尔还要调侃一句“你不会还没醒吧”。这在TCP里叫超时重传机制。
TCP发送方发出一个数据段后,会启动一个定时器。如果超时没收到确认,就重传。重传的等待时间不是固定的,而是指数退避:第一次等1秒没回,第二次等2秒,第三次等4秒,逐渐拉长。为什么不疯狂重传?因为网络已经拥塞了,你再狂发,等于人群堵在门口,你还拼命往里挤,结果只会更堵。你想想,给亲戚打电话没人接,你也不会一秒钟连打五十个,而是隔一会儿再打一次,打不通就先消停一会。这就叫“有策略的重传”。
UDP则完全没有这套机制,发完就忘,压根不关心对方收没收到。就像你在楼道里喊了一嗓子“新年好”,喊完转身回家,也不回头看看谁家窗台有人探出头。在拜年这个场景里,热热闹闹的群发祝福用UDP那点心态其实挺合适;但涉及“帮人带话上门”“捎个红包”这种重要事,必须TCP级的可靠传输。
5.3 长连接与心跳:平时不走动,感情照样在
HTTP的每一次请求响应,都相当于你为了说一句话,专门跑了一趟亲戚家。如果只是拜年,跑一趟也值。但如果你和亲戚住在同一个小区,一天要说十句话,每次都重新敲门、寒暄、验证身份,成本太高了。这时就该上长连接,比如WebSocket:连接建立一次,之后随时能说话,不用反复敲门。
长连接能维持的关键是心跳。两个技术系统之间的连接如果长时间没有数据传输,中间的路由器、防火墙可能就把它当成死连接给断了。所以应用层要定时发心跳包,哪怕内容只是“还在吗”。这和给人际关系定期报平安是一个道理:不一定天天见面,但每隔一阵发个消息“最近还好吗”,那份连接就始终在线。
我维护过一个设备上报系统,早期的心跳间隔设得太长,设备经常“失联”。后来把心跳改成30秒一次,问题立刻消失。技术上的坑,其实都藏在细节里,跟人情往来一个道理——关系再好,长时间不回应,也会被判定超时。
6. 一份走亲访友协议速查表,和文老师的一点拜年心得
6.1 一张协议×春节场景速查表
前面聊了这么多,我把它们整理成一张速查表。以后你调试协议卡壳的时候,或者跟朋友解释“这协议到底是干嘛的”的时候,直接翻这张表。
| 协议/术语 | 它的作用 | 春节场景类比 |
|---|---|---|
| UART | 点对点异步串口通信 | 两个人面对面单聊,先约好语速 |
| SPI | 高速主从同步通信 | 长辈点名发红包,叫到谁谁上前 |
| I2C | 两线制主从通信,地址寻址 | 按门牌号喊人,省线但稍慢 |
| CAN | 多主总线,冲突仲裁 | 一桌人抢话,辈分最高者先开口 |
| Modbus | 主从问答式工业总线 | 家长主持饭局,被点名才允许发言 |
| RS485 | 差分物理层,抗干扰 | 客厅里牵一根公用电话线 |
| MQTT | 发布订阅消息协议 | 家族群里吼一声,订阅者全看见 |
| TCP | 可靠传输,握手挥手重传 | 重要话必须当面说并确认收到 |
| UDP | 尽力而为传输,不确认 | 楼道里喊一嗓子,听到算缘分 |
| TLS/SSL | 加密、认证、防篡改 | 查户口加说悄悄话,防隔壁偷听 |
| ARP | IP地址解析为MAC地址 | 喊名字找门牌号,谁应谁进门 |
| DNS | 域名解析为IP地址 | 通讯录里查“大姨家”对应的地址 |
| HTTP | 请求响应式Web协议 | 打电话拜年,一问一答 |
| WebSocket | 全双工长连接 | 住在亲戚家,随时能唠嗑 |
| YMODEM | 串口分块文件传输 | 年货太多,分批搬并逐批清点 |
| RTMP/RTSP | 流媒体推拉流 | 把全家福视频实时投到电视上 |
| Matter | 智能家居互联互通标准 | 各家智能设备商量好说“普通话” |
| MIPI | 移动端高速显示/摄像头接口 | 客厅专用高清视频专线 |
| USB | 通用即插即用外设总线 | 插头一插就能用的“万能充电器” |
| PCIe | 板级高速总线 | 家里的高速内部快递通道 |
| Mesh | 多节点协作组网 | 几家人接力转发,信号不断 |
| 组播 | 向指定组成员发送数据 | 只给“长辈群”发祝福 |
| Robots协议 | 约定爬虫可访问范围 | 客厅随便进,卧室别开门 |
6.2 协议选型的三条心法:像挑亲戚相处方式一样挑协议
既然已经俯瞰了这么多协议,那最后聊点实际的问题:遇到一个真实场景,怎么选协议?我的经验就三条。
第一条,看通信双方是什么关系。一方主导、一方服从的,直接用SPI、I2C或Modbus,主从结构干净利落;双方都是对等的、谁都能主动发起的,用CAN或MQTT这类支持多主/多对多的协议。别拿着主从协议硬套多主场景,那就像饭桌上只准一个人说话,其他亲戚憋死。
第二条,看距离和信道。板内通信用SPI、I2C、UART,短平快;远距离联网用TCP/IP、MQTT,跨地域照样传;同一个屋子里跑蓝牙或Wi-Fi就行。距离一拉长,物理层本身就成了瓶颈,你在客厅里喊一嗓子楼下听不见,必须靠网络层、应用层接力。
第三条,看可靠性和成本的平衡。发红包必须可靠,TCP或者MQTT QoS 2;发个祝福表情包,UDP心态也没问题。但可靠是要花钱的——重传要带宽、确认要维护状态、握手要时间。我以前在项目里见过有人强行给一个无关紧要的温度上报数据上了QoS 2,结果数据量暴增、设备续航崩掉。这就是没想清楚成本账。
6.3 写在最后:调试通一个总线的快乐,和拜完一整天年的快乐是一回事
做技术这么多年,我越来越觉得,协议不是冷冰冰的规范,它其实是在教我们怎么“好好说话”。走亲访友和协议设计,底层逻辑高度一致:要约定规则,要确认身份,要保证消息完整,要控制节奏,还要在适当的时候体面地断开。
我调试总线协议时踩过不少坑,后来总结了一句玩笑话:八成的不通,都不是协议难,而是没对齐——波特率不对齐、地址不对齐、字节序不对齐。你看,这跟走亲戚走错门、把辈分叫错、拜年的时间没约好,本质上是同一类问题。协议本身不复杂,复杂的是双方是否守约。
最后分享一个小习惯:我每次调试新设备对接,都会把自己代入成“第一次去亲戚家拜年的人”——先搞清楚对方是什么角色、用什么语言、什么时候能回话、哪些话题不能碰。把人做好了,协议自然就通了。新的一年,祝大家总线上不冲突,握手上不超时,消息重传都能重到点子上,数据包里全是好消息。
