三次握手
服务器:
- 收到SYN
- 回复SYN+ACK,SYN半连接队列
- 收到ACK+(数据),accept全连接队列,accept函数从这里取
服务器可以选择半连接池满后是否开启syn cookies。可以在不使用半连接队列的情况下建立全连接,直接在收到ACK的时候校验即可。
可以选择0关闭功能,1仅当半连接队列满时才使用,2无条件开启
可以防止syn flood攻击:但这种方式建立的连接,许多 TCP 特性都无法使用(?)。所以,应当把 tcp_syncookies 设置为 1,仅在队列满时再启用
syncookies严重违反了TCP协议,不允许使用TCP扩展,可能导致一些服务的严重退化(比如SMTP relaying?)。
如果你看到了syn flood警告但你并没有被真正攻击,那么你的一些配置可能有问题(半连接数量可以调高点)
你如果想要测试syncookies的效果,你可以把它设置为2,无条件使用syn cookies
四次挥手
把主动关闭连接一方记做A,被动关闭一方记做B
FIN_WAIT_1
A调用close,发送FIN,进入FIN_WAIT_1
FIN_WAIT_2
A收到对面对FIN的ACK,进入FIN_WAIT_2,等待对方发送FIN
CLOSE_WAIT
B收到A的FIN后,发送ACK,等待进程调用 close 函数关闭连接(发送FIN给A)
TIME_WAIT
A收到B的FIN后,回复一个ACK,但还没有结束,它不知道这个ACK有没有被收到,所以要保持在TIME_WAIT状态2MSL
- 一是对方可能没有收到ACK,然后重传FIN包
- 防止具有相同「四元组」的「旧」数据包被收到,经过 2MSL 这个时间,足以让两个方向上的数据包都被丢弃,使得原来连接的数据包在网络中都自然消失,再出现的数据包一定都是新建立连接所产生的
注意
如果出现很多CLOSE_WAIT说明自己没有及时在收到对面的FIN后也关闭连接(没有调用close函数)
如果出现很多FIN_WAIT_2表示在等待对面的FIN,而对面迟迟没有发,说明对面没有调用close函数