标签(空格分隔): TCP/IP
TCP 协议
- TCP 提供一种 面向连接 的, 可靠 的 字节流 服务.
- TCP 连接中, 仅有两方进行通信. 广播,多播 不能用于TCP.
- TCP 使用 校验和, 确认和重传 机制保证可靠传输.
- TCP 使用 累计确认.
TCP 使用 滑动窗口 机制来实现流量控制, 通过 动态改变窗口大小 进行拥塞控制
三次握手
三次握手, Three-way Handshake, 建立TCP连接,需要客户端和服务器发送 三个包.
- 三次握手的目的.连接指定端口,建立TCP连接,同步连接双方的序列号和确认号, 交换TCP窗口的大小信息.
- 在 Socket编程 中,客户端执行
connect()
时,触发三次握手.`` 第一次握手 (SYN=1, seq=x): 客户端发送一个TCP的包, SYN 标志位 为1. 设置服务器端口,初始序号 x, 保存在包头的序列号(Sequence Number)字段. 发送完毕后, 客户端进入
SYN_SEND` 状态.
第二次握手 (SYN=1, ACK=1, seq=y, ACKnum=x+1):
服务器发回确认包(ACK)应答, SYN标志位 和 ACK标志位 均为1. 服务器端选择自己的 ISN 序列号, 放到 Seq域里.
同时,将确认序号(Acknowledgement Number)设置为客户的 ISN 加 1 (x+1).
发送完毕后,服务器端进入 SYN_RCVD
状态.
第三次握手 (ACK=1, ACKnum=y+1):
客户端再次发送确认包(ACK), SYN 标志位 为0, ACK 标志位 为1. 把服务器发来的 ACK 的序号字段 加 1 (y+1).
放在确定字段中发送给对方, 在数据段放写 ISN+1.
发送完毕后,客户端进入 ESTABLISHED
状态.
当服务器端接收到这个包时,也进入 ESTABLISHED
状态, TCP握手结束.
- 三次握手过程示意图:![](https://blog.srefan.com/assets/images/network/tcp-connection-made-three-way-handshake.png#)
<a name="7814e7ee"></a>
#### 四次挥手
- 四次挥手, Four-way Handshake, 也叫改进的三次握手. 拆除TCP连接,需要发送 **四个包**.
- 客户端或者服务器都可主动发起挥手动作.
- 在 **Socket编程** 中,任何一方执行 `close()` 时,触发挥手操作.
第一次挥手 (FIN=1, seq=x):
客户端关闭连接, 发送一个 FIN 标志位 为1 的包,表示没有数据要发送了,但可以接收数据.
发送完毕后,客户端进入 FIN_WAIT_1
状态.
第二次挥手 (ACK=1, ACKnum=x+1):
服务器端确认客户端的 FIN 包,发送一个确认包, 表明接收了关闭连接的请求,但还没准备好关闭连接.
发送完毕后,服务器进入 CLOSE_WAIT
状态.
客户端接收到这个确认包, 进入 FIN_WAIT_2
等待服务器关闭连接.
第三次挥手 (FIN=1, seq=y):
服务器准备好关闭连接时,向客户端发送结束连接请求, FIN 标志位 为1.
发送完毕后,服务器进入 LAST_ACK
状态,等待来自客户端的的最后一个ACK.
第四次挥手 (ACK=1, ACKnum=y+1):
客户端接收到关闭请求,发送一个确认包,进入 TIME_WAIT
状态,等待可能出现的要求重传的ACK包.
服务器接收到确认包,关闭连接,进入 CLOSED
状态.
客户端等待了某个固定的时间 (2最大段生命周期, 2MSL, 2 Maximum Segment Lifetime) 之后,
没有收到服务器的ACK,认为服务器已正常关闭,自己也关闭连接,进入 CLOSED
状态.
```
-
SYN攻击
SYN 攻击 (SYN Flood)
- 服务器发送 SYN-ACK 后,收到客户端发送的 ACK 之前的TCP连接称为 半连接 (half-open connect).
- 攻击客户端在短时间内伪造大量的不存在的IP地址,向服务器发送SYN包,服务器回复确认包,等待客户端的确认.
- 由于源客户端 不存在 ,服务器需要 不断重发直至超时 .
- 这些伪造的SYN包长时间占用 未连接队列 ,正常的SYN请求被 丢弃 ,导致目标系统运行缓慢,网络拥堵,甚至系统瘫痪.
- SYN攻击是一种典型的 DoS/DDoS攻击.
- 如何检测SYN攻击: 在服务器上看到有大量的半连接状态时,特别IP地址是随机的,基本断定是一次SYN攻击. netstats 命令可以检测SYN攻击.
- 如何防御SYN攻击: 在TCP协议上分析,SYN攻击不能完全被阻止.只能尽可能减轻SYN攻击的危害.常用的防御方法:
- 缩短超时(SYN Timeout)时间
- 增加最大半连接数
- 过滤网关防护
- SYN Cookies技术