TCP三次握手与四次挥手

TCP三次握手与四次挥手
TCP三次握手与四次挥手解析

TCP三次握手与四次挥手、流量控制(滑动窗口)、拥塞控制、半连接状态、2MSL

TCP三次握手与四次挥手

TCP标志位:

标志位 含义
SYN 建立连接
ACK 响应确认
FIN 结束
RST 重置
PSH 推送
URG 紧急

TCP 三次握手(TCP Three-Way Handshake)

  1. 客户端发送同步序列号(SYN)报文: 客户端发送一个TCP报文,其中SYN位被置为1,表示请求建立连接。同时,客户端会选择一个初始序列号(ISN,Initial Sequence Number)。

  2. 服务器回应同步序列号(SYN)和确认序列号(ACK)报文: 服务器收到客户端的SYN报文后,如果同意建立连接,会以自己的SYN报文作为应答,并将确认序列号设置为客户端的ISN加1,同时自己也选择一个初始序列号。

  3. 客户端发送确认序列号(ACK)报文: 客户端收到服务器的SYN报文后,会发送一个带有ACK的报文,确认收到了服务器的连接应答。服务器收到这个报文后,完成三次握手,连接建立。

TCP 四次挥手(TCP Four-Way Handshake)

  1. 客户端发送结束连接报文(FIN): 客户端完成所有数据的发送后,发送一个带有FIN标志的TCP报文,表示数据发送完毕,请求断开连接。

  2. 服务器确认结束连接报文(ACK): 服务器收到客户端的FIN报文后,发送一个带有ACK的报文,表示已经接收到断开连接的请求。

  3. 服务器发送结束连接报文(FIN): 服务器在完成数据发送后,也向客户端发送一个带有FIN标志的报文,请求断开连接。

  4. 客户端确认结束连接报文(ACK): 客户端收到服务器的FIN报文后,发送一个带有ACK的报文,确认收到了服务器的断开请求。此时,连接完全断开。

以上过程是TCP连接的建立和断开的基本流程。在实际应用中,可能会有一些优化和调整,但这是基本的握手和挥手过程。

TCP三次握手与四次挥手解析

客户端连接服务器(三次握手)

第一个阶段 初始链接阶段

第一次握手

复制代码
SYN, seq=x

客户端 连接connect() 带上序列号X给服务器消息,客户端进入SYN-SEND的同步发送状态

第二次握手

复制代码
SYN, seq=y, ACK=x+1

服务器 侦听listen() 相关的端口,通常HTTP协议请求端口,80端口和HTTPS的443端口

服务器监听到端口应用收到了消息后,给客户端回复带上自己的序列号Y,并带上ACK确认码(应答信号)为客户端带来的序列号+1

服务器进入SYN-RCVD的同步已回复状态

第三次握手

复制代码
ACK=y+1

客户端收到了服务器的回复,带上服务器回复的序列号+1的确认码发送给服务器,建立链接成功,就可以进行数据的传递了

客户端关闭与服务器连接(四次挥手)

四次挥手是当客户端打算关闭连接

第一次挥手

客户端会主动带上握手时客户端确认码作为序列号发送给服务器断开连接

复制代码
seq=u

客户端进入结束等待为 1的状态 FIN-WAIT-1

第二次挥手

服务器收到了客户端断开消息,会带上自己的序列号v,即客户端带来的序列号+1,作为确认码回复给客户端

复制代码
seq=v, ACK=u+1

服务器进入CLOSE WAIT等待关闭的状态

客户端进入继续等待为 2的状态 FIN-WAIT-2

第三次挥手

服务器没有进一步的消息发送时,带上序列号w和客户端带来的序列号+1的确认码给客户端发送关闭请求

复制代码
seq=w, ACK=u+1

然后服务器进入LAST-ACK 最后确认状态

第四次挥手

客户端收到了服务器的关闭请求后,带上服务器最后一次发送的序列号+1,和序列号+1的确认码回复服务器

复制代码
seq=w+1, ACK=u+1

于是服务器关闭了链接

客户端进入了定时等待时间TIME_WAIT,即两个报文的最大生存周期时间,根据操作系统不同大约时1-4分钟,之后客户端才真正的断开

总结

当输入网站按下回车

第一步 是DNS找域名对应的IP

接下来三次握手 进入初始链接阶段

每次链接都要经历TCP/IP七层模型

连接初始成功后

进入第二阶段 SSL的加密协议的证书协商阶段

接下来是服务器准备我们需要的内容,准备好内容后,就是客户端下载内容阶段

相关推荐
JhonKI1 分钟前
【从零实现Json-Rpc框架】- 项目实现 - 客户端注册主题整合 及 rpc流程示意
c++·qt·网络协议·rpc·json
緣起緣落21 分钟前
Linux(CentOS 7) 部署 redis 集群
linux·运维·服务器·redis·centos·集成学习
无名之逆1 小时前
[特殊字符] Hyperlane 框架:高性能、灵活、易用的 Rust 微服务解决方案
运维·服务器·开发语言·数据库·后端·微服务·rust
小宁爱Python1 小时前
Python从入门到精通4:计算机网络及TCP网络应用程序开发入门指南
网络·python·tcp/ip·计算机网络
发财哥fdy1 小时前
4.2-3 fiddler抓取手机接口
网络
LUCIAZZZ2 小时前
计算机网络-TCP的拥塞控制
网络协议·tcp/ip·计算机网络
无名之逆2 小时前
探索轻量高性能的 Rust HTTP 服务器框架 —— Hyperlane
服务器·开发语言·windows·后端·http·rust
zyx没烦恼2 小时前
Linux 进程信号
linux·运维·服务器·开发语言·c++
佬乔2 小时前
xml中配置AOP织入
java·服务器·前端
网络安全指导员3 小时前
如何在JMeter中配置断言,将非200状态码视为测试成功
网络·学习·jmeter·安全·web安全·架构