计算机网络——TCP 协议的三次握手 / 四次挥手

news2024/11/19 9:37:58

简述

TCP / UDP 协议都是传输层的协议。

UDP 是面向无连接的协议,就是说发送端不在乎消息数据是否传输到接收端了,所以会出现数据丢失的情况,所以可靠性也不高。

TCP 是面向连接的、可靠的、基于字节流的传输层协议。所谓面向连接的,就是必须发送端和接收端必须处于连接状态才能发送数据。可靠的就是无论网路链路出现的什么变化,都可以保证一个报文能够到达接收端。

字节流:用户消息通过 TCP 协议传输时,消息可能会被操作系统分组成多个 TCP 报文,如果接收方的程序如果不知道消息的边界,是无法读出一个有效的用户消息的。

TCP 建立连接

TCP 是面向连接的,所以传输数据前需要和接收端建立连接,通过三次握手来进行。过程如下图:

图片来源: 小林coding

简单描述一下三次握手:

1. 客户端首先初始化自己的序列号,发送带有 SYN 标识的报文给服务端,表示向服务端发起连接。客户端进入 SYN-SEND 状态。

2. 服务端接收到报文之后,同样初始化自己的序列号,同时将确认应答的序列号,也就是收到的客户端的序列号 + 1,返回给客户端发送带有 SYN + ACK 标识的报文,表示我接收到了你的连接请求,并同意连接。服务端进入 SYN-RCVD 状态。

3. 客户端接收到了服务端发来的应答,将收到的客户端的序列号 + 1,再次向服务端发送带有 ACK 表示的报文,表示我接收到你发的应答了,确认进入连接状态。这次握手是可以携带客户端到服务端的数据。客户端进入 ESTABLISHED 状态,在服务端收到客户端的应答之后也进入 ESTABLISHED 状态。

用一个例子来描述三次握手的情况。

为什么是三次握手

主要原因:三次握手是为了阻止重复历史连接的初始化。

设想一个场景,当客户端向服务端发送一个请求连接的报文之后宕机了,报文在到达服务器前被网络阻塞了,此时服务器并没有收到连接请求,状态没有变化。然后客户端重启之后,再次向服务端发送连接的报文。会出现下面的情况。

假设此时旧的请求报文比新的先到达服务端,然后向客户端发送应答报文,都知道,报文里是包含了客户端的序列号的,假设初始序列号是10,而服务端返回的是11(10+1),而客户端在重启之后发送的序列号是20,所以客户端现在期望收到的报文序列号应该是21(20+1),但是此时收到的是11,那么就会向服务端发送 RST 请求报文, 表示出现了历史连接,此次连接中止。(有内鬼,中止交易)。

而后一段时间之后,新发送的连接请求报文到达服务端,之后就会进行正常的 TCP 连接。用一个图来简单描述一下。

那么两次握手能不能解决历史连接的问题呢。

假设两次握手,那么第一次握手服务端收到客户端的SYN 之后,就进入到了 ESTABLISHED 状态,此时服务端是可以向客户端发送数据了,但是这个时候客户端还没有进入到 ESTABLISHED 状态。服务端向客户端发送 SYN+ACK 的报文之后,客户端如果判断此次是历史连接,那么会回复 RST 中断连接。但在这个期间,如果服务端发送了数据,那么发送的数据可能就丢失了,还浪费了资源。

三次握手之所以能解决历史连接的问题,就是因为如果这是历史连接,在第二次握手时服务端并不会进入到 ESTABLISHED 状态,也就不能发送数据给客户端,不会白白浪费资源。而是在客户端确认了不是历史连接的之后转变状态。

其他原因:同步初始序列号,避免浪费资源

1. 第一次握手,客户端向服务端发送报文。

2. 第二次握手,服务端向客户端发送报文,确认了客户端发送正常,服务端接收正常。

3. 第三次握手,客户端最后向服务端应答报文,确认了服务端发送正常,客户端接收正常。

由此确认了客户端和接收端连接正常。因为握手是会交换序列号的,也就是同步序列号,序列号在传输数据时去除重复的数据,可以根据序列号按序接收。

而两次握手不能确保序列号同步,同时不能确认是否连接正常,假如只有两次握手,少了第三次握手,那么服务端不知道客户端的接收是否正常,如果不正常,那么服务端发送的数据就会丢失,浪费了资源。

握手过程中出现了报文丢失怎么办

当第一次握手丢失了,当客户端向服务端第一次握手,然后客户端迟迟收不到服务端的 SYN+ACK 的报文,就会触发超时重传,重传的报文序列号是一样的。

而超时时间和重传次数也有限制,不可能一直让客户端发送连接请求,浪费资源,在Linux 里,重传次数是 5 ,而每次超时时间是上一次的两倍,一般第一次是 1秒,第二次就是2秒,以此类推,5次重传总耗时就是 1+2+4+8+16+31 = 63秒,大约一分钟,如果5次都丢失,那么就不会再进行连接了。

第二次握手丢失。第二次握手包含了给客户端的回应报文 ACK,和服务端发起建立连接的请求报文 SYN ,如果丢失了,客户端会以为第一次握手丢失了,那么会触发超时重传。正常情况下,客户端接收到第二次握手之后会发送 ACK 响应报文给服务端,但是服务端迟迟都收不到,那么服务端也会触发超时重传机制。

第三次握手丢失。第三次握手是客户端发送给服务端的响应报文,如果丢失了,服务端会认为第二次握手丢失了,所以服务端会触发超时重传机制。

TCP 断开连接的四次挥手

TCP 建立连接时需要发送报文,断开连接时同样需要发送报文。

1. 首先客户端想要断开连接,会发送一个带有 FIN 标识的请求报文给服务端。客户端进入 FIN_WAIT_1 状态。

2. 服务端接收到报文之后会回复给客户端一个带有 ACK 标识的应答报文。服务端进入 CLOSE_WAIT 状态。客户端接收到 ACK 报文之后进入 FIN_WAIT_2 状态。

3. 因为想要断开连接时服务端可能还有数据没有处理完,所以需要等待处理完成,处理完成之后会发送带有 FIN 标识的请求报文给客户端。服务端进入 LAST_ACK 状态。

4. 客户端接收到报文之后最后返回带有 ACK 标识的应答报文给服务端,客户端进入 TIME_WAIT  状态。服务端接收到ACK 报文之后进入到 CLOSE 状态。一段时间之后,客户端会进入 CLOSE 状态,双方都关闭连接。

图片来源 小林coding

可以用打电话的方式来打个比方。

为什么要挥手四次

从每次挥手发送带有标识的报文可以看出来,关闭连接时,客户端向服务端发送 FIN 报文,只是代表客户端已经发送数据完毕了,但是还能接收数据,同样的服务端也是这样。

服务端收到 FIN 报文时,回复一个 ACK 应答报文,表示我收到了你的请求,但是你先等等,我还有数据没处理完,等到我数据处理完了,我再发送客户端一个 FIN 报文表示我也没数据需要处理和发送了。

假设少了一次挥手,比如说服务端只发送了 ACK 报文,客户端就关闭连接的话,会导致还未处理和发送的数据出现错误或者丢失。

不过,在特定情况下,可以将四次挥手合并成三次挥手。比如服务端也没有数据处理和发送时,TCP 存在延迟确认机制且是默认开启的,那么第二次和第三次就会合并,变成三次挥手。

挥手丢失的话会发生什么

和握手相同,如果握手丢失了,发送方迟迟收不到回应,就会认为刚刚的报丢失了,就会触发超时重传机制。同样的是 ACK 报文是不会重传的,假如第二次挥手丢失了,那么客户端收不到 ACK 应答报文,那么就会认为FIN 报文丢失了,那么就会重传 FIN 报文。

简单来说,当前最近的 FIN 报文发送方会经常重传 FIN 报文。

为什么第四次挥手客户端需要等待 2*MSL(报文最长寿命)时间后才进入 CLOSE 状态

在第三次挥手时,服务端会发送 FIN 报文给客户端,关闭连接,但是如果出现了第三次或者第四次挥手丢失的情况,服务端都会触发超时重传机制来重新发送 FIN 报文。

MSL 一个片段在网络中最大的存活时间,2MSL 就是一个发送和一个回复所需的最大时间,如果这个大于这个时间客户端还没有收到服务端重新发送的 FIN 报文,那么客户端就认为服务端已经接收到了自己发送的 ACK 应答报文,然后进行 CLOSE 状态,代表 TCP 连接完成中断。

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

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

相关文章

win11 wsl ubuntu24.04

win11 wsl ubuntu24.04 一:开启Hyper-V二:安装wsl三:安装ubuntu24.04三:桥接模式,固定IP四:U盘使用五:wsl 从c盘迁移到其它盘参考资料 一:开启Hyper-V win11家庭版开启hyper-v 桌面…

【Crypto】RSA

文章目录 题目步骤1.计算 𝑛2.计算欧拉函数 𝜙(𝑛)3. 扩展欧几里得算法求逆元 𝑑 解题感悟 题目 p473398607161 q4511491 e17 求d 步骤 1.计算 𝑛 公式:npq n47339860716145114912135733555619387051 …

微信小程序知识点1

一. 页面样式和结构 1.1 小程序组件(html) (1) 区域布局组件 view 定义块级区域,相当于网页中的 div 标签text 定义行内区域,相当于网页中的 span标签 (2) 链接跳转组件 navigator 组件相当于网页中的 a 标签,用来实现页面之间的跳转。 …

基于大数据的支付风险智能防控技术规范

随着大数据、移动互联、人工智能、生物特征识别等技术的快速发展,支付方式正在发生着巨大而深刻的变革,新技术在丰富支付手段、提高支付效率的同时,带来了新的隐患,也对从业机构的风险防控能力提出了更高的要求。 传统的风控技术…

机器学习--数学部分笔记

前言 因为周三要考试,所以数学部分写一下笔记 正文 随机事件和随机实验 条件概率 • 在已知事件 𝐵 发生的条件下,事件𝐴发生的概率称为事件 𝐴 的条件概率,记为𝑃(𝐴|𝐵) 全概率…

Java 解决 古典问题

1 问题 编写一个Java程序,解决以下问题: 2 方法 再导入java.util包下的Scanner类,构建Scanner对象,以便输入。通过对问题的分析,我们可以得到,当位数为1时,其返回值为1;当位数为2时&…

部署LAMP平台

目录 一、LAMP简介与概述 1.1 各组件作用 1.2 LAMP平台搭建时各组件安装顺序 1.3 httpd服务的目录结构 1.4 httpd.conf配置文件 二、编译安装Apache httpd服务 2.1 关闭防火墙,将安装Apache所需软件包传到/opt目录下 2.2 安装环境依赖包 ​2.3 配置软件模块…

浅论未来 IT 和财务结合的趋势

前言 会计核算企业各类业务单据,所有业务部门的数据都会汇流到财务部来,所以会计其实是企业的数据中心;而 IT 技术正是处理数据的利器,可以将重复的流程自动化,还能将财务数据可视化;因此,两者…

路由_传递params参数和query参数

传递params参数 传递params参数可以直接在路径后面加上参数: 上述就是在路径变化的时候传过去三个值分别为哈哈、嘿嘿、呵呵的参数 但是这样的话会被认为三个参数是路径的一部分,计算机没有办法区分哪些是路径哪些是参数,所以首先要在这条路…

练习题(2024/5/23)

1单词接龙 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk&#xff1a; 每一对相邻的单词只差一个字母。 对于 1 < i < k 时&#xff0c;每个 si 都在 wordList 中。注意&#…

继“三级淋巴结”之后,再看看“单细胞”如何与AI结合【医学AI|顶刊速递|05-25】

小罗碎碎念 24-05-25文献速递 今天想和大家分享的是肿瘤治疗领域的另一个热点——单细胞技术&#xff0c;我们一起来看看&#xff0c;最新出炉的顶刊&#xff0c;是如何把AI与单细胞结合起来的。 另外&#xff0c;今天是周末&#xff0c;所以会有两篇文章——一篇文献速递&…

CATO原理中的数学与魔术(十)——Parity Principle及其应用一:集合的基本性质...

在前面的文章中&#xff0c;我们介绍了CATO原理的数学模型以及两个经典的魔术应用系列&#xff1a;Baby Hummer和Royal Hummer&#xff0c;以及它们的拓展&#xff0c;详情请戳&#xff1a; 传送门 CATO原理中的数学与魔术&#xff08;九&#xff09;——Royal Hummer 及其进阶…

Vue.js - Vue 的安装 以及 常用的 Vue 指令 【0基础向 Vue 基础学习】

文章目录 Vue 快速上手1、Vue.js 官网 & Vue.js 的获取2、创建 Vue 实例&#xff0c;初始化渲染3、插值表达式 安装 Vue 开发者工具&#xff1a;装插件调试 Vue 应用Vue 指令1、v-show 指令2、v-if3、v-else & v-else-if4、v-onv-on 调用传参 5、v-bindv-bind 对于样式…

[数据结构] -- 单链表

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分82)&#…

订单id的设计问题探讨

如何设计一个订单id 设计一个订单ID系统需要考虑多个因素&#xff0c;包括唯一性、排序性&#xff08;时间顺序&#xff09;、可读性&#xff08;可选&#xff09;以及系统的扩展性和性能。结合这些因素&#xff0c;可以选择不同的方案来生成订单ID。以下是几种常见的订单ID设…

【Nodejs-多进程之Cluster】

cluster 模块是 Node.js 提供的一个用于多进程的模块&#xff0c;它可以轻松地创建一组共享同一个服务器端口的子进程&#xff08;worker进程&#xff09;。通过使用 cluster 模块&#xff0c;可以充分利用多核系统&#xff0c;提高应用程序的性能和可靠性。 基本原理 cluste…

文心智能体,零代码构建情感表达大师智能体

前言 随着智能体技术的突飞猛进&#xff0c;各行各业正迎来前所未有的变革与机遇。智能体&#xff0c;作为人工智能领域的重要分支&#xff0c;以其自主性、智能性和适应性&#xff0c;正逐步渗透到我们生活的每一个角落&#xff0c;成为推动社会进步和科技发展的新动力。 为了…

秒级达百万高并发框架Disruptor

1、起源 Disruptor最初由lmax.com开发&#xff0c;2010年在Qcon公开发表&#xff0c;并于2011年开源&#xff0c;企业应用软件专家Martin Fowler专门撰写长文介绍&#xff0c;同年它还获得了Oracle官方的Duke大奖。其官网定义为&#xff1a;“High Performance Inter-Thread M…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(十九)- JUC(5)

synchronized优化原理 轻量级锁 如果一个对象有多个线程访问&#xff0c;但多线程访问的时间是错开的&#xff08;没有竞争&#xff09;&#xff0c;可以用轻量级锁优化 Slf4j(topic "c.ExerciseTransfer")public class Test {​static final Object obj new Obj…

利用天气API接口自己DIY一个预报小管家

天气预报查询API 是一种实用的日常工具&#xff0c;它通过编程方式为开发者提供实时的天气数据。开发者可以通过简单的代码调用&#xff0c;与天气预报服务提供商进行交互&#xff0c;获取特定地区的天气信息&#xff0c;如温度、湿度、风速、风向、降水量等&#xff0c;以及未…