TCP三次握手,四次挥手详解!

TCP三次握手,四次挥手详解!
重点解释:

32位序号(seq):随机生成,唯一标识报文的当前序号。

32位确认序号(ack):对上一条发送的信息进行确认,一般为上一条seq+1。

ACK标志位:

注:区别ACK标志位和确认序号(ack),ACK只有一位,要么1,要么0。ack有32位,一般等于seq+1。

SYN标志位:置为1时,表示发起新的连接。

FIN标志位:置为1时,表示结束连接。

TCP三次握手,四次挥手详解!
解释(注:这里为了方便,没有采用32位,使用1000和10000的seq进行讲解。):

1.客户端要想跟服务器建立连接,需要先将SYN位,置为1(表示我想与服务器端建立新的连接),且随机生成一个32位序号seq。(seq用于判断报文是否合法,比如想发送的报文seq是999,但客户端里面的seq是1000,以此来判断报文是不合法的)
2.此时,客户端已经跟服务器建立连接,但这还不够,服务器也是需要跟客户端建立连接的。所以此时的服务器也需要将SYN置为1,同时随机生成一个32位序号seq。接着,需要将ACK置为1(表示服务器端已经接收到客户端的消息,且消息是有效的),同时需要带上确认序号ack,ack=seq+1,即1001。
3.如果没有第三次,你觉得能成功建立连接吗?
当然不能,服务器发出的消息还未收到确认。
(也就是说,服务器还不知道客户端是否收到了它发送的消息)所以,最后一次,客户端需要向服务器发送ACK及其确认序号ack,以此来告诉服务器,我收到了连接的消息。

TCP三次握手,四次挥手详解!
解释(假设,此时客户端想与服务器断开连接):

1.客户端想要与服务器断开连接,需要将FIN置为1(表示客户端想断开连接了),同时将seq发送过去(需要注意的是,此时的seq并非随机生成,而是通过建立连接后不断累加的)。

2.服务器收到了客户端的消息,将ACK置为1及其序列ack=seq+1发送至客户端(此时客户端就知道了服务器已经收到了我的消息)

3.接着服务器会接着再给客户端发送一个消息,FIN=1,seq=10010(此时的seq非随机生成)。

4.最后客户端再给服务器发送一个确认包,ACK=1,ack=10011,以此来告诉服务器,我已经收到你的消息了。

断开连接完成。

注:第2步和第3步能不能合在一块?

TCP连接是安全的,是建立在连接上的。客户端向服务器发送消息表达它想断开连接,如果这时候23步一起发,明显是不符合TCP连接的定义的。你知道客户端已经断开连接了,不再发送消息给服务器了,但你怎么知道服务器已经不再发送消息给客户端了呢?(或者说,服务器此时还在发送消息给客户端),所以这时,服务器仿佛是在说,等等,等我将东西发完给你,再通知你断开。因此,23步是不能一起发的,需要等待服务器准备完成(也就是向客户端已经发送完毕所有消息),再通知客户端关闭连接。

面试
TCP/IP协议是面向传输层的一个安全可靠的传输协议。三次握手机制是为了保证能建立起一个安全可靠的连接。第一次握手时,客户端会向服务器发送一个报文,报文里SYN位,置1,当服务器收到该报文之后,它就知道了客户端要向我发送一个新的连接,于是,服务器就向客户端发送一个确认包,包中ACK位,置1。以上两次握手后,对于客户端而言,它既能发送消息给服务器,也能接收服务器的消息,但对于服务器而言,两次握手是不够的。服务器只知道客户端发送给它的消息能够收到,但是不知道客户端是否能收到它的消息,所以需要进行第三次握手,发送确认包用以回应服务器(包中ACK=1),告知服务器它能收到来自服务器的消息。至此,不管是客户端还是服务器,都彼此知道了,既能给对方发消息,也能接收对方的消息。

客户端发送一个报文给服务器,其中FIN位,置1。当服务器收到这个报文之后,它就知道了客户端想要跟我断开连接。但是,此时服务器不一定能做好准备。因为当客户端发起断开连接的消息时,对于服务器而言,它极有可能还有未发送完的消息还要继续发送。所以服务器此时只能进行消息确认,(也就是说,告诉客户端,我已经知道你要和我断开连接了,但是我这边还没准备好,你需要等我一下),于是呢,再发送完确认包给客户端之后一段时间,才会发送断开连接的报文给客户端,客户端收到该报文之后,返回服务器一个确认包。这样,通过四次沟通,知道了不管是服务器还是客户端,都做好了断开的准备,于是连接就可以被断开了。

版权声明:本文为CSDN博主「IT学习小镇」的原创文章
原文链接:blog.csdn.net/weixin_44045828/arti...

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!