首页
时事
民生
政务
教育
文化
科技
财富
体娱
健康
情感
更多
旅行
百科
职场
楼市
企业
乐活
学术
汽车
时尚
创业
美食
幽默
美体
文摘
为什么TCP需要3次握手而不是2次?
文摘
2024-11-09 11:45
四川
关注+
星标公众
号
,不错过精彩内容
来源 | 码农的荒岛求生
今天来聊聊为什么TCP需要3次握手而不是2次。
假设有一条河,河的上下游有两个人,这两个人只能借助这条河交流信息:
岸边有很多叶子,因此它们把信息写到岸边的叶子上:
并假设上游的叶子会飘向下游,下游的叶子会飘向上游。
但由于水流的作用,同一个方向叶子先出发的有可能后到(乱序),也有可能沉到水里(丢失)。
也就是说假如a发了四片叶子,每片叶子上写两个字,记录的是“码农的荒岛求生”,a依次把【码农】【的荒】【岛求】【生】放到河里,这四片叶子到达b后可能变成了【岛求】【码农】 【生】 【的荒】(乱序),也有可能丢了一片叶子,变成了【的荒】 【码农】 【生】(乱序+数据丢失):
那么在这种情况下该怎么让b知道a想说的其实是“
码农的荒岛求生
”呢?
很简单,只要两种机制:
编号
以及
确认
。
编号针对与乱序问题,确认机制针对的是丢失问题。
a放到河里的任意一片叶子都带上一个编号,这些编号依次递增,b收到叶子后根据编号重组起来,这样即使叶子到达的顺序是乱的b也能根据编号恢复信息:
乱序问题解决了,叶子丢失问题依靠确认机制:b收到每一片叶子后会回复一个收到,并附带接收叶子的编号+1,也就是期待a发出的下一片叶子的编号:
这样a在接收到【3 收到】后就确信b已经收到了【2 的荒】,如果a在一定时间内没有收到【3 收到】那么就会重新拿起一片叶子再次发送【2 的荒】。
可以看到利用这种重传机制确保即使叶子可能沉到水里也能把信息发给b。
有了编号和确认机制,即使在河流这种不可靠的介质中a也可以把信息可靠的传递给b。
当然b也可以利用这种机制把消息可靠的发送给a。
由于需要对每片叶子进行编号,因此a向b发送消息之前必须把叶子的初始编号告诉b,又因为b也可以向a发送消息,因此
双方在通信之前必须知道对方叶子的初始编号
,这样才能正确的进行叶子收到后的确认以及对叶子根据编号进行重排。
于是ab双方协定,聊天发起方先把编号告诉聊天接收方,聊天接收方收到发起方编号后也把自己的编号告诉发起方。
依然假设a先发起通信,a先发送了一片叶子,写着“SYN X”,SYN表示这是一片告诉你我的初始编号的叶子(在TCP中SYN是synchronization的简写,表示同步,但作用和这里一样),X表示自己的初始编号。
根据之前提到的确认机制,b在收到需要对这片叶子进行确认,于是b发送一片叶子:“ACK X+1”,表示“我确认已经接收到了你的叶子,期待接收X+1号叶子”(在TCP中ACK是acknowledge的简写,表示确认,作用和这里一样)。
不要忘了,b也要把自己的编号告诉a,于是b紧接着又发送了一片叶子“SYN Y”,表示“这是一片告诉你我的初始编号的叶子,我的初始编号是Y”:
同样的a收到后也要进行确认,于是a发送一片叶子:“ACK Y+1”,表示“我确认已经接收到了你的叶子,期待接收你Y+1号叶子”。
就这样经过最少四片叶子,a和b就能知道对方的初始编号是多少,注意看这里:
可以看到这两片叶子都是b发向a的,因此这两片叶子的信息可以合并在一起,这样就可以少发送一片叶子:
可以看到,双方至少需要发送3片叶子才能知道对方的初始编号,而如果只发送两片叶子没办法保证这一点。
------------
END
------------
●专栏《嵌入式工具
》
●专栏《嵌入式开发》
●专栏《Keil教程》
●嵌入式专栏精选教程
关注公众号
回复“
加群
”按规则加入技术交流群,回复“
1024
”查看更多内容。
点击“
阅读原文
”查看更多分享。
嵌入式专栏
作者黄工【strongerHuang】,专注分享嵌入式软件、硬件、工具等相关内容,通过专栏形式精选并整理更多嵌入式相关教程。关注并回复“1024”查看更多教程。
最新文章
linux内核源码多久才能看完?
这款瑞芯微RK3576,8核2.2GHz+6T算力NPU工业核心板真不错!
分享一款国产工具FinalShell
嵌入式软件中函数指针的几个高级应用场景
FreeRTOS V11 相比 V10 升级了哪些功能?
嵌入式AI开发板到手不到200块?只为交个新朋友
推荐一款嵌入式C的开源代码框架
嵌入式RTOS到底“实时”在哪?
单片机串口解析数据的几种方式
2元买的WiFi信号增强器,拆开后我惊呆了......
入门级MCU,性能也强大
变频器,能不能节约电?
为什么用C语言编写操作系统?
美图 | 电路板上的打工人
FreeRTOS-TCP 软件架构及收发流程
嵌入式软件架构设计中的状态模式
MCU中断没有子优先级?
工业MPU新标杆,多协议工业以太网+运动控制
适合新手的USB 2.0 协议内容
PCB 设计布线 Cadence 20问
10万转电机无极调速,翻车细节!
回调函数 callback 的实现原理是什么?
2024年MCU大变局:NPU和64位
图文并茂的C语言知识汇总
嵌入式重定向串口的几种方法
PCB设计电路板连线注意事项
概述RTOS钩子函数的用法
传说中的STM32N6终于要来了?盘点近期AI MCU/MPU大事记
IGBT优缺点及其特性
送调试器 | 基于 MCU的电机控制解决方案
单片机编程中局部变量赋初始值的重要性
为什么PCB地与金属机壳用阻容连接?
printf打印输出时 \ n 和 \r 的区别
嵌入式开发文档 —— 测试用例
ST 40nm 单片机让华虹代工!
C语言如何判断结构体相等?
单片机ADC&GPT功能在马达和电源项目中的应用
分享几款开发过程中常用的终端工具
什么时候需要用RTOS?
分享几款嵌入式软件检测/测试工具
PCB电路板上为什么需要有测试点?
分享一套电机方案开发工具—QE For Motor
分享几种单片机中常用的C语言特殊定义
学单片机要掌握哪些通信技术?
模拟电路设计的九重境界
Cortex-M85 再填新成员-RA8E1、E2高性能入门级MCU
为什么TCP需要3次握手而不是2次?
MMU 对于 linux 的重要性
微信 Linux 4.0 公测版上架深度操作系统 deepin 应用商店,功能对齐 Windows 版
一款适合嵌入式系统的轻量级框架
分类
时事
民生
政务
教育
文化
科技
财富
体娱
健康
情感
旅行
百科
职场
楼市
企业
乐活
学术
汽车
时尚
创业
美食
幽默
美体
文摘
原创标签
时事
社会
财经
军事
教育
体育
科技
汽车
科学
房产
搞笑
综艺
明星
音乐
动漫
游戏
时尚
健康
旅游
美食
生活
摄影
宠物
职场
育儿
情感
小说
曲艺
文化
历史
三农
文学
娱乐
电影
视频
图片
新闻
宗教
电视剧
纪录片
广告创意
壁纸头像
心灵鸡汤
星座命理
教育培训
艺术文化
金融财经
健康医疗
美妆时尚
餐饮美食
母婴育儿
社会新闻
工业农业
时事政治
星座占卜
幽默笑话
独立短篇
连载作品
文化历史
科技互联网
发布位置
广东
北京
山东
江苏
河南
浙江
山西
福建
河北
上海
四川
陕西
湖南
安徽
湖北
内蒙古
江西
云南
广西
甘肃
辽宁
黑龙江
贵州
新疆
重庆
吉林
天津
海南
青海
宁夏
西藏
香港
澳门
台湾
美国
加拿大
澳大利亚
日本
新加坡
英国
西班牙
新西兰
韩国
泰国
法国
德国
意大利
缅甸
菲律宾
马来西亚
越南
荷兰
柬埔寨
俄罗斯
巴西
智利
卢森堡
芬兰
瑞典
比利时
瑞士
土耳其
斐济
挪威
朝鲜
尼日利亚
阿根廷
匈牙利
爱尔兰
印度
老挝
葡萄牙
乌克兰
印度尼西亚
哈萨克斯坦
塔吉克斯坦
希腊
南非
蒙古
奥地利
肯尼亚
加纳
丹麦
津巴布韦
埃及
坦桑尼亚
捷克
阿联酋
安哥拉