大家都知道TCP是一种可靠的链接,之所以说它可靠是因为它在发送数据包之前会建立一个通道,待通道建立完毕后再发送数据,确保数据可以收到。而建立连接的过程和删除连接的过程也是很可靠的。建立连接是通过三次握手,删除连接是四次握手。下图是一个TCP三次握手的图,一个手机向一个服务器建立TCP连接:
为什么建立连接要三次握手呢?两次不行吗?答案是不行,因为第三次握手就是为了保证第二次握手是一定成功的。这里不成功有两种可能(1. server发出的SYN+ACK在半路丢失 2. 手机发出了SYN在半路上延迟了,很久才到Server端,Server端却正常回SYN+ACK, 但此时作为Client的手机端已经放弃这次连接了,不会再有第三次握手。那么连接也是建立不成功的。)建立连接的过程,就像古代求娶美人订婚,首先男方托媒到女方家说媒,表明想娶这位美人为妻(类似第一次握手)。美人的家人经过询问女儿现在有没有意愿,如果同意了,媒婆再跑到男方家说女孩愿意了,这类似于第二次握手。然后这样就可以了吗?订婚就算完成了吗?当然不是,这时男孩再送一些聘礼到女方家,说定求娶日期,这样才算订婚完成。假如第二次握手完成后,男方没来送聘礼,那说明可能有变故了,可能媒婆死了,也可能男方嫌等的时间长了,也可能被公主看上了等等。这时美人就会想男方应该不会来娶她了,她会再考虑其他的人。当然就算完成三次握手也可能男方一直迟迟不来,但是订婚已完成,美女会等上一段时间,毕竟已经达成协议了呀。
如下图,如果只有两次握手,但是第二次握手失败了,服务器认为连接已经建立成功,下面就会去向手机发送一些数据,但是其实并没有连接。就会造成发送失败。
另外,最后一次握手的ACK还带有最新的手机端的滑动窗口信息,便于服务器发送正确长度的报文。如下图所示,是一次成功的TCP三次握手:
并不是每次TCP握手都是成功的,如下图所示,黄色框里三个报文是一组,第三次服务器发送了RST报文,连接建立失败。