TCP详解之三次握手和四次挥手

TCP详解之三次握手和四次挥手

1. TCP基本认识

1.1 什么是 TCP

TCP是面向连接的、可靠的、基于字节流传输层通信协议。

1.2 TCP协议段格式

我们先来看看TCP首部协议的格式

TCP头部协议格式

我们先来介绍一些与本文关联比较大的字段,其他字段不做详细阐述。

序列号:在建立连接时,由计算机随机生成的数作为初始值,通过SYN报文传给接收端。每发送一次,就累加一次该数。用来解决网络包乱序问题。

确认应答号:指下次期望收到的数据的序列号,发送端收到这个确认应答后可以认为这个序号以前的数据都被接收端正常接收了。用来解决丢包问题。

标志位:

  • ACK:该位为1时,确认应答字段是否有效
  • RST:该位为1时,表示TCP连接中出现异常,必须强制断开连接。
  • SYN:该位为1时,表示希望建立连接,并在序列号字段进行序列号初始值的设定。
  • FIN:该位为1时,通知对端以后不会有数据发送,希望断开连接。当通信结束希望断开连接。

1.3 为什么需要 TCP 协议

IP层是不可靠的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中数据的完整性。

如果需要保障网络数据包的可靠性,就需要上层 传输层TCP协议来负责。

因为TCP是一个工作在传输层可靠数据传输服务,它能确保接收端接收的网络包是无损坏的、无间隔的、非冗余和按序的。

2. TCP连接建立

2.1 TCP三次握手过程是怎样的

TCP是面向连接的协议,所以使用TCP前必须先建立连接,而建立连接是通过三次握手来进行的。具体过程如下图所示:

TCP三次握手

  • 一开始,客户端和服务端都处于CLOSE状态。先是服务端主动监听某个端口,处于LISTEN状态。

  • 第一次握手,客户端会随机初始化序号(client_isn),将该序号设置为TCP首部序列号字段,同时把SYN标志位置为1,表示客户端向服务端发起连接,该报文不包含数据,之后客户端处于SYN_SENT状态。

    第一次握手

  • 第二次握手,服务端接收到客户端发来的SYN报文,首先也会随机初始化自己的序列号(server_isn),将此序号设置到TCP首部序列号字段,接着把确认应答号字段设置为client_isn + 1,把SYNACK标志位设置为1。最后把报文发送给客户端,该报文也不包含数据,服务端进入SYN_RCVD状态。

    第二次握手

  • 第三次握手,客户端收到SYN+ACK报文后,向服务端发送一个应答报文,将确认应答号设置为server_isn + 1ACK标志位也设置为1,最后把报文发送给客户端,此次报文可以包含数据,发送后客户端处于ESTABLISHED状态。

    第三次握手

  • 服务端收到报文后,也进入ESTABLISHED状态。

一旦完成三次握手,双方都处于ESTABLISHED状态,此时连接就已经建立完成,客户端和服务端就可以互相发送数据了。

2.2 为什么是三次握手,不是两次、四次

在前面,我们知道了什么是TCP连接:用于保证可靠性流量控制维护的某些状态信息,这些信息的组合称为连接。

接下来,以三个方面分析三次握手的原因:

  1. 三次握手才可以阻止重复历史连接的初始化(主要原因)
  2. 三次握手才可以同步双方的初始序列号
  3. 三次握手才可以避免资源浪费

2.2.1 避免历史连接

简单来说,三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。

假设,客户端先发送了SYN(seq = 90)报文,然后客户端宕机了,而且这个SYN报文还被网络阻塞了,服务器并没有收到,接着客户端重启,又像服务端建立连接,发送SYN(seq = 100)报文(这里不是重传,重传的SYN序号是一样的)。

  • 一个旧SYN报文新SYN报文早到达了服务端,这时服务端会回一个SYN+ACK报文给客户端,此报文中的确认应答号是91(90 + 1)。

  • 客户端收到后,发现自己期望收到的确认应答号应该是101(100 + 1),而不是91,于是就会回RST报文。

  • 服务端收到RST报文后,就会释放连接。

  • 后续新的SYN报文抵达服务器后,客户端与服务端就可以正常的完成三次握手了。

    避免历史连接

上述的旧SYN报文成为历史连接,TCP使用三次握手建立连接的最主要原因就是防止历史连接初始化了连接,造成资源浪费。

TIPS:有人可能会问了,如果服务端在收到RST报文之前,就先收到了新SYN报文,这时会发生什么?

当服务端第一次收到SYN报文,也就是收到旧SYN报文时,就会回复SYN+ACK报文给客户端,此时报文中的确认应答号是91(90 + 1)。

然后这时再收到新SYN报文时,就会回Challenge ACK报文给客户端,这个ACK报文并不是确认收到新SYN报文的,而是上一次的ACK确认应答号91(90 + 1)。所以客户端收到此ACK报文时,发现与期望收到的确认应答号101(100 + 1)不符,于是会回RST报文。

如果时两次握手连接,就无法阻止历史连接,在两次握手的情况下,服务端没有中间状态给客户端来阻滞历史连接,导致服务器可能建立一个历史连接,造成资源浪费。

在两次握手的情况下,服务器收到SYN报文后,就进入ESTABLISHED状态,意味着这时可以给对方发送数据,但是客户端此时还没有进入ESTABLISHED状态,假设这次是历史连接,客户端判断到此次连接为历史连接,就会回RST报文来断开连接,而服务端在第一次握手时就进入了ESTABLISHED状态,所以它认为可以发送数据,但是它并不知道这是个历史连接,只有它收到RST报文后,才会断开连接。

两次握手

可以看到,如果两次握手建立TCP连接的场景下,服务端在向客户端发送数据前,并没有阻止掉历史连接,导致服务端建立了一个历史连接,不仅白白发送了数据,而且浪费了服务器的资源。

所以,TCP三次握手建立连接的主要原因就是防止历史连接初始化了连接。

2.2.2 同步双方初始序列号

TCP协议的通信双方,都必须维护一个序列号,序列号是TCP可靠传输的一个关键因素。

  • 接收方可以去除重复的数据
  • 接收方可以根据数据包的序列号按顺序接收
  • 可以标识发出去的数据包中,哪些是已经被对方收到的(通过ACK报文中的应答序列号知道)

可见,序列号在TCP连接中占据着非常重要的作用,所以当客户端发送携带初始序列号的SYN报文时,需要服务端回一个ACK应答报文,表示客户端的SYN报文已经被服务端成功接收,当服务端发送的初始序列号给客户端时,依然也要得到客户端的回应,这样一来一回,才能确保双方的初始序列号能被可靠的同步。

四次握手和三次握手

四次握手也能够可靠的同步双方的初始化序列号,由于第二步和第三步可以优化成一步,所以就成了三次握手

而两次握手只保证了一方的初始序列号能被对方成功接收,没办法保证双方的初始序列号都能被确认接收。

2.2.3 避免资源浪费

如果只有两次握手,当客户端发送的SYN报文在网络中阻塞,客户端没有接收到ACK报文,就会重新发送SYN,由于没有第三次握手,服务器不清楚客户端是否收到了字节回复的ACK报文,所以服务端每收到一个SYN就只能先主动建立一个连接,如果客户端大宋的SYN报文在网络中阻塞了,重复发送多次SYN报文,那么服务端在收到请求后就会建立多个冗余的无效连接,造成不必要的资源浪费。

两次握手

总结

TCP建立连接时,通过三次握手就能防止历史连接的建立,帮助双方同步初始序列号,减少双方不必要的资源开销。保证TCP连接的可靠性。

不使用两次握手和四次握手的原因:

  • 两次握手:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方初始序列号
  • 四次握手:三次握手就已经理论上最少可靠连接建立,不需要更多的通信次数。

3. TCP连接断开

3.1 四次挥手的过程

天下没有不散的宴席,对于TCP连接也是这样。TCP连接断开是通过四次挥手方式。

双方都可以主动断开连接,断开连接后主机的资源将被释放,四次挥手过程如下图所示:

客户端主动关闭连接 —— TCP 四次挥手

  • 客户端打算关闭连接,此时会发送一个TCP首部FIN标志位被置为1的报文,之后客户端进入FIN_WAIT_1状态。
  • 服务端收到FIN报文后,就向客户端发送ACK应答报文,接着服务器进入CLOSE_WAIT状态。
  • 客户端收到ACK应答报文后,进入FIN_WAIT_2状态。
  • 等待服务端处理完数据后,也想客户端发送FIN报文,之后服务端进入LAST_ACK状态。
  • 客户端收到FIN报文后,回复一个ACK应答报文,之后进入TIME_WAIT状态。
  • 服务端收到ACK应答报文后,就进入CLOSE状态,至此服务端已经完成连接的关闭。
  • 客户端在经过2MSL一段时间后,自动进入CLSOE状态,至此客户端也完成连接的关闭。

每个方向都需要一个FIN和一个ACK,因此通常被称为四次挥手。

这里需要注意的是:主动关闭连接的,才有TIME_WAIT状态

3.2 为什么挥手需要四次

再来回顾一下四次挥手双方发FIN包的过程,就能理解为什么需要四次了。

  • 关闭连接时,客户端向服务端发送FIN报文时,仅仅表示客户端不再发送数据了,但是还能接收数据。
  • 服务端收到客户端的FIN报文时,先回一个ACK应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送FIN报文给客户端表示同意关闭连接。

从上面过程可知,服务端通畅需要等待完成数据的发送和处理,所以服务端的ACKFIN一般会分开发送,因此是需要四次挥手。

但是在特定情况下,四次挥手是可以变成三次挥手的

3.3 什么情况会出现三次挥手

当被动关闭方(这里是服务端)在TCP挥手过程中,没有数据要发送并且开启了TCP延迟确认机制,那么第二次和第三次挥手就会合并发送,这样就出现了三次挥手。

三次挥手

什么是延迟确认机制?

当发送没有携带数据的ACK报文时,它的网络效率是很低的,因为它也有40个字节的IP首部和TCP首部,但却没有携带数据报文。为了解决ACK传输效率低的问题,就衍生出了TCP延迟确认。TCP延迟确认的具体策略如下:

  • 当有响应数据要发送时,ACK会随着响应数据一起立刻发送给对端。
  • 当没有响应数据要发送时,ACK将会延迟一段时间,等待是否有响应数据可以一起发送。
  • 如果在延迟等待发送ACK期间,对方的第二个数据报文又到达了,这时会立刻发送ACK

TCP延迟确认

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

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

相关文章

基于SSM框架的《超市订单管理系统》Web项目开发(第二天)完成登录模块和用户退出模块

《超市订单管理系统》(第二天) 基于SSM框架的Web项目开发 ​ 昨天我们实现了登录功能,但是用的是模拟数据。今天我们要链接数据库整合SpirngMybatis,读取数据库中的真实数据,用来跟我们输入的userCode和userPassword进…

制作立体图像实用软件:3DMasterKit 10.7 Crack

3DMasterKit 软件专为创建具有逼真 3D 和运动效果的光栅图片而设计:翻转、动画、变形和缩放。 打印机、广告工作室、摄影工作室和摄影师将发现 3DMasterKit 是一种有用且经济高效的解决方案,可将其业务扩展到新的维度,提高生成的 3D 图像和光…

Git - Git Merge VS Git Rebase

文章目录 概述Flow View小结 概述 Git merge和Git rebase是两种不同的版本控制工作流程,它们用于将一个分支的更改合并到另一个分支。它们有不同的工作原理和应用场景,下面是它们的主要区别: 合并的方式: Git Merge:合…

用c++实现五子棋小游戏

五子棋是一款经典小游戏,今天我们就用c实现简单的五子棋小游戏 目录 用到的算法: 思路分析 定义变量 开始写代码 完整代码 结果图: 用到的算法: 合法移动的判断:isValidMove 函数通过检查指定位置是否在棋盘范…

基于matlab实现的 BPSK调制AWGN通道未编码数据误码率程序

完整程序: clear; close all; clc; c0; rate1; %Code rate N10000000; %Number of bits for EbNoc0:1:10 %Ratio of bit energy to no…

Stream流处理快速上手最佳实践 | 京东物流技术团队

一 引言 JAVA1.8得益于Lambda所带来的函数式编程,引入了一个全新的Stream流概念Stream流式思想类似于工厂车间的“生产流水线”,Stream流不是一种数据结构,不保存数据,而是对数据进行加工处理。Stream可以看作是流水线上的一个工…

【基础篇】ClickHouse 表引擎详解

文章目录 0. 引言1. 什么是表引擎2. 不同表引擎使用场景1. MergeTree:2. Log:3. Memory:4. Distributed:5. Kafka:6. MaterializedView:7. File和URL: 3. MergeTree 家族3.1. MergeTree:3.2. ReplacingMergeTree:3.3. SummingMergeTree:3.4. AggregatingMergeTree:3.5. Collaps…

【AI】机器学习——感知机

文章目录 4.1 感知机基本概念4.2 策略4.2.1 数据集的线性可分性4.2.2 学习策略目标损失函数的构造关于距离的解释 4.3 算法4.3.1 原始形式损失函数的梯度下降法 4.3.2 PLA例题4.3.3 算法收敛性 4.4 PLA对偶形式4.4.1 原始PLA分析4.4.2 PLA对偶形式4.4.3 优点 4.1 感知机基本概念…

office mac苹果办公软件安装包安装教程详解

软件下载 软件:mac office版本:2021语言:简体中文大小:4.27G安装环境:mac硬件要求:CPU2.0GHz 内存4G(或更高)下载通道 百度网盘 https://pan.baidu.com/s/1WGSB-icELUxweFkI8iIbzA 首先&#…

什么是JavaScript的事件驱动编程(event-driven programming)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 事件(Event)⭐ 事件监听器(Event Listener)⭐ 回调函数(Callback Function)⭐ 非阻塞和异步⭐ 事件循环(Event Loop)⭐ 触发事件(…

知识竞赛活动舞台搭建需要多少钱

知识竞赛活动舞台搭建的费用会根据不同的竞赛活动规模和要求而有所不同。对于小型的知识竞赛活动,如学校内部组织的知识竞赛或社区的知识竞赛活动,舞台搭建的费用往往相对较低。在这种情况下,可能只需要一些简单的装饰和道具,例如…

【C++进阶】:哈希(一)

哈希 一.unordered_map二.底层结构1.哈希概念2.解决哈希冲突1.闭散列2.开散列 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 l o g 2 N log_2N log2​N,即最差情况下需要比较红黑树的高度次,当树中的…

Linux:基础开发工具之yum,vim,gcc的使用

文章目录 yumvimgcc 本篇主要总结的是Linux下开发工具 yumvimgcc/g yum 什么是yum? 不管是在手机移动端还是pc端,不管是什么操作系统,当用户想要下载一些内容或者工具的时候,都需要到一个特定的位置进行下载,例如在…

初识Java 9-2 内部类

目录 为什么需要内部类 闭包和回调 内部类和控制框架 继承内部类 内部类的重写(并不能) 局部内部类 内部类标识符 本笔记参考自: 《On Java 中文版》 为什么需要内部类 在一些情况下,我们无法享受接口带来的便利&#xff0…

c刷题(四)

目录 获得月份天数 判断字母 字母大小写转换 网购 下列程序段的输出结果 字符逆序 自幂数 a的前n项之和 最小公倍数 倒置字符串 获得月份天数 获得月份天数_牛客题霸_牛客网 这道题可以用switch case语句解,不过这道题更简单的方法是数组,关…

AE-如何制作湖面水波纹波动的效果

目录 1.新建水面合成 2.新建纯色层命名为“分形杂色”,并添加“分形杂色”效果,设置相关参数 3.添加3D效果,并添加摄像机和空对象 4.新建中秋节合成,导入背景图,新建调整图层,并在调整图层上增加“焦散…

【C++】动态内存管理(79分钟写的文章哪里看不懂了,快来学)

动态内存管理目录: 一、C/C内存分布 在学习了C/C内存区域的划分后,我们来做几道题巩固一下: 1. 选择题:选项 : A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)globalVar在哪里?____ staticGlobalVar在哪里&#x…

一个Binder的前生今世 (一):Service的创建

一个Binder的前生今世 (一):Service的创建 一个Binder的前生今世Binder的历史 (字面意义的前生今世)Binder的生命周期(抽象意义的前生今世)Binder 应用及系统层关系图Binder应用层的架构设计Binder应用层实现Binder的创建服务端Binder的创建服务端Binder的传递Binder在客…

实现按钮悬停动画

知识点与技巧 伪元素 使用伪元素来作为按钮悬停效果动画展示的元素 z-index 的使用技巧 使用z-index属性来控制按钮和伪元素的层次关系 transform、transition 复习 使用transform、transition两个属性来实现动画的展示 按钮边框动画 切换效果 核心代码 .btn.btn-border-…

2023面试知识点一

1、新生代和老年代的比例 默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) 1/3 的堆空间大小。老年代 ( Old ) 2/3 的堆空间大小。其中,新生代 ( …