TCP三次握手和四次挥手

TCP建立连接(三次握手),断开连接(四次挥手)示意图

在这里插入图片描述

1.三次握手

第一次握手:客户端将SYN(希望建立连接)置为1,随机初始化seq(client_isn),将该数据包发送给服务端,客户端进入SYN_SENT状态,等待服务端确认。

第二次握手:服务端收到数据包后将SYN和ACK(确认应答)都设置为1,ack为client_isn+1,随机初始化seq(server_isn),将该数据包发送给客户端确认连接请求,服务端进入SYN_RCVD状态。

第三次握手:客户端收到确认后,将ack置为server_isn+1,ACK为1,将该数据包发送给服务端,连接建立成功(第三次握手可以携带数据)

为什么要三次握手(不用二次或者四次)

1.防止旧的重复连接初始化造成混乱(主要原因)

当客户端连续多次发送SYN报文,客户端能够根据上下文(服务端返回的SYN+ACK)判断是否为历史连接,如果是客户端会发送RST给服务端表示终止这次连接。

2.同步双方初始序列号

TCP通信的双方都要有一个序列号(去除重复数据,按序接受,标识已被接受的数据包),三次握手的一来一回可以确保初始序列号可靠的同步。

3.避免资源浪费

两次握手会造成服务端重复接受无用的SYN报文,重复分配资源。

2.四次挥手

第一次挥手:客户端应用进程发出连接释放报文段,FIN为1,进入FIN_WAIT_1状态,依然可以接受服务端发来的数据。

第二次挥手:服务端收到FIN,发送ACK给客户端,服务端进入CLOS_WAIT状态,客户端收到报文后进入FIN_WAIT_2状态

第三次挥手:服务端没有要发送的数据时,发送一个FIN报文,进入LAST_ACK状态,等待客户端的确认。

第四次挥手:客户端收到FIN报文后,发送给服务器ACK报文,客户端进入TIME_WAIT状态,等待2MSL(报文段最大生存时间),关闭连接。

使用TIME_WAIT的原因

1.防止旧连接的数据包(保证足够时间让客户端接收所有来自服务端的数据报)
2.保证连接正确关闭(保证足够的时间让第四次挥手的ACK被服务端接收)

为什么TIME_WAIT是2MSL

网络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待 2 倍的时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值