当前位置:网站首页>tcp中的三次握手与四次挥手
tcp中的三次握手与四次挥手
2022-08-05 00:53:00 【hgswnsa】
三次握手
三次握手是建立连接的过程
图示
在建立连接之前: 服务器处于 LISTEN 状态,客户端处于 CLOSED 状态。
第一次握手: 客户端给服务器发送一个同步报文段 SYN,并指定客户端的初始序列号 ISN,此时客户端处于 SYN_SENT 状态。
首部的同步位 SYN=1(SYN只是一个标志位,0表示不是SYN,1表示是SYN),初始序列号 seq=x 。SYN=1 的报文段不能携带任何的数据,但要指定序号。
第二次握手: 服务器接收到来自客户端的同步报文段 SYN 后,会以自己的 SYN 报文作为应答,并且也指定了自己的初始序列号 ISN,同时会把客户端的 seq+1 作为确认序列号 ack 的值,表示自己已经收到了客户端的同步报文段 SYN,此时服务器处于 SYN_RCVD 的状态。
确认报文段中 SYN=1,ACK=1(ACK也只是一个标志位,0表示不是ACK,1表示是ACK),初始序列号 seq=y ,确认序列号 ack=x+1 ,
第三次握手: 客户端收到来自服务器的同步报文段 SYN 之后,会发送一个确认报文段 ACK,以服务器的 seq+1 作为 ack 的值 ,表明自己已经收到来自服务器的同步报文段 SYN。客户端进入 ESTABLISHED 状态,服务器确认报文段 ACK 之后,也会进入 ESTABLISHED 状态。
确认报文段中 ACK=1,序列号 seq=x+1,确认序列号 ack=y+1,
至此,双方已经建立起连接,可以正常的发送数据。
三次握手为什么是三次?

三次握手才能确认双方都准备好了
第一次握手:客户端什么都不能确认,服务器确认了:对方发送正常,自己接收正常
第二次握手:客户端确认了:自己发送正常接收正常,对方发送正常接收正常;服务器确认了:对方发送正常,自己接收正常
第三次握手:客户端确认了:自己发送正常接收正常,对方发送正常接收正常;服务器确认了:对方发送正常接收正常,自己发送正常接收正常。
四次挥手
四次挥手是断开连接的过程
图示
客户端和服务器都可以主动关闭连接,只有率先请求关闭的一方才会进入TIME_WAIT状态
在断开连接之前: 客户端和服务器都处于 ESTABLISHED 状态,双方都可以主动断开连接,以客户端主动断开连接为优。
第一次挥手:客户端打算断开连接,向服务器发送 FIN 报文,FIN 报文中会指定一个序列号,之后客户端进入 FIN_WAIT_1 状态。
也就是客户端发出连接释放报文段 FIN=1,指定序列号 seq=u,主动关闭TCP连接,等待服务器的确认。
第二次挥手: 服务器收到 FIN 报文后,就向客户端发送 ACK 应答报文,以客户端的 FIN 报文的序列号 seq+1 作为 ACK 应答报文段的确认序列号 ack=u+1,指定序列号 seq=v。
接着服务器进入 CLOSE_WAIT 状态,此时的TCP处于半关闭状态,客户端到服务器的连接释放。客户端收到来自服务器的 ACK 应答报文段后,进入 FIN_WAIT_2 状态。
第三次挥手: 服务器也打算断开连接,向客户端发送 FIN 报文,之后服务器进入 LASK_ACK 状态,等待客户端的确认。
服务器的连接释放报文段中 FIN=1,ACK=1,序列号 seq=w,确认序列号 ack=u+1。
第四次挥手: 客户端收到来自服务器的 FIN 报文段后,会向服务器发送一个 ACK 应答报文段,以 FIN 报文段的确认序号 ack 作为 ACK 应答报文段的序列号 seq,以FIN报文段的序列号 seq+1作为确认序号ack。
之后客户端进入 TIME_WAIT 状态,服务器收到 ACK 应答报文段后,服务器就进入 CLOSED 状态,至此,服务器的连接已经完成关闭。
客户端处于 TIME_WAIT 状态时,此时的 TCP 还未释放掉,需要等待 2MSL 后,客户端才进入 CLOSED 状态。
边栏推荐
- Software Testing Interview Questions: What's the Difference Between Manual Testing and Automated Testing?
- ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionExcep
- 动态规划/背包问题总结/小结——01背包、完全背包
- 从一次数据库误操作开始了解MySQL日志【bin log、redo log、undo log】
- 2022牛客多校第三场 A Ancestor
- 【Redis】Linux下Redis安装
- 如何用 Solidity 创建一个“Hello World”智能合约
- 快速批量修改VOC格式数据集标签的文件名,即快速批量修改.xml文件名
- Jin Jiu Yin Shi Interview and Job-hopping Season; Are You Ready?
- Introduction to JVM class loading
猜你喜欢

5. PCIe official example

深度学习原理学习小结 - Self-Attention/Transformer

【Redis】Linux下Redis安装

gorm joint table query - actual combat

How DHCP works

【TA-霜狼_may-《百人计划》】图形4.3 实时阴影介绍

Theory of Software Fundamentals

Dynamic Programming/Knapsack Problem Summary/Summary - 01 Knapsack, Complete Knapsack

Creative code confession

从一次数据库误操作开始了解MySQL日志【bin log、redo log、undo log】
随机推荐
【机器学习】21天挑战赛学习笔记(二)
OPENWIFI实践1:下载并编译SDRPi的HDL源码
torch.autograd.grad求二阶导数
Software testing interview questions: the difference and connection between black box testing, white box testing, and unit testing, integration testing, system testing, and acceptance testing?
10年测试经验,在35岁的生理年龄面前,一文不值
工具类总结
内存取证系列1
Introduction to JVM class loading
Jin Jiu Yin Shi Interview and Job-hopping Season; Are You Ready?
Software testing interview questions: What stages should a complete set of tests consist of?
Software Testing Interview Questions: What's the Difference Between Manual Testing and Automated Testing?
Difference between MBps and Mbps
More than 2022 cattle school training topic Link with the second L Level Editor I
进程间通信和线程间通信
多线程涉及的其它知识(死锁(等待唤醒机制),内存可见性问题以及定时器)
如何用 Solidity 创建一个“Hello World”智能合约
JUC thread pool (1): FutureTask use
Lattice PCIe 学习 1
Software Testing Interview Questions: What Are the Types of Software Testing?
Memory Forensics Series 1