常规回答:“因为三次握手才能保证双方具有接收和发送的能力”
原因一:避免历史连接
三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。
假设:客户端先发送了SYN(seq=90)报文,然后客户端宕机了,而且这个SYN报文还被网络阻塞了,服务端并没有收到,接着客户端重启后,又重新向服务端建立连接,发送了SYN(seq=100)报文。(这里不是重传,而是重新发送请求)
客户端连续发送多次SYN(都是同一个四元组)建立连接的报文,在网络拥堵的情况下:
- 一个[旧的SYN报文]比[最新的SYN]报文早到达了服务端,那么此时服务端就回一个SYN+ACK报文给客户端,此报文中的确认号是91(90+1)
- 客户端收到后,发现自己期望收到的确认号应该是100+1,而不是90+1,于是就会回RST报文
- 服务端收到RST报文后,就会释放连接。
- 后续最新的SYN抵达了服务端,客户端与服务端就可以正常的完成三次握手了。
上述中的「旧 SYN 报文」称为历史连接,TCP 使用三次握手建立连接的最主要原因就是防止「历史连接」初始化了连接。