TCP 三次握手过程分析

TCP(传输控制协议),是一种面向连接的、可靠的、基于字节流的传输层通信协议,它建立起的连接是双向的、对称的。

名词介绍

TCP 有 6 种标识位,SYN: 建立联机,ACK:确认,PSH:传送,FIN:结束,RST:重置,URG:紧急,Sequence number:顺序号码,Acknowledge number:确认号码。

TCP 三次握手的目的

TCP 三次握手是为了建立连接,在这个过程中需要完成两件事:

  1. 确认自己和对方都能发送、接收报文
  2. 把与自己相关的特殊信息发送给对方,比如:报文的初始序列号、发送数据的缓冲区大小,能接收的最大报文段长度等。

TCP 三次握手的流程

下面描述了 TCP 三次握手的流程

第一次握手:主机 A 向主机 B 发送 SYN=1,Seq=x,Sep 是报文的初始序列号。主机 B 通过 SYN=1 得知主机 A 请求建立联机。

第二次握手:主机 B 向主机 A 发送 SYN=1,ACK=1,Sep=y,ACknum=x+1。主机 A 通过 SYN=1 得知主机 B 请求建立联机,通过 ACK=1 得知主机 B 在确认联机,主机 A 检查 ACknum 是否等于 x+1,若等于则进入第三次握手。

第三次握手:主机A 向主机 B 发送 ACK=1,ACknum=y+1。主机 B 通过 ACK=1 得知主机 A 在确认联机,主机 B 检查 ACknum 是否等于 y+1,等于连接建立成功。

完成三次握手,主机 A 与主机 B 开始传送数据。

第一次握手主机 B 接收到报文后,它知道自己能接收报文,主机 A 能发送报文,但是主机 A 对自己的能力一无所知;第二次握手主机 A 接收到报文之后,结合第一次握手发送的报文,它自己能发送报文,接收报文,主机 B 能发送报文,接收报文;第三次握手主机 B 接收到报文后,结合前面两次握手,它知道自己能发送报文,接收报文,主机 A 发送报文,接收报文;

SYN 攻击

SYN 攻击是一种 DoS 攻击,攻击者利用 TCP 协议的缺陷,发送大量的半连接请求,消耗服务器资源,使服务器无法及时处理正常的请求。攻击原理如下:

正常的 TCP 连接要经历三次握手,第一次客户端发送 SYN 标志的数据包,第二次服务端返回一个 SYN/ACK 的应答包,第三次客户端返回一个确认包 ACK,这样才完成 TCP 连接。服务器发出应答包之后将等待客户端响应,直达超时,在等待期间,服务器将半连接状态的请求保存在缓存队列中,如果攻击方发起了大量的 SYN 标志的数据包,并且不响应服务端的 SYN/ACK 的应答包,那么就会使服务端的 TCP 资源迅速耗尽,导致正常的连接不能进入。

SYN 攻击不能完全阻止,除非重新设计 TCP 协议,预防 SYN 攻击的方法如下:

  1. 缩短超时(SYN Timeout)时间
  2. SYN cookies 技术
  3. 通过防火墙、路由器等过滤网关防护
相关推荐
永远的个初学者几秒前
图片优化 上传图片压缩 npm包支持vue(react)框架开源插件 支持在线与本地
前端·vue.js·react.js
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ2 分钟前
npm i / npm install 卡死不动解决方法
前端·npm·node.js
Kratzdisteln5 分钟前
【Cursor _RubicsCube Diary 1】Node.js;npm;Vite
前端·npm·node.js
AuroraDPY9 分钟前
计算机网络:基于TCP协议的自定义协议实现网络计算器功能
网络·tcp/ip·计算机网络
张人玉16 分钟前
TCP 的三次握手和四次挥手
网络·tcp/ip·c#
杰克尼23 分钟前
vue_day04
前端·javascript·vue.js
明远湖之鱼1 小时前
浅入理解跨端渲染:从零实现 React DSL 跨端渲染机制
前端·react native·react.js
悟忧1 小时前
规避ProseMirror React渲染差异带来的BUG
前端
小皮虾2 小时前
小程序云开发有类似 uniCloud 云对象的方案吗?有的兄弟,有的!
前端·javascript·小程序·云开发
Android疑难杂症2 小时前
鸿蒙Notification Kit通知服务开发快速指南
android·前端·harmonyos