TCP三次握手四次挥手

三次握手

服务器:

  • 收到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函数

Refs

  • This is strictly a violation of the TCP specification
  • TCP性能调优
  • tcp_syncookies
  • 面试官:换人!他连 TCP 这几个参数都不懂 写得非常好

你可能感兴趣的:(TCP三次握手四次挥手)