1.客户端向服务端发起一连接请求,即SYN报文,包含SYN=1,seq_no=j(SYN_SENT,已发送状态)
2.服务端收到SYN,返回一个ACK报文,ACK=1,ack_no=j+1,seq_no=k(SYN_REVD,已回应状态),并将SYN包记录在半连接队列中
3.客户端收到ACK后,客户端就进入已连接状态(ESTABLISHED);同时向服务端发送确认ACK,包含ACK=1,ack_no=k+1,服务端收到确认ACK,进入已连接状态(ESTABLISHED)
1.客户端发送FIN,包含FIN=1,seq=w,进入FIN_WAIT_1状态
2.服务端收到FIN,会立即回应ACK,包含ACK=1,ack=w+1,seq=k,服务端进入CLOSE_WAIT状态;此时服务端可能还有数据处理没有执行完,比如客户端的发送未读完或者响应没有写完,会继续执行完毕;客户端收到第一个ACK,进入FIN_WAIT_2状态
3.服务端数据处理结束,发送第二个ACK,包含FIN=1,ACK=1,seq=h,ack=w+1(和第一此ack一致),并进入LAST_ACK状态
4.客户端收到第二个ACK表示服务端已处理结束,回应服务端一个ACK,包含ACK=1,seq=w+1 ,ack=h+1,客户端进入TIME_WAIT状态;服务端收到ACK后进入CLOSED状态,LAST_ACK期间如果没有收到客户端的确认ACK,服务端会重发断开确认的ACK即第二个ACK,服务端等待2MSL的原因就是确保服务端已经收到最后一个ACK,而MSL为一个数据包在网络传输的最大生命周期,具体时长和硬件有关,2MSL的时长一般会在1-4分钟之间
1.攻击者伪造大量ip地址发送syn报文
2.服务端半连接队列被占满,且收不到ack应答
3.其他客户端无法发送的连接请求因为半连接队列已满而被拒绝连接
源IP+目标IP+协议号(TCP:6)+源端口+目标端口
三次握手是最小成本确认双方连接确认,再增加握手次数只会增加连接成本;而断开四需要四次,因为TCP是全双工的模式,是为了保证被动断开的一方能够处理完数据再断开,所以才有二次ACK;而客户端在收到第二次ACK并回应服务端后不会立刻断开而是进入TIME_WAIT状态,是为了确保再有效时限内服务端能接收到最后确认的ACK;不在进行第五次握手也是因为TIME_WAIT状态足以保证服务端确认,有效节省网络传输的开销