searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

tcp连接建立断开过程详解

2023-05-04 02:16:45
122
0
三次握手和四次挥手是tcp协议的可靠性保证

tcp的三次握手

所谓的三次握手,指建立一个tcp连接,需要client端和server端总共发送三个报文,通过这三个报文的接发确认双方的连通
第一次握手:
client端将tcp 包header部分控制位中的SYN置1,随机产生序列号seq,保存到tcp序列号字段中,并将数据包发送到server端;数据包发送完成后,发起方进入syn_send状态
第二次握手:
server端在收到client端的数据包后,将tcp报文中的标记位SYN和ACK【表示收到长度为1的数据包】置为1,ack=seq+1,随机产生一个序号seq,将数据包发送给client端以确认连接请求,server端状态进入syn_rcvd状态
第三次握手:
client端收到数据包后,进行ack校验,之后将tcp报文的标志位ACK置为1,ack=seq+1,将数据包发送到server端。server端进行检查后,如果正确则建立连接 client端和server端都进入established状态,之后双方就可以进行正常的数据传输了

三次握手流程图:

数据包状态:

第一次握手数据包详情:
第二次握手数据包详情:
第三次握手数据包详情:

为什么需要三次握手?

确认调用双方通信能力是否均正常,避免资源浪费
    1. client端请求server端进行连接时 【server端可以确定server端的收信能力和client端的发信能力均正常】
    2. server端给client端返回确认响应时【client端可以确认双方收发信能力均正常】
    3. client端给server端进行响应后 【server端可以确认双方的收发信能力均正常】;如果不进行第三次握手,server端在不确定client端是否正常接收到数据包就开启端口,试图等待client端的连接就存在server端的资源浪费
 
 

tcp的四次挥手

当连接中一方数据包传输完毕后,就开始进行连接的关闭操作 【以下假定client端为连接关闭发起方】
  1. client端向server端发送 FIN包,client端进入FIN_WAIT_1 状态
  2. server端在接收到报文后,向client端发送header标志位ACK为1的包,server端进入CLOSE_WAIT状态
  3. client端收到server端的ACK报文后,进入FIN_WAIT_2状态。 server端完成数据传输后,server端同样发送一个FIN 来关闭server端到client的数据连接,server端进入LAST_ACK状态
  4. client接收到server端的FIN报文后,向server端发送ACK报文;client端进入TIME_WAIT状态。server端收到client端的应答后,server关闭连接,client端等待 2MSL的时间也关闭连接

四次挥手流程图:

 

数据包状态:

 

为什么需要四次挥手?

当client端需要关闭连接时,发送FIN包,server端进行ACK确认后,表明client侧连接已经完成关闭。但server端可能还有数据包需要传输,因此要等server端发送FIN包,发起关闭操作并且client端侧确认后,双端连接才能均关闭。
0条评论
0 / 1000
l****n
1文章数
0粉丝数
l****n
1 文章 | 0 粉丝
l****n
1文章数
0粉丝数
l****n
1 文章 | 0 粉丝
原创

tcp连接建立断开过程详解

2023-05-04 02:16:45
122
0
三次握手和四次挥手是tcp协议的可靠性保证

tcp的三次握手

所谓的三次握手,指建立一个tcp连接,需要client端和server端总共发送三个报文,通过这三个报文的接发确认双方的连通
第一次握手:
client端将tcp 包header部分控制位中的SYN置1,随机产生序列号seq,保存到tcp序列号字段中,并将数据包发送到server端;数据包发送完成后,发起方进入syn_send状态
第二次握手:
server端在收到client端的数据包后,将tcp报文中的标记位SYN和ACK【表示收到长度为1的数据包】置为1,ack=seq+1,随机产生一个序号seq,将数据包发送给client端以确认连接请求,server端状态进入syn_rcvd状态
第三次握手:
client端收到数据包后,进行ack校验,之后将tcp报文的标志位ACK置为1,ack=seq+1,将数据包发送到server端。server端进行检查后,如果正确则建立连接 client端和server端都进入established状态,之后双方就可以进行正常的数据传输了

三次握手流程图:

数据包状态:

第一次握手数据包详情:
第二次握手数据包详情:
第三次握手数据包详情:

为什么需要三次握手?

确认调用双方通信能力是否均正常,避免资源浪费
    1. client端请求server端进行连接时 【server端可以确定server端的收信能力和client端的发信能力均正常】
    2. server端给client端返回确认响应时【client端可以确认双方收发信能力均正常】
    3. client端给server端进行响应后 【server端可以确认双方的收发信能力均正常】;如果不进行第三次握手,server端在不确定client端是否正常接收到数据包就开启端口,试图等待client端的连接就存在server端的资源浪费
 
 

tcp的四次挥手

当连接中一方数据包传输完毕后,就开始进行连接的关闭操作 【以下假定client端为连接关闭发起方】
  1. client端向server端发送 FIN包,client端进入FIN_WAIT_1 状态
  2. server端在接收到报文后,向client端发送header标志位ACK为1的包,server端进入CLOSE_WAIT状态
  3. client端收到server端的ACK报文后,进入FIN_WAIT_2状态。 server端完成数据传输后,server端同样发送一个FIN 来关闭server端到client的数据连接,server端进入LAST_ACK状态
  4. client接收到server端的FIN报文后,向server端发送ACK报文;client端进入TIME_WAIT状态。server端收到client端的应答后,server关闭连接,client端等待 2MSL的时间也关闭连接

四次挥手流程图:

 

数据包状态:

 

为什么需要四次挥手?

当client端需要关闭连接时,发送FIN包,server端进行ACK确认后,表明client侧连接已经完成关闭。但server端可能还有数据包需要传输,因此要等server端发送FIN包,发起关闭操作并且client端侧确认后,双端连接才能均关闭。
文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0