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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

谷歌地图 | Google I/O ‘24 重磅发布助力企业拓展海外市场的新功能!

编者按:本文是 Google I/O 2024 系列的一部分,该系列分享了Google 年度开发者大会上最新的 Google Maps Platform 新闻。 距全球首个 Google Maps API 问世已近 20 年。它引领了网络和移动端地理空间体验的革命。从那时起,Google Maps Platf…

Common Lisp笔记

在计划学习函数式编程的时候,我一开始打算学习的是 F#。因为我朋友就是在 DTU 上的学,F# 就是 DTU(丹麦理工)开发的。但是由于 F# 和微软的 .NET 绑定,而在 macOS 上,目前版本的 .NET 的是有些问题的&#…

2023年平均工资公布!你是什么段位?

来源国家统计局(下同) 01 城镇非私营单位就业人员年平均工资情况 2023年,全国城镇非私营单位就业人员年平均工资为120698元,比上年增加6669元,名义增长5.8%,扣除价格因素实际增长5.5%。 2014-2023年城镇非私…

基于FPGA实现LED的闪烁——HLS

基于FPGA实现LED的闪烁——HLS 引言: ​ 随着电子技术的飞速发展,硬件设计和开发的速度与效率成为了衡量一个项目成功与否的关键因素。在传统的硬件开发流程中,工程师通常需要使用VHDL或Verilog等硬件描述语言来编写底层的硬件逻辑&#xff0…

Pytorch深度学习实践笔记12(b站刘二大人)

🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:pytorch深度学习 🎀CSDN主页 发狂的小花 🌄人生秘诀:学习的本质就是极致重复! 《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibi…

锐捷网络与您相约第七届数字中国建设峰会 共话数字未来

第七届数字中国建设峰会将于5月24日至25日在福建福州举办,本届峰会是国家数据工作体系优化调整后首次举办的数字中国建设峰会,主题是“释放数据要素价值,发展新质生产力”。作为行业领先的ICT基础设施及解决方案提供商,锐捷网络与福建省电子信息集团、星网锐捷,围绕“发展新质生…

newinit.sh挖矿攻击处理与规避方案

目录 攻击分析 恢复措施: 问题排查 攻击入口分析 预防 临时处理方案: 攻击分析 攻击者:职业黑客(99%) 攻击方式:挖矿病毒newinit.sh和蠕虫病毒pnscan 中毒现象: 服务器负载异常,具体表…

06_知识点总结(JS高级)

一、进程与线程 1. 进程(process):程序的一次执行, 它占有一片独有的内存空间 2. 线程(thread): 是进程内的一个独立执行单元,CPU的基本调度单元, 是程序执行的一个完整流程 3. 进程与线程 * 应用程序必须运行在某个进程的某个线程上 * 一个…

反射、类加载、静态代理,jdk动态代理,cglib代理

一、 反射 反射是在程序运行状态下,动态获取类的结构(属性,构造器,方法,注解),动态的创建类对象然后调用类中的属性方法。反射的起源Class,Class中包含类反射要使用的API 获取Class的…

【LeetCode】【2】两数相加(1411字)

文章目录 [toc]题目描述样例输入输出与解释样例1样例2样例3 提示Python实现模拟 个人主页:丷从心 系列专栏:LeetCode 刷题指南:LeetCode刷题指南 题目描述 给两个非空的链表,表示两个非负的整数,它们每位数字都是按…

大模型的发展方向:让大模型感知人类所处的物理世界,文字、听、看、闻、触摸、动手操作等信息接收和输出能力,向物理世界学习 大模型开发者方向

大模型的发展方向非常广泛,除了让大模型感知人类所处的物理世界,通过文字、听觉、视觉、嗅觉、触觉和动手操作等信息接收能力,还包括以下几个重要的方向: 多模态学习与融合: 多模态感知:整合来自不同感知渠…

neo4j详细安装教程

前言 最近开始学习知识图谱,现整理Neo4j的详细安装教程,Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。由于知识图谱中存在大量的关系型信息(实体—关系—实体), 使用结构化数据库进行存…

SpringBoot + Redis实现对接口的限流

目录 前言 什么是限流? 实现限流 创建一个注解类 接着创建一个切面类 前言 在项目中,对于接口的限流,是任何项目都必不可少的一部分,主要是为了防止用户频繁的发送请求,对服务器造成压力。 另外一点就是防止外来攻…

Android USB调试模式下自动上下滑动(Go实现)

简介 有的时候要对手机UI界面进行滑动测试, 手动或许太消耗时间, 理由Android USB调试模式对UI进行上下滑动测试。 adb指令 使用adb --help 可以查看所有的adb支持指令, 但这里我们只需要上下, 使用到的指令: adb devices #列举所有设备 ad…

AI Agent教育行业落地案例

【AI赋能教育】揭秘Duolingo背后的AI Agent,让学习更高效、更有趣! ©作者|Blaze 来源|神州问学 引言 随着科技的迅猛发展,人工智能技术已经逐步渗透到我们生活的各个方面。而随着AI技术的广泛应用,教育培训正引领着一场新的…

SHELL编程(三)网络基础命令 Makefile

目标 一、网络基础及相关命令(一)网络相关命令(二)重启网络服务 二、Makefile(一)标签式语法(二)目标:依赖 式语法1. 格式2. 编译流程:预处理 编译 汇编 链接3. 目标和伪…

7B2PRO5.4.2主题 wordpress主题开心版免授权源码

这款7B2 PRO主题也是很多小伙伴儿喜欢的一个主题,有伙伴儿反馈说想学习下新版本,这不就来了,免受权开心版本可供学习使用,要运营还是尊重下版权到官网进行购买吧。 下载:7B2PRO5.4.2 wordpress主题免授权直接安装_麦…

常见的几种数据库通过SQL对表信息进行查询

一、前言 我们查询数据库表的信息,一般都使用界面化的连接工具查看,很少使用SQL语句去查,而且不同的数据库SQL语句又各自有差异。但如果通过代码去获取数据库表的信息,这时就需要通过SQL语句去查了,这个在逆向代码生成…

接口测试及接口测试常用的工具详解

🍅 视频学习:文末有免费的配套视频可观看 首先,什么是接口呢? 接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。 系统对外的接口:比如你要从别的网站或服务器上获取资源或信息…

python打造自定义汽车模块:从设计到组装的全过程

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、定义汽车模块与核心类 三、模拟汽车组装过程 四、抽象与封装 五、完整汽车…