LwIP系列(5):TCP 3次握手+4次挥手+状态机转换

前言

TCP的3次握手、4次挥手以及TCP状态机,是TCP的核心概念,我们在分析LwIp中TCP相关代码流程,也需要熟悉这些流程,本文就详细介绍这些概念。

TCP 3次握手、应用数据交互、4次挥手完整流程

在这里插入图片描述

TCP 为什么是3次握手,而不是2次或4次

网上针对为什么是3次握手,会有很多的分析,尤其有些文章会特别强调client和server的seq序列号同步,众说纷纭吧,我个人倾向于:

  1. 防止旧的重复连接,引起连接混乱。
  2. client与server之间同步初始化序列号。
  3. 3次握手能够在通信信道不保证可靠情况下,从软件流程上,保证TCP通信可靠的最小代价。

防止旧的重复连接

在TCP协议的标准文档RFC793中指出了3次握手的设计原因,原文引用如下:

The principle reason for the three-way handshake is to prevent old duplicate connection initiations from causing confusion.

翻译后为:

3次握手的握手设计的主要原因是为了防止旧的重复连接,引发连接混乱。

我们假设只有2次握手,在正常的网络环境下,是没有问题的,但是在网络比较差的环境下,client可能会因为没有收到ack,而重新发送SYN,而server端可能会收到多次的SYN请求,对于Server端,要么拒绝,要么接收,这不仅会浪费server的资源(为client分配资源),而且可能会导致连接的混乱,因为某测的SYN请求可能是过时的,所以通过3次握手,通过seq就可以判断出哪些连接是旧的,哪些是对的。

client与server同步初始化序列号

这个在上图中就可以看到,client与server 3次握手后,对于client端,就能够确定一个随机序列号A,对于server端,就能确定一个随机序列号B,后续client与server之间的通信,可靠性通信,都是通过这两个序列号来实现的,具体如何实现,我们后面的文章再详细分析。

综上:

3次握手,是为了在通信信道不能保证稳定的情况下,从软件层面,保证TCP通信可靠的一种最小代价,这里提到的最小代价,主要是3次是最小的尝试,我们也可以4次握手、5次握手,甚至更多,只不过那样会浪费效率和资源。

TCP状态机转换图

TCP的维护有状态机,没错,是固定的状态机,不管是Linux和LwIp中,状态机是一致的,这就更能说明,TCP/IP就是一种标准的软件协议。TCP状态机转换如下:

在这里插入图片描述

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

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

相关文章

【设计模式】第十九章:访问者模式详解及应用案例

系列文章 【设计模式】七大设计原则 【设计模式】第一章:单例模式 【设计模式】第二章:工厂模式 【设计模式】第三章:建造者模式 【设计模式】第四章:原型模式 【设计模式】第五章:适配器模式 【设计模式】第六章&…

删除有序链表中的重复元素II——牛客24

题目描述 法一)直接删除法 class Solution{ public:ListNode* deleteDuplicates(ListNode* head) {if(headNULL) return NULL;ListNode* dummy new ListNode(0);dummy->next head;ListNode* cur dummy;while(cur->next!NULL && cur->next->n…

raid5两块磁盘掉线导致阵列崩溃的服务器数据恢复案例

服务器数据恢复环境: DELL PowerVault系列某型号存储,15块硬盘搭建了一组RAID5磁盘阵列。 服务器故障&检测: 存储设备raid5阵列中一块磁盘由于未知原因离线,管理员对该磁盘阵列进行了同步操作。在同步的过程中又有一块磁盘指示…

【算法与数据结构】232、LeetCode用栈实现队列

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:这道题要求我们用栈模拟队列(工作上一定没人这么搞)。程序当中,pus…

岛屿数量 (力扣) dfs + bfs JAVA

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的…

Spring Boot原理分析(一):项目启动(上)——@SpringBootApplication

文章目录 〇、准备工作一、SpringBootApplication.java源码解析1.源码2.自定义注解3.组合注解4.注解ComponentScan过滤器 5.注解SpringBootConfigurationConfiguration 6.注解EnableAutoConfiguration 本文章是Spring Boot源码解读与原理分析系列博客的第一篇,将会介…

阐述kubernetes部署:基础设施安装

基础设施部署 持久卷的建立 请参考:《持久卷的建立》 elasticsearch部署 一、设置远程扩展字典 不使用自定义字典请忽略此步骤 首先更改ES中IK插件的配置: vi/opt/kubernetes/es/IKAnalyzer.cfg.xml 按您的实际设置的秘钥配置secret_value: …

springboot+echarts +mysql制作数据可视化大屏(四图)

作者水平低,如有错误,恳请指正!谢谢!!!!! 项目简单,适合大学生参考 分类专栏还有其它的可视化博客哦! 专栏地址:https://blog.csdn.net/qq_559…

操作系统12:I/O系统的功能、模型、接口及 I/O 设备和设备控制器

目录 1、I/O系统的功能、模型和接口 (1)I/O系统的基本功能 1.1 - 隐藏物理设备的细节 1.2 - 与设备的无关性 1.3 - 提高处理机和I/O设备的利用率 1.4 - 对 I/O 设备进行控制 1.5 - 确保对设备的正确共享 1.6 - 错误处理 (2&#xff…

TCP/IP出现的背景及其历史【图解TCP/IP(笔记八)】

文章目录 TCP/IP出现的背景及其历史从军用技术的应用谈起ARPANET的诞生TCP/IP的诞生UNIX系统的普及与互联网的扩张商用互联网服务的启蒙 TCP/IP出现的背景及其历史 从军用技术的应用谈起 20世纪60年代,很多大学和研究机构都开始着力于新的通信技术。其中有一家以美…

DeepSpeed-Chat 打造类ChatGPT全流程 笔记二之监督指令微调

文章目录 系列文章0x0. 前言0x1. 🐕 Supervised finetuning (SFT) 教程翻译🏃 如何训练模型🏃 如何对SFT checkpoint进行评测?💁 模型和数据☀️来自OPT-1.3B及其SFT变体(使用不同微调数据)的提示示例☀️…

你真的了解JS垃圾回收机制吗?

目录 前言 堆栈内存管理 JS垃圾回收机制 标记清除(Mark and Sweep) 标记阶段 清除阶段 标记清除的特点 优点 缺点 引用计数(Reference Counting) 引用计数器的维护 引用计数的跟踪 垃圾回收的触发 回收对象 引用计…