一、TCP三次握手简介:
第一次握手:客户端-->服务端,发送SYN=1,ACK=0(表示请求建立连接),seq=x。发送后客户端进入SYN-SEND状态;
第二次握手:服务端-->客户端,发送SYN=1,ACK=1(表示可以建立连接),ack=x+1,seq=y。发送后服务端由LISTEN状态进入STN-RCVD状态;
第三次握手:客户端-->服务端,发送ACK=1(表示确认报文),seq=x+1,ack=y+1。服务端检查ACK=1,ack=y+1,无误后双方进入ESTABLISHED状态。
注意:标志位SYN置1,ACK置0表示请求建立连接;标志位SYN置1,ACK置1表示确认建立连接。
SYN、ACK是标志位,而ack是确认序号,只有当标志位ACK置1,确认序号字段才有效。
二、为什么TCP握手需要三次:
防止已失效的请求连接报文(可能在某个节点长时间停滞,以至于已经释放连接后才到达服务端),到达服务端B后,服务端B以为客户端A要建立新的连接,随即发送确认报文,同意建立连接。若是没有第三次握手,新的连接就建立了,而B一直等待A发送数据,A则不理会B的确认,造成资源浪费。
追问:为什么不能四次握手?
答:三次握手已经确认了双方收发功能都正常,是client与server是否确定连接的最小值,四次握手也可以,但是多余,浪费时间,浪费资源。