首页 > 其他分享 >TCP中握手挥手流程解读

TCP中握手挥手流程解读

时间:2023-12-25 10:32:29浏览次数:27  
标签:socket 流程 ACK 握手 TCP 挥手 连接 客户端

TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,在网络通信中起着至关重要的作用。TCP连接的建立和关闭过程涉及到握手和挥手流程,本文将深入解读TCP中的握手和挥手流程,并提供详细的代码演示,以帮助读者更好地理解和应用TCP协议。

1. 握手流程

TCP连接的建立采用三次握手的过程,确保通信的双方都能够正常工作。以下是TCP连接的建立过程:

1.1 第一次握手(SYN)

客户端向服务器发送一个SYN(同步)包,表明客户端请求建立连接。

1.2 第二次握手(SYN + ACK)

服务器接收到客户端的SYN包后,会回复一个SYN + ACK包,表示服务器已经接收到了客户端的请求,并同意建立连接。

1.3 第三次握手(ACK)

客户端收到服务器的SYN + ACK包后,向服务器发送一个确认ACK包,表示客户端也同意建立连接。

通过这三次握手,TCP连接建立成功,双方可以开始进行数据传输。

2. 挥手流程

TCP连接的关闭采用四次挥手的过程,确保数据的完整传输。以下是TCP连接的关闭过程:

2.1 第一次挥手(FIN)

客户端向服务器发送一个FIN(结束)包,表明客户端不再向服务器发送数据,但仍能接收数据。

2.2 第二次挥手(ACK)

服务器接收到客户端的FIN包后,向客户端发送一个确认ACK包,表示服务器已经接收到了客户端的关闭请求。

2.3 第三次挥手(FIN)

服务器向客户端发送一个FIN包,表明服务器不再向客户端发送数据,但仍能接收数据。

2.4 第四次挥手(ACK)

客户端接收到服务器的FIN包后,向服务器发送一个确认ACK包,表示客户端已经接收到了服务器的关闭请求。

通过这四次挥手,TCP连接成功关闭,双方完成了数据传输的结束。

3. 代码演示

以下是一个简单的使用Python的Socket库实现的TCP连接建立和关闭的代码演示:

3.1 TCP连接建立

import socket

# 服务器端
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 8080))
server_socket.listen(1)

print("等待客户端连接...")
client_socket, client_address = server_socket.accept()

# 第一次握手(客户端发起)
data = client_socket.recv(1024)
print(f"收到客户端的连接请求:{data}")

# 第二次握手(服务器回复)
server_socket.sendall(b"SYN-ACK")

# 第三次握手(客户端确认)
data = client_socket.recv(1024)
print(f"客户端确认连接:{data}")

# TCP连接建立成功

3.2 TCP连接关闭

# 第一次挥手(客户端发起)
client_socket.sendall(b"FIN")

# 第二次挥手(服务器回复)
data = server_socket.recv(1024)
print(f"收到客户端的关闭请求:{data}")

# 第三次挥手(服务器发起)
server_socket.sendall(b"FIN")

# 第四次挥手(客户端回复)
data = client_socket.recv(1024)
print(f"客户端确认关闭连接:{data}")

# TCP连接关闭成功

请注意,以上代码只是演示TCP连接的建立和关闭过程,并未处理异常情况和错误处理。在实际应用中,需要添加适当的异常处理代码来确保程序的稳定运行。

4. 总结

TCP连接的建立和关闭是网络通信中至关重要的过程,通过握手和挥手流程,确保通信的双方能够正常协作。本文通过详细的解读和代码演示,希望读者能够更加深入地理解TCP连接的建立和关闭过程,并在实际应用中更加灵活地使用TCP协议进行网络通信。

标签:socket,流程,ACK,握手,TCP,挥手,连接,客户端
From: https://blog.51cto.com/u_16192077/8964069

相关文章

  • EKP qhky 流程启接口addReview 支持明细表地址本传递多值
     问题描述: 流程启动接口(addReview),给第一行多人员地址本字段 传多个部门,后台代码解析不成功     /** * *20230703定制处理附件列表问题sjx * ***/ for(inti=0;i<attForms.size();i++){ S......
  • 从系统镜像获取image文件, magisk刷机流程和ssh模块安装
    1adbshell2adbshell3adbpull/sdcard/patcheda.img4adbrebootbootloader5fastbootboot.\patcheda.img6adbrebootbootloader7fastbootboot.\patcheda.img8adbshell   PSC:\Users\13450>adbshellcrosshatch:/$cdcd......
  • Qt&&C++ 实现Tcp Server
    关于Qt&C++实现Tcp服务器的一些简易使用笔记... "材料"准备#include<QTcpServer>//Server需要包含该头文件,Client则不用#include<QTcpSocket>#include<QHostAddress>服务器流程简要1.实例化一个QTcpServer对象:  QTcpServer*server=newQTcpServer(this);2......
  • TCP与UDP协议有何区别?在LiteCVR中应该选择哪种方式?
    TCP(TransmissionControlProtocol)和UDP(UserDatagramProtocol)是互联网传输协议中最常用的两种协议。有用户在使用我们的平台时,经常会出现对于端口的疑问,同时也不了解端口的差别。今天我们来解释说明下LiteCVR平台关于国标GB28181协议接入下的TCP和UDP模式的说明及差异。1、TCP......
  • spring加载bean流程解析
    spring加载bean流程解析转载自:https://www.cnblogs.com/wyq178/p/11415877.htmlspring作为目前我们开发的基础框架,每天的开发工作基本和他形影不离,作为管理bean的最经典、优秀的框架,它的复杂程度往往令人望而却步。不过作为朝夕相处的框架,我们必须得明白一个问题就......
  • Druid源码阅读--带流程图
    一、架构分析​Druid类图如下所示:​两大核心类:DruidDataSource和DruidAbstractDataSource​连接有效性check:从连接池中获取连接后会做有效性check,在类中有ValidConnectionChecker接口,对应有不同数据库的实现​异常处理:针对不同的数据库,druid......
  • xv6 磁盘中断流程和启动时调度流程
    本文讲述xv6中的一些细节流程,还有对之前文中遗留的问题做一些补充说明,主要有以下几个问题:一次完整的磁盘中断流程进入调度器后的详细流程sched函数中的条件判断scheduler函数中为什么要周期性关中断一次完整的磁盘流程此节讲述完整的磁盘读写流程,读写的流程总体差不多,这里以读......
  • 神经网络量化流程(第一讲TensorRT)
    TensorRT量化工具,支持PTQ和QAT量化基本流程:读取模型-》转化为IR进行图分析,做一些优化策略一、TensorRT量化模式TensorRT有两种量化模式:分别是implicitly以及explicitly量化,前者是隐式量化,在7.0及之前版本用的较多;后者显式量化在8.0版本后才完全支持,就是可以加载带有QDQ信息的模......
  • JAVA云his系统、门诊、住院业务使用流程知识总结
    云HIS系统是一款满足基层医院机构各类业务需要的健康云系统。系统能帮助基层医院机构完成日常各类业务,提供病患挂号支持、病患问诊、电子病历、开药/发药、会员管理、统计查询、医生站和护士站等一系列常规功能,还能与公卫、PACS等各类外部系统融合,实现多层机构(医院)之间的融合管理。......
  • 2.7 Metallic与Speculer流程及相互转换
    一、PBR流程金属/粗糙度和高光反射/光泽度工作流程通用贴图:法线贴图(normalmap)AO贴图(ambientocclusionmap)高度贴图(heightmap)1.金属度/粗糙度工作流(常用)BaseColorRGB贴图-sRGBBaseColorRGB贴图-sRGB储存数据:非导体(电介质)的漫反射色/反照率颜色(DiffuseReflectedColor/Albedo)......