给大家解释一下网络的三次握手原因?为啥是三次呢?
先给大家看张图:
第一次握手:客户端通过调用connect发起主动打开。客户端向服务器发出连接请求的TCP报文段,其TCP首部中的同步比特SYN置为1,并TCP首部中序号seq设置为x(TCP规定SYN报文段不能携带数据,但是要消耗一个序号),表明要转送数据时初始序列号是x。通常SYN分节不携带数据,其所在IP数据报只含有一个IP首部,一个TCP首部。
第二次握手:服务器收到数据报后,从TCP数据报首部的同步比特SYN位为1就知道这是一个建立连接的请求。服务器如果同意,会发回确认。在确认报文段中把同步比特位SYN设置为1,确认比特位ACK设置为1,由于TCP请求报文段中的序号是x,所以服务器在发送确认报文段中的确认号ack是x+1,同时把确认报文段中的序号seq设置为y,表明服务器发送数据的初始序列号为y。该报文段也不能携带数据(因为SYN=1,所以不携带任何数据)。
第三次握手:客户端收到服务器端的报文段后, 要对服务器端中的SYN进行确认。在确认报文段中把确认比特位ACK设置为1,然后把确认号ack设置为y+1,自身的序号seq设置x+1。
最主要是防止已过期的连接再次传到被连接的主机。
三次握手改成仅需要两次握手,死锁是可能发生。
这里之所以需要三次握手,而不是两次或者四次,是因为两次握手无法保证双方的状态同步,而四次握手则过于冗余。三次握手既能保证双方的状态同步,也能防止旧的重复连接引起连接混乱,因此被广泛采用。