一、TCP的三次握手
二、accept分别发生在三次握手的哪个阶段?
-
通过上图来分析一下TCP三次握手的具体细节
- 第1步:服务端处于LISTEN状态,客户端处于CLOSED状态
- 第2步:客户端打开,并进行SYN的发送,处于SYN_SENT状态
- 第3步:服务端收到此条消息后,转为SYN_RCVD状态,并对客户端进行消息回复
- 第4步:客户端收到此条消息后,转为ESTABLISHED状态,并发送一个ACK的确认消息
- 第5步:服务端收到此条消息后,转为ESTABLISHED状态
- 至此,三次握手完成
- 此时你或许可能会认为accept是会发生在上面的第3步,但是这是错误的
-
实际的accept是发生在三次握手之后,原因如下:
- 服务端的accept()函数会为客户端分配资源
- 但是设想一下,如果成千上万的客户端连接服务端,之后就不再回应服务端了,但是服务端仍然需要保持这些资源信息,这就白白浪费了服务端的资源(这就是DDOS攻击的原理)
- 因此accept()函数是被放到了TCP三次握手完成之后的,