TCP三次握手和四次挥手

1 TCP三次握手

在进行连接的时候使用三次握手

1.1 为什么要三次握手

  • 1、 防止已经过期的连接请求报文突然又传送到服务器,因而产生错误和资源浪费。
  • 2、 三次握手能让双方均确认自己和对方的发送和接收能力都正常。
  • 3、 告知对方自己的初始序号值,并确认收到对方的初始序号值。

1.2 三次握手每一握作用

  • 第一次握手: 服务端确认 “服务端收、客户端发” 报文功能正常。
  • 第二次握手: 客户端确认 “客户端发、客户端收、服务端收、服务端发” 报文功能正常,客户端认为连接已建立。
  • 第三次握手: 服务端确认 “服务端发、客户端收” 报文功能正常,此时双方均建立连接,可以正常通信。

1.3 三次握手机制

  • 第一次握手: 客户端请求建立连接,向服务端发送一个同步报文,同时选择一个随机数seq = x作为初始序列号,并进入SYN_SENT(发送)状态,等待服务器确认。
  • 第二次握手: 服务端收到收到请求报文后,如果同意建立连接,则向客户端发送同步确认报文,确认号为ack=x+1,同时选择一个随机数seq = y作为初始序列号,此时服务器进入SYN_RECV(接收)状态。
  • 第三次握手: 客户端收到服务端确认后,向服务端发送一个确认报文(ack = 1),确认号为seq = x + 1,客户端和服务器进入ESTABLISHED(已建立)状态,完成三次握手。
  • 备注:理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都将被一直保持下去。

2 TCP四次挥手

在进行关闭的时候使用四次挥手

2.1 四次挥手过程

  • 第一次挥手: 客户端向服务端发送释放报文(FIN = 1, ACK = 1),主动关闭连接,同时等待服务端确认。(序列号seq = u,即客户端上次发送的报文最后一个字节的序号+1;确认号ack = k,即服务端上次发送的报文的最后一个字节的序号+1)。
  • 第二次挥手: 服务端收到连接释放报文后,立即发出确认报文(ACK = 1),序列号为seq = k,确认号为ack = u + 1;
  • 第三次挥手: 服务端向客户端发送连接释放报文(FIN = 1, ACK = 1),主动连接关闭,同时等待客户端的确认。
  • 第四次挥手: 客户端收到服务端的连接释放报文后,立刻发出确认报文(ACK = 1),序列号seq = u+1, 确认号为ack = w + 1。
    备注:此时客户端进入了TIME-WAIT状态。注意此时客户端到TCP连接还没有释放,必须经过2*MSL(最长报文段寿命)的时间后,才进入CLOSED状态。而服务端只要收到客户端发出的确认,就立即进入CLOSED状态。可以看到,服务端结束TCP连接的时间要比客户端早一些。

2.2 为什么需要四次挥手

  • 服务器在收到客户端的FIN报文段后,可能还有一些数据要传输,所以不能马上关闭连接,但是会做出应答,返回ack报文字段。
  • 接下来可能会继续发送数据,在数据发送完后,服务器会向客户端发送FIN报文,表示已经发送完毕,请求关闭连接。服务器的ACK和FIN一般都会分开发送,从而导致多了一次,因此一共需要四次挥手。

2.3 为什么客户端的TIME-WAIT状态必须等待2MSL

  • 1、确保ack报文能够到达服务端,从而使服务端正常关闭连接。
  • 2、防止一是想的连接请求报文出现在之后的连接中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值