IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> TCP的三次握手和四次挥手 -> 正文阅读

[网络协议]TCP的三次握手和四次挥手

TCP和UDP是两个重量级的传输层协议。UDP(用户数据报协议)在传送数据之前不需要先建立连接,远程主机在收到UDP报文后,不需要给出任何确认,虽然UDP不提供可靠交付,但在某些情况下UDP的确是一种最有效的工作方式,一般用于即时通信(语音、视频、直播等)。TCP(传输控制协议)提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接,由于TCP要提供可靠的面向连接的服务,这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源,TCP一般用于文件传输、发送和接收邮件、远程登陆等场景

三次握手可以理解为需要三个步骤才能建立握手/连接的机制,进行三次握手的作用是为了确认双方的接收和发送能力是否正常、指定自己的初始化序列号(ISN)为后面的可靠性传输作准备。

刚开始客户端处于Closed(没有任何连接状态)的状态,而服务端处于Listen(侦听来自远方TCP端口的连接请求)状态

1)第一次握手:客户端向服务端发送一个SYN报文(SYN=1),并指明客户端的初始化序列号ISN(x),表示本报文段所发送的数据的第一个字节的序号。此时客户端处于等待匹配的状态

2)第二次握手:服务端收到客户端的SYN报文之后,会发送SYN报文作为应答(SYN=1),并且指定自己的初始化序列号ISN(y),同时会把客户端的ISN+1作为确认号ack的值,表示已经收到了客户端发来的SYN报文,希望收到的下一个数据的第一个字节的序号是x+1,此时服务端处于(在收到和发送一个连接请求后等待对连接请求的确认)的状态

3)第三次握手:客户端收到服务端响应的SYN报文之后,会发送一个ACK报文,也是一样把服务端的ISN+1作为ack的值,表示已经收到了服务端发来的SYN报文,希望收到的下一个数据的第一个字节的序号是y+1,并指明此时客户端的序列号,此时客户端处于?Establised 状态

服务器收到 ACK 报文之后,也处于?Establised 状态,至此,双方建立起了 TCP 连接。

Established:代表一个打开的连接,数据可以传送给用户

ISN是动态生成的:三次握手的其中一个重要功能是客户端和服务端交换ISN,以便让对方知道接下来接收数据的时候如何按序列号组装数据,如果ISN是固定的,攻击者很容易猜出后续的确认好

第三次握手的时候,是可以携带数据的。但是第一次、第二次握手时绝对不可以携带数据

SYN 攻击就是?Client 在短时间内伪造大量不存在的 IP 地址,并向 Server 不断地发送 SYN 包,Server 则回复确认包,并等待 Client 确认,由于源地址不存在,因此 Server 需要不断重发直至超时,这些伪造的 SYN 包将长时间占用半连接队列,导致正常的 SYN 请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。

服务器发送完 SYN-ACK 包,如果未收到客户端响应的确认包,也即第三次握手丢失。那么服务器就会进行首次重传,若等待一段时间仍未收到客户确认包,就进行第二次重传。如果重传次数超过系统规定的最大重传次数,则系统将该连接信息从半连接队列中删除

TCP 四次挥手释放连接

建立一个 TCP 连接需要三次握手,而终止一个 TCP 连接要经过四次挥手。这是由于 TCP 的半关闭(half-close)特性造成的,TCP 提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。

TCP 连接的释放需要发送四个包(执行四个步骤),因此称为四次挥手,客户端或服务端均可主动发起挥手动作

1)第一次挥手:客户端发送一个 FIN 报文(请求连接终止:FIN = 1),报文中会指定一个序列号 seq = u。并停止再发送数据,主动关闭 TCP 连接。此时客户端处于?FIN_WAIT1?状态,等待服务端的确认

2)第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于?CLOSE_WAIT?状态。

此时的 TCP 处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待 2)状态,等待服务端发出的连接释放报文段。

3)第三次挥手:如果服务端也想断开连接了(没有要向客户端发出的数据),和客户端的第一次挥手一样,发送 FIN 报文,且指定一个序列号。此时服务端处于?LAST_ACK?的状态,等待客户端的确认。

4)第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答(ack = w+1),且把服务端的序列值 +1 作为自己 ACK 报文的序号值(seq=u+1),此时客户端处于?TIME_WAIT?(时间等待)状态

?注意 !!!这个时候由服务端到客户端的 TCP 连接并未释放掉,需要经过时间等待计时器设置的时间 2MSL(一个报文的来回时间) 后才会进入?CLOSED?状态(这样做的目的是确保服务端收到自己的 ACK 报文。如果服务端在规定时间内没有收到客户端发来的 ACK 报文的话,服务端会重新发送 FIN 报文给客户端,客户端再次收到 FIN 报文之后,就知道之前的 ACK 报文丢失了,然后再次发送 ACK 报文给服务端)。服务端收到 ACK 报文之后,就关闭连接了,处于?CLOSED?状态。

通俗的来说,两次握手就可以释放一端到另一端的 TCP 连接,完全释放连接一共需要四次握手

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 19:37:39  更:2022-08-19 19:39:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:33:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码