趣讲TCP三次握手
一、TCP三次握手简介
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP连接中,只有两方进行通信,它使用校验和、确认和重传机制来保证数据的可靠传输。

二、三次握手过程
1.第一次握手(SYN)
客户端向服务器发送一个SYN(同步序列编号)标志位的TCP数据包,请求建立连接。这个数据包中包含了客户端的初始序列号(ISN)。
2.第二次握手(SYN+ACK)
服务器收到客户端的SYN请求后,会回复一个带有SYN和ACK(确认)标志位的数据包,称为SYN-ACK响应。这个响应中,服务器确认了客户端的SYN请求,并指定了服务器的初始序列号(ISN)。同时,服务器还会对客户端的初始序列号进行确认,即发送一个确认号(ACK号),表示已经收到客户端发送的序列号加1的数据。
3.第三次握手(ACK)
客户端收到服务器的SYN-ACK响应后,会发送一个带有ACK标志位的数据包,表示确认了服务器的响应。这个ACK数据包中,客户端会确认收到了服务器的SYN响应,并指定了下一个要发送的序列号(即服务器的初始序列号加1)。至此,三次握手完成,TCP连接建立成功,双方可以开始进行数据传输。
三、为什么需要三次握手
1.三次握手原因
三次握手的主要目的是为了确保双方的发送和接收能力都正常,防止已失效的连接请求报文突然又传送到服务器,从而产生错误。通过三次握手,可以告知对方自己的初始序号值,并确认收到对方的初始序号值。
- 第一次握手:客户端向服务器端发送报文,证明客户端的发送能力正常。
- 第二次握手:服务器端接收到报文并向客户端发送报文,证明服务器端的接收和发送能力正常。
- 第三次握手:客户端向服务器发送报文,证明客户端的接收能力正常。
这样,三次握手确保了双方都准备好进行数据传输,从而可以愉快地进行通信了。
2.无三次握手示例
如果没有三次握手,TCP连接将无法建立,因为三次握手确保了双方都准备好发送和接收数据。下面我将提供一个简化的示例,展示如果没有三次握手,客户端和服务器之间的通信可能会出现的问题。
2.1服务器端代码(没有三次握手)
import socketdef main():# 创建 socket 对象server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 获取本地主机名host = socket.gethostname()port = 9999# 绑定端口号server_socket.bind((host, port))# 设置最大连接数,超过后排队server_socket.listen(5)print("服务器启动,等待连接...")while True:# 建立客户端连接client_socket, addr = server_socket.accept()print(f"连接地址: {str(addr)}")# 直接发送数据,没有等待客户端的确认client_socket.send(b'你好,客户端!')# 关闭连接client_socket.close()if __name__ == "__main__":main()
2.2客户端代码(没有三次握手)
import socket
import timedef main():# 创建 socket 对象client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 获取本地主机名host = socket.gethostname()port = 9999# 连接到服务器,指定主机和端口client_socket.connect((host, port))# 等待一段时间,模拟没有发送SYN和等待服务器的SYN+ACKtime.sleep(2)# 接收数据,但由于没有完成三次握手,服务器可能还没有准备好发送数据data = client_socket.recv(1024)if data:print(f"来自服务器的消息:{data.decode()}")else:print("没有收到任何数据")# 关闭连接client_socket.close()if __name__ == "__main__":main()
2.3可能出现的问题
-
数据丢失:在客户端尝试接收数据之前,服务器可能还没有准备好发送数据,或者服务器在客户端准备好接收之前就已经发送了数据。这可能导致客户端接收不到任何数据。
-
连接不稳定:由于没有进行三次握手,客户端和服务器之间的连接可能不稳定,容易出现断开连接的情况。
-
数据乱序:没有三次握手,就无法确保数据的顺序和完整性,可能导致数据乱序或丢失。
-
重复数据:如果客户端或服务器在没有确认对方已准备好的情况下发送数据,可能会导致重复发送数据。
这些代码示例仅用于说明没有三次握手可能导致的问题,实际应用中,TCP协议会自动处理三次握手的过程,开发者不需要手动实现。在实际编程中,我们通常使用高级的网络库,这些库已经为我们处理了这些底层的细节。
四、三次握手示例代码
1.服务器端代码(Server.py)
import socket# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 获取本地主机名
host = socket.gethostname()
port = 9999# 绑定端口号
server_socket.bind((host, port))# 设置最大连接数,超过后排队
server_socket.listen(5)while True:# 建立客户端连接client_socket, addr = server_socket.accept()print(f"连接地址: {str(addr)}")# 接收小于 1024 字节的数据data = client_socket.recv(1024).decode()print(f"收到消息:{data}")# 发送数据client_socket.send(b'服务器收到消息')# 关闭连接client_socket.close()
2.客户端代码(Client.py)
import socket# 创建 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 获取本地主机名
host = socket.gethostname()
port = 9999# 连接到服务器,指定主机和端口
client_socket.connect((host, port))# 发送数据
client_socket.send(b'你好,服务器!')# 接收小于 1024 字节的数据
data = client_socket.recv(1024)
print(f"来自服务器的消息:{data.decode()}")# 关闭连接
client_socket.close()
3.运行步骤
- 首先运行服务器端代码(Server.py),它会在本地的9999端口上监听客户端的连接。
- 然后运行客户端代码(Client.py),它会尝试连接到服务器,并发送一条消息。
- 服务器接收到消息后,会回复一条消息给客户端。
- 客户端接收到服务器的回复,并打印出来。
- 最后,客户端和服务器都会关闭连接。
相关文章:
趣讲TCP三次握手
一、TCP三次握手简介 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP连接中,只有两方进行通信,它使用校验和、确认和重传机制来保证数据的可靠传输。…...
Python 字典与集合:从入门到精通的全面解析
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
基于coze+微信小程序实现图片上传并利用大模型解析
项目截图: 实现代码(直接搬去可用) 前提:需要填写你的oss配置coze的api授权配置!!! <template><view class"container"><!-- 高斯模糊背景 --><view class&qu…...
java——执行linux/cmd命令
在Java中执行命令行命令可以通过Runtime.exec()或ProcessBuilder实现。以下是两种方法的详细说明和示例代码: 1. 使用 Runtime.exec() 适用于简单场景,但需手动处理输入/输出流。 try {// 执行命令(参数以数组形式传递,避免空格…...
VMware Fusion 虚拟机Mac版 安装CentOS 7 系统
介绍 CentOS是Community Enterprise Operating System的缩写,也叫做社区企业操作系统。是企业Linux发行版领头羊Red Hat Enterprise Linux的再编译版本(是一个再发行版本),而且在RHEL的基础上修正了不少已知的 Bug ,相…...
java练习(44)
ps:题目来自力扣 两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 // 定义链表节点类,每个节…...
Deepseek 开源周第一天:FlashMLA
Deepseek 隆重开启开源周!第一天我们迎来了FlashMLA。我很高兴带大家了解这项创新,揭秘 FlashMLA 为何能成为 AI 和 GPU 优化领域的变革者。 Deepseek 开源周的热门话题有哪些?...
DeepSeek-OpenSourceWeek-第三天-Release of DeepGEMM
DeepGEMM:这是一款专为高效的 FP8(8 位浮点)通用矩阵乘法(GEMMs)而开发的尖端库。GEMMs 是许多 AI 工作负载(尤其是深度学习)中的基本操作。 特点: 支持稠密和 MoE GEMMs:它可以处理标准的稠密矩阵乘法以及混合专家(MoE)模型中使用的矩阵乘法。MoE 是一种神经网络架…...
Bitlocker取证之PXE降级取密钥
支持到微软Surface pro系列。...
【补阙拾遗】排序之冒泡、插入、选择排序
炉烟爇尽寒灰重,剔出真金一寸明 冒泡排序1. 轻量化情境导入 🌌2. 边界明确的目标声明 🎯3. 模块化知识呈现 🧩📊 双循环结构对比表★★★⚠️ 代码关键点注释 4. 嵌入式应用示范 🛠️5. 敏捷化巩固反馈 ✅ …...
跨AWS账户共享SQS队列以实现消息传递
在现代分布式系统中,不同的服务和组件通常需要进行通信和协作。Amazon Simple Queue Service (SQS)提供了一种可靠、可扩展且完全托管的消息队列服务,可以帮助您构建分布式应用程序。本文将介绍如何在一个AWS账户(账户A)中创建SQS队列,并授权另一个AWS账户(账户B)中的用户和角色…...
基于Python实现的【机器学习】小项目教程案例
以下是一个基于Python实现的【机器学习】小项目教程案例,结合的经典案例与最佳实践,涵盖数据预处理、模型训练与评估全流程,并附详细代码说明与结果分析: 案例1:鸢尾花分类(SVM算法) 数据集:Iris Dataset(含150个样本,4个特征,3个类别) 目标:根据花瓣与萼片长度…...
TDengine 中的数据库
数据库概念 时序数据库 TDengine 中数据库概念,等同于关系型数据库 MYSQL PostgreSQL 中的数据库,都是对资源进行分割管理的单位。 TDengine 数据库与关系型数据库最大区别是跨库操作,TDengine 数据库跨库操作除了少量几个SQL 能支持外&…...
.Net Core Visual Studio NuGet.Config 配置参考
Visual Studio 2022 NUGET NU1301 无法加载源 基础连接已关闭:无法建立SSL / TLS安全通道的信任关系;根据验证过程,远程证书无效,参考文章:https://blog.csdn.net/hefeng_aspnet/article/details/145780081 NuGet 行为…...
深入剖析 OpenCV:全面掌握基础操作、图像处理算法与特征匹配
深入剖析 OpenCV:全面掌握基础操作、图像处理算法与特征匹配 一、引言二、OpenCV 的安装(一)使用 pip 安装(二)使用 Anaconda 安装 三、OpenCV 基础操作(一)图像的读取、显示与保存(…...
帧率和带宽
帧率,通常指的是每秒传输的帧数,帧就是一段数据包。 带宽则是指在单位时间内可以传输的数据量,通常以比特每秒来衡量 帧率在ROS2中可能指的是每秒发布的消息数量。也就是说,一个节点发布话题的频率。比如,每秒发布10次…...
Immich自托管服务的本地化部署与随时随地安全便捷在线访问数据
文章目录 前言1.关于Immich2.安装Docker3.本地部署Immich4.Immich体验5.安装cpolar内网穿透6.创建远程链接公网地址7.使用固定公网地址远程访问 前言 小伙伴们,你们好呀!今天要给大家揭秘一个超炫的技能——如何把自家电脑变成私人云相册,并…...
20250212:ZLKMedia 推流
1:资料 快速开始 ZLMediaKit/ZLMediaKit Wiki GitHub GitHub - ZLMediaKit/ZLMediaKit: WebRTC/RTSP/RTMP/HTTP/HLS/HTTP-FLV/WebSocket-FLV/HTTP-TS/HTTP-fMP4/WebSocket-TS/WebSocket-fMP4/GB28181/SRT server and client framework based on C++11 文档里面提供了各个系…...
IDEA中.gitignore未忽略指定文件的问题排查与解决
IDEA 中.gitignore 未忽略.env 文件的问题排查与解决 在使用 IntelliJ IDEA 进行项目开发时,合理利用.gitignore文件来管理版本控制是非常重要的。它能帮助我们排除一些不需要纳入版本管理的文件,比如包含敏感信息的.env文件。然而,有时我们会遇到一种情况:明明已经将.env…...
Apache-iotdb 基本概念
问题背景 定义(写得太好了!) root 是整个树状结构的父节点, CirroData-TimeS 有存储组、设备、测点等概念,数据在存储的时候,不同的存储组的数据是存储在不同的文件夹中的。上图中有 root.sgcc、root.ln两…...
CryptoJS库中WordArray对象支持哪些输出格式?除了toString() 方法还有什么方法可以输出吗?WordArray对象的作用是什么?
前言:这里只说js用的CryptoJS库里的相关内容,只用js来进行代码操作和讲解。 这里网上相关的帖子很少,不得已问了很长时间AI 想引用CryptoJS库情况分两种,一种是html引用,另一种是在Nodejs里引用。 一、引用CryptoJS库…...
Java 面试题 20250227
Java 中序列化与反序列化是什么? 序列化:将 Java 对象转化成可传输的字节序列格式(字节流、JSON、XML),以便于传输和存储。 反序列化:将字节序列格式数据转化成 Java 对象的过程。 1、为什么需要序列化和…...
springboot浅析
springboot浅析 什么是springboot? 实际上springboot就是一个给我们提供了快速搭建使用spring的一种方式,让我们省去了繁琐的xml配置。 为什么无需进行大量的xml配置,就是因为springboot是基于约定优于配置的思想,简单来说就是遵循…...
【文件基础操作】小笔记
Step1: 现在项目文件夹(我的项目叫做RunPony)下创建一个a.txt文本文件,手动写入一些数字,保存 Step2: 现在在main.c内写一个基本的文件处理的程序 Step3: 现在已经知道如何打开关闭文件,下一步要搞懂如何读取txt内的…...
SSL 证书是 SSL 协议实现安全通信的必要组成部分
SSL证书和SSL/TLS协议有着密切的关系,但它们本质上是不同的概念。下面是两者的区别和它们之间的关系的表格: 属性SSL/TLS 协议SSL证书英文全称SSL(Secure Sockets Layer),TLS(Transport Layer Security&am…...
AI问答-供应链管理:排队模型M/D/5/100/m/FCFS代表的含义是什么
在供应链管理中,排队模型M/D/5/100/m/FCFS代表的含义如下: M: 表示顾客到达时间间隔服从负指数分布(Markov,负指数分布具有无记忆性),即顾客到达是随机的,且到达时间间隔服从指数分…...
迁移学习策略全景解析:从理论到产业落地的技术跃迁
(2025年最新技术实践指南) 一、迁移学习的范式革命与核心价值 在人工智能进入"大模型时代"的今天,迁移学习已成为突破数据瓶颈、降低训练成本的关键技术。本文基于2025年最新技术进展,系统梳理六大核心策略及其在产业实…...
Linux驱动学习(四)--字符设备注册
上一节讲到的字符设备注册与销毁是通过cdev_init、cdev_add、cdev_del等函数分步执行的,本小节用一种更简单的方式,来注册字符设备 register_chrdev 如果major为0,该函数将动态的分配一个主设备号并且返回对应的值如果major > 0ÿ…...
30天开发操作系统 第24天 -- 窗口操作
一、窗口切换 1.0 前天开始我们的应用程序可以显示自己的窗口了,现在画面上到处都是窗口,我们急需能够 切换窗口顺序的功能,使得在需要的时候可以查 看最下面的窗口的内容。这个功能看起来不难,我们马上来实现它。 不过…...
Visual Studio 中 C/C++ 函数不安全警告(C4996)终极解决方案:分场景实战指南
问题描述 在 Visual Studio 中编写 C/C 代码时,使用 scanf、strcpy、fopen 等传统函数会触发以下警告: C4996: xxx: This function or variable may be unsafe. Consider using xxx_s instead. 根本原因: 这些函数缺乏缓冲区溢出检查&#…...
