什么是 TCP 三次握手
TCP三次握手是客户端和服务器建立TCP连接的过程,主要目的是确认双方的通信能力正常,并同步双方的初始序列号。
具体过程如下:
第一次握手,客户端向服务器发送一个 SYN 请求,并携带自己的初始序列号,表示客户端希望建立连接。
第二次握手,服务器收到请求后,回复 SYN+ACK,一方面确认收到了客户端的请求,另一方面发送自己的初始序列号。
第三次握手,客户端收到服务器的 SYN+ACK 后,返回 ACK 确认消息,表示已经收到服务器的数据。此时双方都确认对方的发送和接收能力正常,TCP连接正式建立。

第三次握手的 ACK 丢了会怎么样?
客户端发完第三次握手的 ACK 后就进入 ESTABLISHED 状态了,它以为连接已经建好了。但服务端没收到 ACK,它还卡在 SYN_RCVD 状态,会触发超时重传 SYN+ACK。客户端收到重传的 SYN+ACK 后会再发一次 ACK。如果重传几次还没收到 ACK,服务端会放弃这个半连接。客户端如果这时候发数据,服务端会发现这个连接没建好,直接回 RST 把它终止掉。
三次握手能携带数据吗?
第一次和第二次握手不能携带数据,因为连接还没建立,如果允许带数据会有安全风险,攻击者可以在 SYN 里塞大量数据进行攻击。第三次握手是可以携带数据的,因为这时候客户端已经知道服务端的接收能力是正常的,连接在客户端看来已经建立了。不过实际上很少这么用,因为这需要应用层配合,大多数场景下还是等连接建好再发数据。
什么是 SYN 洪泛攻击?怎么防御?
攻击者伪造大量不存在的 IP 地址,向服务器发送 SYN 请求。服务器回复 SYN+ACK 后,这些伪造 IP 的主机不会回应,服务器只能等超时。这些半连接会占用服务器的 SYN 队列资源,队列满了正常用户就连不上了。
防御手段有几种:一是调大 SYN 队列和缩短超时时间,治标不治本;二是 SYN Cookie,服务器不维护半连接状态,把状态信息编码到 SYN+ACK 的序列号里,收到第三次握手时再验证;三是用防火墙或代理先过滤,只有完成三次握手的连接才放进来。
说说 TCP 的四次挥手?
TCP四次挥手是释放TCP连接的过程。由于TCP是全双工通信,双方需要分别关闭自己的发送方向。首先客户端发送FIN请求关闭连接,服务器收到后返回ACK确认;等服务器数据发送完成后,再发送FIN关闭连接,客户端收到后返回ACK确认。最后客户端进入TIME_WAIT状态,等待一段时间后关闭连接。