三次握手简介:
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
三次握手即指建立一个TCP连接时,需要客户端和服务器总共发送3个包。三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。
三次握手的过程:
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器 进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手。
为什么是三次握手:
通过三次握手,客户端与服务端建立起可靠的双工的连接,可以开始传送数据。
三次握手的最主要目的是保证连接是双工的,可靠更多的是通过重传机制来保证的。
但是为什么一定要进行三次握手来保证连接是双工的呢,一次不行么?两次不行么?四次呢?我们举一个现实生活中两个人进行语言沟通的例子来模拟三次握手。
这个例子可能不够生动,我们再来看个战争片两个战士通过对讲机发消息的过程:
在革命战争影片中,经常会看到英勇的解放军战士背着步话机在喊“长江长江,我是黄河,听到请回答。”很明显,这是呼号为黄河的一方想找呼号为长江的另一方说事,为了保证影片的节奏,导演往往把后面的联络过程省略了,其实后面还有两步,长江听到黄河的呼叫后要回答“黄河黄河,我是长江,收到请回答。”这叫做第二次握手。黄河听到长江的呼叫后还要回答“长江长江,我是黄河,我听到了你,现在请你收报”,这是第三次握手,三次握手成功后,才能在电台里传送工作报文。
通过上述的例子,我们就可以来分析为什么是三次握手了。
可以看出,第一次握手时,是发送方征求接收方是否收到,防止自己不是发送无效。而第二次握手是接收方回复发送方自己收到,并询问发送是否收到自己,防止自己发送无效。最后第三次是发送方进行确认自己收到,保证通信双方可以进行通信,从而开始对话。
TCP是可靠性协议,如果采用两次握手的话,就会出现下面这种情况。比如是A机要连到B机,结果发送的连接信息由于某种原因没有到达B机;于是,A机又发了一次,结果这次B收到了,于是就发信息回来,两机就连接。传完东西后,断开。结果这时候,原先没有到达的连接信息突然又传到了B机,于是B机发信息给A,然后B机就以为和A连上。就出现了已过期的连接再次传到被连接的主机。
还有·一种情况。考虑计算机A和B之间的通信,假定B给A发送一个连接请求分组,A收到了这个分组,并发送了确认应答分组。按照两次握手的协定,A认为连接已经成功地建立了,可以开始发送数据分组。可是,B在A的应答分组在传输中被丢失的情况下,将不知道A是否已准备好,不知道A建议什么样的序列号,B甚至怀疑A是否收到自己的连接请求分组。在这种情况下,B认为连接还未建立成功,将忽略A发来的任何数据分组,只等待连接确认应答分组。而A在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
可以看出两次握手产生的最大问题就是A发送请求,B应答并分配资源 .若B的应答没有到达A端,A认为连接未建立,而B认为建立了。因此就会出现一系列的问题。
而三次握手已经可以完成的事情为什么还要增加负担,浪费时间资源去建立四次握手呢?
总结可知,建立三次握手主要有三个原因:
(一)防止已过期的连接再次传到被连接的主机;
(二)防止形成死锁;
(三)防止发送无效消息。