python面试题tcp三次握手四次挥手

三次握手:

在这里插入图片描述

第一次握手: Client端发送位码为SYN=1,随机产生seq number=J的数据包到服务器,Server端收到数据包后,由SYN=1判断出 Client端要求连接;此时Client端处于SYN_SENT的状态。

第二次握手: Server端收到请求后要向Client端发送确认连接的信息,于是,Server端向Client端发送一个ACK=1,SYN=1,ack number=J+1(即Client端的seq number +1),随机生成的seq number=K,此时服务端处于SYN_RCVD;

第三次握手:
Client端收到后检查两点 :
1、ack number 是否正确(是否等于J+1);
2、位码ACK是否等于1。
若以上两点都正确,Client端会再次发送ack num=K+1(第二次机握手中 Server端发送的seq number + 1),位码ACK=1,
Server端收到后确认ack number值是否正确,ACK是否为1 ,若均正确则连接建立成功。
此时双方处于ESTABLISHED的状态。

四次挥手:

在这里插入图片描述

第一次挥手: Client端发送位码为FIN=1,随机产生seq number=J的数据包到服务器,Server端收到数据包后,由FIN=1判断出 Client端要求断开连接;此时Client端处于FIN-WAIT-1的状态。

第二次挥手: Server端收到请求后要向Client端发送确认断开连接的信息,于是,Server端向Client端发送一个ACK=1,ack number=J+1(即Client端的seq number +1),此时服务端处于CLOSE_WAIT的状态,Client端收到这个信号后,由FIN-WAIT-1变成FIN-WAIT-2的状态,此时Client端可以接受Server端的数据但是不能向Server端传输数据。

第三次挥手: Server端主动向Client端发送一个位码为FIN=1,随机产生seq number=K 的数据包到服务器,Client端收到数据包后,由FIN=1判断出Server端要断开连接,此时Server端处于LAST-ACK的状态。

第四次挥手: Client端接受到Server端的请求后,要向Server端发送确认端口连接的信息,于是,Client端向Server端发送了一个ACK=1,ack num=K+1(即Server端的seq number +1),发送后Client端处于TIME-WAIT的状态,等待2MSL后变成CLOSED,而Server端收到Client端的最后一个ACK后便会变成CLOSED

这个有点难理解 下面我给大家说一种通俗易懂的方法:

在这里插入图片描述

三次握手就是客户端和服务器进行通信的时候有三次交流。

例如如下:

客户端问服务端你准备好了吗(第一次),

服务端告诉客户端装备好了,并且问客户端你准备好了吗(第二次),

客户端说我准备好了(第三次)。

第一次握手:是客户端让服务器准备好资源。
第二次握手:服务端资源准备好了并且服务端问客户端资源有没有准备好。
第三次握手:客户端资源也准备好了。接下来才真正的发生数据。

真正进行3次握手的时候发送的是值。

第一次客户端装备了一个值例如是11,发送给了服务端,服务端如果准备好了就将11+1变成
12再发送给客户端,表示服务端准备好了资源。
服务怎么知道客户端准备好了资源呢?服务器给客户端发送一次数据例如33,客户端如果准
备好了就再将数据加1 33+1 =34 发送给服务端,服务端接受到后就表明客户端准备好了。
这样4次才知道双方准备好了资源。这里发生了4次,不是3次,
当用户打开一个网站的时候我们想尽快的看到内容,因此能减少的终将12和44 的数据变成了一次请求。发生12表示给客户端回答的值,44表示
我向客户端发送的值。提高传输的效率。节约时间。

四次挥手
客户端给服务器说再见,

服务器给客户端说拜拜,

服务端告诉客户端我也不和你玩了,

客户端说不玩就不玩。

第一次,客户端告诉服务端我不会给你发数据了,
第二次服务端告诉客户端我收到你发生的信息了,
第三次服务端给客户端发生数据说我也不给你发了,
第四次客户端给服务端说我知道了。

建立一个连接需要三次握手,而终止一个连接要经过四次挥手。

发布了36 篇原创文章 · 获赞 49 · 访问量 2879

猜你喜欢

转载自blog.csdn.net/HENG302926/article/details/103810011
今日推荐