什么是 socket?
socket = 套接字,是应用程序和网络之间的桥梁。
网络通信就像打电话:
服务器(Server) → 等待接电话。
客户端(Client) → 拨打电话。
支持 TCP(可靠传输,常见于 HTTP、SMTP)和 UDP(速度快,常见于 DNS、视频流)
网络安全相关应用
学会 socket 后,你可以做很多安全工具:
-
端口扫描器(扫描主机哪些端口开放)
-
反向 shell(远程控制主机)
-
简单木马通信(客户端 = 攻击机,服务端 = 被控机)
TCP 和 UDP 的区别
| 特性 | TCP | UDP |
|---|---|---|
| 连接方式 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 保证数据可靠传输(丢包会重传) | 不保证可靠传输(可能丢包) |
| 速度 | 较慢(握手、确认开销大) | 较快(直接发,不确认) |
| 应用场景 | 网页 (HTTP/HTTPS)、邮件 (SMTP/IMAP)、远程登录 (SSH) | 视频直播、DNS 查询、语音通话、游戏传输 |
形象比喻:
- TCP → 打电话(先确认、对话有序)。
- UDP → 寄明信片(直接发,不保证收到)。
端口扫描器选择 TCP 还是 UDP?
一般情况下:
-
优先选择 TCP
- 因为 TCP 服务更常见(Web、SSH、SMTP、FTP)。
- 建立连接能确认端口确实开放。
UDP 端口扫描也有价值,但:
- UDP 无连接,可能丢包,容易被防火墙丢弃。
- 很多 UDP 服务不会主动回应(除非请求符合协议)。
所以:
- 普通端口扫描 → TCP
- 专门探测 DNS、SNMP、DHCP 等服务 → UDP
为什么攻击者喜欢用反向 shell?
正向连接(攻击机 → 被控机)
- 攻击者主动连接目标。
- 缺点:目标服务器可能有防火墙,阻止外部连接。
反向 shell(被控机 → 攻击机)
- 被控机主动连接攻击者。
-
优点:
- 绕过防火墙(防火墙一般只拦截外部进入,但允许内部访问外网)。
- 攻击者不需要目标暴露端口。
- 更隐蔽,容易长期维持访问。
举个例子:
- 正向 shell → 你打电话给别人(可能被拦截)。
-
反向 shell → 别人主动打电话给你(大多数公司允许内部访问外网)。
- TCP:可靠,适合扫描常见服务。
- UDP:快但不稳定,适合特殊协议。
- 反向 shell:更隐蔽,更容易突破防火墙。
TCP 三次握手(Three-way Handshake)
TCP 是「面向连接」的协议,在客户端和服务器开始通信之前,必须先建立连接。 这个建立连接的过程,就是 三次握手。
步骤详解
第一次握手:SYN
-
客户端 → 服务器:
- 发送一个带 SYN 标志位 的报文(表示“我要建立连接”)。
- 同时发送一个随机的初始序列号(Seq)。
类比:你打电话给别人:“喂,我想和你通话,可以吗?”
第二次握手:SYN + ACK
-
服务器 → 客户端:
- 回复一个带 SYN 和 ACK 标志位 的报文。
- SYN 表示同意建立连接。
- ACK 确认收到了客户端的请求。
类比:对方接电话,说:“好的,我收到你的请求,我也准备好了。”
第三次握手:ACK
-
客户端 → 服务器:
- 回复一个 ACK 报文,确认收到服务器的回应。
-
连接正式建立,双方进入 ESTABLISHED 状态,可以开始传输数据。
类比:你再回答一句:“收到,那我们开始聊天吧。”
图解
客户端 服务器
| ------- SYN ------> | (我要建立连接)
| <---- SYN + ACK --- | (好的,我收到了)
| ------- ACK ------> | (确认,可以开始传输数据)
为什么要三次?
-
保证双方都确认:
- 客户端知道服务器在线。
- 服务器知道客户端在线。
-
防止历史报文干扰:
- 如果只有两次握手,可能会把“旧请求”误当成新连接。
安全相关
-
SYN Flood 攻击:
- 黑客不断发送 SYN 请求,但不完成后续握手。
- 服务器会浪费资源等待 ACK,最终导致拒绝服务(DoS 攻击)。
总结:
- 三次握手保证了 TCP 连接的可靠性。
- 在安全测试中,理解三次握手很重要,因为很多攻击(如 SYN Flood、端口扫描)都与此机制相关。