过程:
第一次握手:建立连接时,客户端A的TCP进程首先创建传输控制块TCB,然后向服务器B发送连接请求报文,请求报文的同步位syn = 1,并随机产生seq = x 的数据包到服务器B,客户端A进入SYN_SEND(同步已发送)状态,等待服务器的确认;服务器B由syn = 1 可以知道,A要求建立连接。
第二次握手:服务器B收到请求报文后,如同意建立连接,则向客户端A发送确认报文。在确认报文中应把SYN位和ACK位都置1,确认号是ack = x+1 ,同时也为自己选择一个初始序列号seq = y。这时服务器B进入SYN_RCVD (同步已发送) 状态。
第三次握手:主机A收到服务器B的确认报文后,还要向B给出确认。确认报文的ACK位置1,确认号ack = y + 1 ,而自己的确认号seq = x + 1。这时,主机A进入ESTABLISHED(已建立连接) 状态;当服务器B收到主机A的确认报文后,也进入ESTABLISHED状态。
为什么要采用三次握手,两次不行吗?
现假定出现一种异常情况,即 A 发出的第一个连接请求报文没有丢失,而是在某些网络节点长时间滞留了,以致延误到连接释放以后的某个时间点才到达B。本来这是一个早已失效的报文段,但B收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求。于是向A发送确认报文,同意建立连接。假定不采用两次握手,那么只要B发出确认报文,新的连接就建立了。但是由于现在A并没有发出新的建立连接请求报文,因此不会理会B的确认报文,也不会向B发送数据。但B却以为新的运输连接已经建立了,并一直等待A发来的数据。B的许多资源就这样白白浪费了。而采用三次握手的办法可以防止上述现象的发生。
【参考文献】
谢希仁 ,《计算机网络》(第6版), 电子工业出版社。
网友评论