目录
在我们讲解三次握手和四次挥手之前,我们先了解一下TCP报文
在图中,小白已经把三次握手和四次挥手在报文中用到的一些字段已经解释了,接下来我们根据报文来认真理解三次握手和四次挥手
三次握手
小白先画一个三次握手的流程图
第一次握手
客户端向服务端发送一个SYN置1,它表示客户端要向服务端发送一个新的连接,seq表示从客户端给服务端发送这个报文的序号是多少,并且这个序号是由计算机随机生成的一个32位2进制数字,这里我们假如生成的是10000这个数字。当服务端收到这个报文之后就知道客户端要和我建立一个新的连接,于是服务端就向客户端发送一个确认消息包,也就是ack,这也就触发了第二次握手。
第二次握手
在服务端就向客户端发送一个确认消息包中,它包含了ACK标志位置为1,表示确认客户端发起第一次连接请求。和ask=10001,表示消息确认,这个ask值是怎么来的?就是第一次握手seq+1,这样相当于完成了第二次握手,接下来就引出了一个面试常问的问题:为什么两次握手不行?
我们这样想:两次握手之后,对于客户端而言:已经明确了我既能给服务端成功发消息,也能成功收到服务端的响应。但是对于服务端而言:两次握手是不够的,因为到目前为止,服务端只知道一件事,客户端发给我的消息我能收到,但是我响应给客户端的消息,客户端能不能收到我是不知道的。这也是为什么两次握手不行。
所以在第二次握手的时候,服务端就向客户端发送一个确认消息包的同时,也发送了一个SYN置1,seq=20000的一个新的连接,目的是让客户端收到这个消息之后,要给服务端一个回应。回应的过程就是第三次握手
第三次握手
第三次握手就是当客户端收到服务端发送的确认响应报文之后,还要继续去给服务端进行回应,也是一个ACK标志位置1的确认消息。
这样通过以上三次连接,不管是客户端还是服务端,都知道我既能给对方发送消息,也能收到对方的响应。那么,这个连接就被安全的建立了
四次挥手
同样,小白先画一个四次挥手的流程图
第一次挥手
第一次挥手也是先由客户端发起,客户端会发送一个报文,在报文里面FIN位标志位置1,(在TCP报文我们也说了,FIN表示想结束一个连接),seq=25368(这里假如seq生成的是25368)当服务端收到这个报文之后,我就知道了客户端想要和我断开连接。
第二次挥手
当服务端收到客户端想要断开这个连接的时候,此时服务端不一定能做好准备,因为当客户端发起断开连接的这个消息的时候,对于服务端而言,他还有可能有未发送完的消息,他还要继续发送,所以呢,此时对于服务端而言,我只能进行一个消息确认(ASK=1,seq=25369),就是我先告诉服务端,我知道你要给我断开连接了,但是我这里边还可能没有做好准备,你需要等我一下,等会儿我会告诉你。
第三次挥手
第二次挥手的时候,服务端不是只给客户端发送了一个消息确认包吗,那么过了一会之后,服务端已经做好了断开连接的准备,它就会继续发送一个断开连接的一个报文啊,也是一个FIN位置1的报文,也是由服务端发给客户端的。这也是第三次挥手。
第四次挥手
当客户端接收到服务器发送给客户端断开连接的一个报文的时候,客户端同样要给服务端继续发送一个消息确认的报文,以至于让服务端得知客户端已经接收到了之前发的断开连接的报文。
那么通过这四次的相互沟通和连接,我们就知道了,不管是服务端还是客户端都已经做好了断开连接的准备,于是连接就可以被断开,这就是四次挥手。