Karam
Articles71
Tags52
Categories15
TCP三次握手四次挥手流程

TCP三次握手四次挥手流程

三次握手和四次挥手的示意图


为什么连接需要是三次握手

TCP建立连接时需要三次握手,发送三个报文,三次握手的作用是保证发送方和接收方的收发能力正常,指定自己的初始化序列号为后面的可靠性传输做准备,实质上连接服务器端口,并同步链接双方的序列号和确认号,交换TCOP窗口大小信息
刚开始的时候客户端处于CLOSED状态,服务器端处于LISTEN状态
第一次握手:客户端发送SYN报文段,指明客户端的初始化序列号seq,此刻客户端处于SYN_SENT状态
第二次握手:服务器收到来自客户端的SYN报文后,状态转为SYN_REVD状态,向服务器发送一个SYNACK报文段,并指定服务器的初始化序列号,把客户端的初始化序列号+1作为ACK的值,表示确认收到了客户端的SYN报文段,此时客户端处于ESTABLISHED状态
第三次握手:客户端收到SYNACK报文段后,把服务器的初始化序号+1作为ACK的值返回,服务器收到后状态也转为ESTABLISHED,此时双方已建立连接

为什么需要三次握手而不是两次

第一次握手的目的是确定客户端的发送能力正常,服务器的接收能力正常
第二次握手的目的是确定服务器的发送能力正常
第三次握手的目的是确定客户端的接收能力正常
如果只有两次握手,那么客户端的接收能力无法保证正常

什么是半连接队列

服务器第一次收到客户端的SYN报文段后会进入SYN_RCVD状态,这时,还没有完全建立连接,服务器会把这种状态下的请求放入队列中,把这个没有完全建立连接的队列叫做半连接队列

ISN(初始化序列号)是固定的吗

不是固定的,ISN是随时间变化的

三次握手中可以携带数据吗

第一次和第二次握手不可以携带数据,第三次握手可以携带数据

SYN攻击是什么

攻击者向服务器发送大量的SYN报文段,使服务器生成大量的半连接状态的连接在队列中,这些连接占用队列导致正常的SYN报文因为队列溢出而被丢弃
如何预防:

  1. 缩短SYN的超时时间
  2. 使用SYN cookie
  3. 减少重发次数以增加半连接队列堆积
  4. 过滤网关防护

    四次挥手

    一开始双方都处于ESTABLISHED状态

第一次挥手:客户端发起FIN报文,报文中会指定以一个序列号,此时客户端处于FIN_WAIT1状态,发出连接释放的报文段(FIN=1,seq=M),并停止发送数据,主动关闭TCP连接,进入FIN_WAIT1状态,等待服务器确认
第二次挥手:服务器端收到FIN以后,会发送ACK报文,并且把客户端的序列号值+1作为ACK报文的序列号值,表明已经收到了客户端的报文此时服务器已经进入CLOSE_WAIT状态,服务器发送确认报文(ACK = 1, ack = M+1),TCP进入半关闭状态,客户端到服务器端的连接释放,客户端收到服务器端的确认后,进入FIN_WAIT2状态,等待服务器发送连接释放的报文段
第三次挥手:服务器发送FIN报文,且指定序列号,服务器进入LAST_ACK状态,等待客户端确认,客户端进入TIME_WAIT状态
第四次挥手:客户端接收到FIN报文后,发送一个ACK报文作为应答,且服务器的序列号值+1作为ACK报文的值,然后过一段时间(等待2MSL)客户端进入CLOSED状态,服务器收到ACK报文后,关闭连接,进入CLOSED状态

挥手为什么需要四次

因为服务器需要等待服务器端所有的报文都发送完毕才能确保关闭连接,所以需要四次挥手

四次挥手释放连接时,等待2MSL有什么意义

防止TCP再次发送ACK报文被丢弃,因为如果不设置2MSL的话,一旦ACK报文丢失,服务器端就无法正常关闭连接,