TCP—三次握手和四次挥手

 

目录

一、三次握手和四次挥手的目的

二、TCP可靠的方面

三、什么是三次握手

四、第三次握手的目的

五、什么是四次挥手

六、超时时间的目的

七、SYN包、ACK包、FIN包

八、解决丢包和乱序

九、参考资料


一、三次握手和四次挥手的目的

    TCP三次握手的目的主要是为了确保两个网络端点(即客户端和服务器)在数据传输开始前能够建立一个可靠的连接
    TCP四次挥手的目的是为了正确、可靠地终止两个网络端点(客户端和服务器)之间的已建立连接。这个过程确保了双方都有机会完成数据的发送和接收,同时正确地关闭连接
    这两个目的也就造就了TCP连接、可靠的特点。

二、TCP可靠的方面

    1.序列号和确认应答:
       TCP为每个发送的数据包分配一个序列号,并要求接收端对收到的数据包发送确认应答(ACK)。如果发送端在合理的超时时间内没有收到确认应答,它会重新发送该数据包。这确保了数据的有序传输和不丢失。

    2.数据重传:
       如果因为网络拥堵、路径变化或其他原因导致数据包丢失或错误,TCP会自动重传这些数据包,直到收到确认应答为止。这保证了数据的可靠传输。

    3.流量控制:
       TCP使用窗口大小控制机制来防止发送方过快发送数据,使得接收方来不及处理。窗口大小可以动态调整,以适应接收方的处理能力,避免数据溢出。

    4.拥塞控制:
       TCP实现了拥塞控制算法(如慢启动、拥塞避免、快速重传和快速恢复),以减少网络拥堵情况下的数据包丢失。这些算法通过动态调整数据的发送速率来适应网络状况。

    5.有序数据传输:
       即使数据包在网络中的传输过程中到达顺序发生了变化,TCP也能确保数据以正确的顺序交付给应用程序。

    6.错误检测:
       TCP头包含了校验和字段,用于检测数据在传输过程中是否出现错误。如果检测到错误,受影响的数据包将会被丢弃并重新请求传输。

三、什么是三次握手

    客户端先向服务端发送 SYN 包请求建立连接,然后服务端向客户端发送 SYN+ACK 包同意连接,客户端收到 SYN+ACK 包后发送 ACK 包,服务端收到这个 ACK包 后,连接建立。因为这个过程中互相发送了三包数据,所以称之为三次握手。

四、第三次握手的目的

    客户端先向服务端发送 SYN 包请求建立连接,然后服务端向客户端发送 SYN+ACK 包同意连接后大可以直接连接,为什么客户端要再发送一个 ACK 包,服务端接收到这个 ACK 包后再进行连接?

    这是为了防止失效的连接请求突然被接受,如果一个旧的连接请求在网络中延迟,并在连接已经建立后到达,三次握手可以帮助识别和拒绝这些失效的请求,避免可能的连接混乱。
    例如:client端先向server端发送一个 SYN1 包请求建立连接,但是这个 SYN1 包在网络中延迟没有到达server端,client端又向server端发送一个 SYN2 包请求建立连接,SYN2 包到达了server端,如果紧接着 SYN1 包也到达了server端,那么对于server端来说认为client端建立了两次连接,而client端任务连接了一次连接。 

五、什么是四次挥手

    下面假设主动关闭方为客户端,被动关闭方为服务端。
       客户端发起连接终止请求:发送一个 FIN 包,表示它已经完成了数据发送,并希望关闭连接。
       服务端关闭确认收到 FIN 包:发送一个 ACK 包来确认收到的 FIN 包。
       服务端关闭发送自己的 FIN 包:发送一个 FIN 包,表示它也准备好关闭连接。
       客户端确认收到对方的 FIN 包:发送一个 ACK 包来确认收到的 FIN 包。
       服务端收到 ACK 包 后立即关闭连接,客户端必须要经过超时时间(Timeout)后关闭连接。

六、超时时间的目的

    超时时间(Timeout)主要用于确保连接能够在特定时间内正确地终止,即使在面对网络延迟、数据包丢失或对方无响应等不稳定因素时也能保证连接的可靠关闭。

   例如:FIN-WAIT-2 发送的 ACK 包在网络中丢失了或者因为延迟被关闭方迟迟没有收到 ACK 包,此时如果关闭方关闭连接,被关闭方收不到 ACK 包就会一直处于等待关闭的状态,为了避免这种情况,关闭方必须进行一段超时时间等待,以便被关闭方重新发送一个 FIN 包,关闭方则会重发一个 ACK 包。

七、SYN包、ACK包、FIN包

    TCP协议中,SYN包和ACK包是用于建立、确认和管理连接的重要控制包。它们在三次握手和四次挥手过程中起着关键作用:

    (一)、SYN包(同步包)

    全称:Synchronize packet
    作用:用于发起和建立一个新的TCP连接。SYN包是TCP连接建立过程中发送的第一个包。
    特性:SYN包包含一个同步标志位(SYN=1)和初始序列号。它不包含实际的数据,只是用于连接初始化。
    使用场景:在三次握手的第一步和第二步中使用。
    第一步:客户端向服务器发送一个SYN包,以请求建立连接。
    第二步:服务器收到SYN包后,回送一个包含SYN和ACK标志的包(SYN=1, ACK=1),以确认收到客户端的请求。

    (二)、ACK包(确认包)

    全称:Acknowledgment packet
    作用:用于确认已经接收到的数据包。ACK包是TCP协议中几乎每个数据包都会带有的一个标志,用于确保数据的可靠传输。
    特性:ACK包包含一个确认标志位(ACK=1)和确认号。确认号是对已成功接收到的数据包的下一序列号。
    使用场景:三次握手:第二步:服务器向客户端发送SYN+ACK包,确认收到客户端的SYN请求,同时向客户端发送自己的SYN请求。
    第三步:客户端收到服务器的SYN+ACK包后,回送一个ACK包(ACK=1),确认收到服务器的SYN请求。
    四次挥手:每一步:在连接的终止过程中,双方发送FIN包(结束标志),并对收到的FIN包发送ACK包以确认。
    数据传输:在数据传输过程中,每发送一个数据包后,接收方都会发送一个ACK包来确认接收到的数据,确保数据的可靠传输。

    三次握手过程中的SYN和ACK包示意图

    ①客户端 -> 服务器:

SYN=1, Seq=x

    ②服务器 -> 客户端:

SYN=1, ACK=1, Seq=y, Ack=x+1

    ③客户端 -> 服务器:

ACK=1, Seq=x+1, Ack=y+1

    通过这些控制包,TCP能够建立可靠的连接,确保数据的有序和完整传输。

    (三)、FIN包(结束包)

    全称:Finish packet
    作用:用于终止一个TCP连接。FIN包表示发送方已经完成数据发送,并希望关闭连接。
    特性:FIN包包含一个结束标志位(FIN=1),通常还包括一个序列号。它不包含实际的数据。
    使用场景:在四次挥手过程中使用。

    四次挥手过程的详细示意图

    客户端 -> 服务器:

FIN=1, Seq=u

    服务器 -> 客户端:

ACK=1, Seq=v, Ack=u+1

    服务器 -> 客户端:

FIN=1, Seq=w

    客户端 -> 服务器:

ACK=1, Seq=u+1, Ack=w+1

    通过这种方式,TCP确保在关闭连接时,双方都能完成数据发送和接收,并且资源能够被正确释放,避免了潜在的资源泄露和连接混乱问题。这种优雅的关闭过程确保了网络通信的可靠性和稳定性。

八、解决丢包和乱序

 推荐大家观看视频一条视频讲清楚TCP协议与UDP协议-什么是三次握手与四次挥手_哔哩哔哩_bilibili 
    一包数据有可能会被拆成多包发送,如何处理丢包问题;这些数据包到达的先后顺序不同,如何处理乱序问题。

    针对这些要求,TCP协议为每一个连接建立了一个发送缓冲区,从建立链接后的第一个字节的序列号为0,后面每个字节的序列号就会增加1。

    发送数据时从发送缓冲区取一部分数据组成发送报文,在发送报文 tcp 协议头中会附带序列号和长度,接受端在收到数据后需要回复确认报文,确认报文中的 ACK等于接收序列号加长度,也就是下一包数据需要发送的起始序列号,这样一问一答的发送方式能够使发送端确认发送的数据已经被对方收到,发送端也可以一次发送连续的多包数据,接收端只需要回复一次ACK就可以了。

    这样发送端可以把待发送的数据分割成一系列的碎片发送到对端,对端根据序列号的长度在接收后重构出完整的数据,假设其中丢失了某些数据包,则接收端可以要求发送端重传。
    比如丢失了100-199这100个字节,接收端向发送端发送ACK=100的报文,发送端收到后重传这一包数据,接收端进行补齐。以上过程不区分客户端和服务端,tcp 连接是全双工的,对于两端来说均采用上述机制。

九、参考资料

谢希仁. 计算机网络(第8版). 电子工业出版社. 2021
https://www.youtube.com/watch?v=Iuvjwrm_O5g
TCP三次握手和四次挥手_哔哩哔哩_bilibili
一条视频讲清楚TCP协议与UDP协议-什么是三次握手与四次挥手_哔哩哔哩_bilibili

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

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

相关文章

基于机器学习模型预测信用卡潜在用户(XGBoost、LightGBM和Random Forest)

基于机器学习模型预测信用卡潜在用户(XGBoost、LightGBM和Random Forest) 随着数据科学和机器学习的发展,越来越多的企业开始利用这些技术来提高运营效率。在这篇博客中,我将分享如何利用机器学习模型来预测信用卡的潜在客户。此…

【Java】/*类和对象(下)*/

目录 一、封装 1.1 初识封装 1.2 如何封装成员变量 1.3 如何使用封装后的成员变量 二、访问限定符 三、包 3.1 包的概念 3.2 如何自定义包 3.3 导入包中的类 3.4 包的访问权限控制举例 示例一:private修饰成员变量 示例二: 不去修饰成员变…

【排序算法】插入排序和希尔排序

制作不易,三连支持一下吧!!! 文章目录 前言一、插入排序的原理及实现二、希尔排序的原理及实现总结 前言 从这篇博客开始,我们将介绍几种常见的排序算法! 插入排序算法是希尔排序的基础,所以理…

QT5.15.2及以上版本安装

更新时间:2024-05-20 安装qt5.15以上版本 系统:ubuntu20.04.06 本文安装:linux-5.15.2 下载安装 # 安装编译套件g sudo apt-get install build-essential #安装OpenGL sudo apt-get install libgl1-mesa-dev# 下载qt安装器 https://downl…

Centos 7.9 使用 iso 搭建本地 YUM 源

Centos 7.9 使用 iso 搭建本地 YUM 源 1 建立挂载点 [rootlocalhost ~]# mkdir -p /media/cdrom/ 2 创建光盘存储路径 [rootlocalhost ~]# mkdir -p /mnt/cdrom/ 3 上传 CentOS-7-x86_64-Everything-2207-02.iso 到 光盘存储路径 [rootlocalhost ~]# ls /mnt/cdrom/ CentOS-…

echarts取消纵坐标,自定义提示内容,完整 echarts 布局代码

效果图 实现代码 开启点击柱子时的提示内容 //完整写法请看下面tooltip: {trigger: axis,axisPointer: {type: shadow}},自定义提示内容 //完整写法请看下面formatter: function (param) {// param是悬浮窗所在的数据(x、y轴数据)let relVal "&…

免费,Python蓝桥杯等级考试真题--第10级(含答案解析和代码)

Python蓝桥杯等级考试真题–第10级 一、 选择题 答案: 解析:range取首不取尾,即产生了数1234,list()函数可以把产生的数1234转化为列表,故答案为A。 答案:B 解析:sort&a…

【芯片IC】常见拆解欣赏 单片机、FPGA、RS232

1. Giga Devices GD32F103CBT6 2.Altera Cyclone EP1C3 is the smallest 1-st generation FPGA from Altera. 在多晶硅层面,我们可以看到每个 M4K 块被细分为两半(两列共 26 个 “矩形”)。逻辑元件阵列是非对称的,在阵列右侧正中…

jetcache缓存

1 介绍 是阿里的双极缓存,jvm-->redis-->数据库 文档:jetcache/docs/CN at master alibaba/jetcache GitHub 2 注意事项 使用的实体类一定实现序列化接口定时刷新注解,慎用 它会为每一个key创建一个定时器 :场景为&…

Node.js —— Express 中间件、接口编写、接口跨域 【0基础向Express模块学习】

目录 中间件的概念 什么是中间件 现实生活中的例子 Express 中间件的调用流程 ​编辑 Express 中间件的格式 next 函数的作用 Express 中间件的初体验 定义中间件函数 全局生效的中间件 定义全局中间件的简化形式 中间件的作用 ​编辑 定义多个全局中间件 局部生…

前端绘制流程节点数据

根据数据结构和节点的层级、子节点id&#xff0c;前端自己绘制节点位置和关联关系、指向、已完成节点等 <template><div><div>通过后端节点和层级&#xff0c;绘制出节点以及关联关系等</div><div class"container" ref"container&…

java面试框架篇(Spring常见问题、SpringBoot、SpringMVC、mybatis经典问题、SpringCloud组件)

文章目录 面试专题-java框架篇1. spring常见问题1.1. spring是什么?1.2. 谈谈你对AOP的理解1.3. 谈谈你对IOC的理解1.4. Spring Boot、 Spring MVC和Spring有什么区别1.5. spring bean 生命周期1.6. spring事务传播机制有哪些?1.7. 循环依赖1.8. spring框架中使用了哪些设计模…

vue3插槽solt 使用

背景增加组件的复用性&#xff0c;个人体验组件化还是react 方便。 Vue插槽solt如何传递具名插槽的数据给子组件&#xff1f; 一、solt 原理 知其然知其所以然 Vue的插槽&#xff08;slots&#xff09;是一种分发内容的机制&#xff0c;允许你在组件模板中定义可插入的内容…

Python 实现Word (DOC或DOCX)与TXT文本格式互转

目录 引言 安装Python库 使用Python将Word转换为TXT文本格式 使用Python将TXT文本格式转换为Word 引言 Word文档和TXT文本文件是日常工作和生活中两种常见的文件格式&#xff0c;各有其特点和优势。Word文档能够保留丰富的格式设置&#xff0c;如字体、段落、表格、图片等…

Java入门基础学习笔记42——常用API

API&#xff08;全称&#xff1a;Application Programming Interface&#xff1a;应用程序编程接口&#xff09; 就是Java自己写好的程序&#xff0c;给程序员调用&#xff0c;方便完成一些功能的。 为什么要学别人写好的程序&#xff1f; 不要重复造轮子。 开发效率高。 面…

YOLOv5改进 | 主干网络 | 用repvgg模块替换Conv【教程+代码 】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 尽管Ultralytics 推出了最新版本的 YOLOv8 模型。但YOLOv5作为一个anchor base的目标检测的算法&#xff0c;YOLOv5可能比YOLOv8的效果更好。…

2024电工杯数学建模选题建议及各题思路来啦!

大家好呀&#xff0c;2024电工杯数学建模竞赛开始了&#xff0c;来说一下初步的选题建议吧&#xff1a; 首先定下主基调&#xff0c; 本次电工杯建议选B。A题目难度较高&#xff0c;只建议有相关专业知识和优化经验的队伍选择&#xff0c;小白队伍无脑选B即可。是比较经典的数…

网页加载时,大图片文件如何分片加载,有示例代码。

浏览网页时候&#xff0c;碰到大图片半天加载不出来&#xff0c;急死人&#xff0c;本问分享一种分片加载的方式&#xff0c;其实还有其他方式&#xff0c;比如先模糊后清晰等。 一、为什么要分片加载 大图片文件可以通过分片加载来提高加载性能和用户体验。分片加载的基本思…

PointCloudLib 点云Ransac拟合平面功能实现 C++版本

0.实现效果 左图为原始点云,右图中的红色点为拟合平面所选取的点,绿色的点为拟合平面所抛弃的点 拟合出的结果是一个平面方程。 1.算法原理 RANSAC(Random Sample Consensus,随机样本一致性)算法在拟合平面时的工作原理可以概括为以下几个步骤: 随机选择最小样本集: R…

PTK密钥传递攻击

一. PTK密钥传递攻击原理 1. PTK介绍 PTK(Pass The key)&#xff0c;中文叫密钥传递攻击&#xff0c;PTH传递中&#xff0c;使用的是NTLM-HASH值&#xff0c;PTK使用 AES256或者AES128的方式进行传递,PTK 攻击只能用于kerberos认证中,NTLM认证中没有&#xff01; 2.PTK的原理…