“三次握手,四次挥手”

我们都知道TCP是面向对象连接的,三次握手是为了建立连接,而四次挥手是为了断开连接

三次握手

 三次握手的过程:

刚开始的时候,客户端和服务器都处于CLOSED状态,当要开始建立连接时,客户端主动打开连接,服务端被动打开连接,结束CLOSED状态,开始监听,进入LISTEN状态。

一次握手

客户端会随机初始化序号(client_isn),将此序号至于TCP首位的【序号】字段中,同时把SYN标志位置为1,表示SYN报文,接着将SYN报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于SYN—SENT状态。

二次握手

收到客户端的报文后,服务端首先也会初始化自己的序号(server_isn),将此序号填入自己的TCP首部的[序号]字段中,其次将TCP首部的[确认应答号]填入clicent_isn+1,接着把SYN和ACK标志位置设为1,最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于SYN-RCVD状态。

三次握手

客户端收到服务端报文后,还要回应一个应答报文,该应答报文的TCP首部ACK标志位为1,其次【确认应答字段】填入server_isn+1,最后把报文发送给服务端,这次报文可以携带客户到服务端的数据,之后客户端一直处于ESTABLISHED状态。

这里有个小细节,第三次握手是可以携带数据的。

为什么要三次握手呢?两次不行吗

  • 为了防止服务器端开启一些无用的连接增加服务器开销
  • 防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

由于网络传输是有延时的(要通过网络光纤和各种中间代理服务器),在传输的过程中,比如客户端发起了 SYN=1 的第一次握手。如果服务器端就直接创建了这个连接并返回包含 SYN、ACK 和 Seq 等内容的数据包给客户端,这个数据包因为网络传输的原因丢失了,丢失之后客户端就一直没有接收到服务器返回的数据包。

如果没有第三次握手告诉服务器端客户端收的到服务器端传输的数据的话,服务器端是不知道客户端有没有接收到服务器端返回的信息的。服务端就认为这个连接是可用的,端口就一直开着,等到客户端因超时重新发出请求时,服务器就会重新开启一个端口连接。这样一来,就会有很多无效的连接端口白白地开着,导致资源的浪费。

所以我们需要“第三次握手”来确认这个过程:

通过第三次握手的数据告诉服务端,客户端有没有收到服务器“第二次握手”时传过去的数据,以及这个连接的序号是不是有效的。若发送的这个数据是“收到且没有问题”的信息,接收后服务器就正常建立 TCP 连接,否则建立 TCP 连接失败,服务器关闭连接端口。由此减少服务器开销和接收到失效请求发生的错误。

四次挥手

TCP断开连接是通过四次挥手的方式进行的。

一次挥手

客户端准备关闭连接,此时会给服务端发送一个TCP首部FIN标志位被置为1的报文,之后客户端进入FIN_WAIT_1状态

二次挥手

当服务端收到FIN报文之后,就向客户端发送ACK应答报文,接着服务端进入FIN_WAIT_1状态。

三次挥手

客户端收到服务端的ACK应答报文之后,进入FIN_WAIT_2状态,等待数据处理完之后,也向客户端发送一个FIN报文,之后服务器进入LAST_ACK状态。

四次挥手

客户端收到FIN报文之后,hi应一个ACK报文,进入TIME_WAIT状态

服务器收到这个ACK应答报文之后,进入CLOSED状态,服务端连接关闭

客户端等待2MSL之后,自动进入CLOSED状态,客户端连接关闭。

每个方向都需要一个FIN和一个ACK所以就是四次挥手

为什么要挥手四次呢?

  • 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
  • 服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。

从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN 一般都会分开发送,从而比三次握手导致多了一次。

为什么TIMEWAIT阶段要等待2MSL呢?

为的是确认服务器端是否收到客户端发出的 ACK 确认报文,当客户端发出最后的 ACK 确认报文时,并不能确定服务器端能够收到该段报文。所以客户端在发送完 ACK 确认报文之后,会设置一个时长为 2MSL 的计时器。

MSL 指的是 Maximum Segment Lifetime:一段 TCP 报文在传输过程中的最大生命周期。

2MSL 即是服务器端发出为 FIN 报文和客户端发出的 ACK 确认报文所能保持有效的最大时长。

服务器端在 1MSL 内没有收到客户端发出的 ACK 确认报文,就会再次向客户端发出 FIN 报文:

  • 如果客户端在 2MSL 内,再次收到了来自服务器端的 FIN 报文,说明服务器端由于各种原因没有接收到客户端发出的 ACK 确认报文。

客户端再次向服务器端发出 ACK 确认报文,计时器重置,重新开始 2MSL 的计时。

  • 否则客户端在 2MSL 内没有再次收到来自服务器端的 FIN 报文,说明服务器端正常接收了 ACK 确认报文,客户端可以进入 CLOSED 阶段,完成“四次挥手”。

所以,客户端要经历时长为 2SML 的 TIME-WAIT 阶段;这也是为什么客户端比服务器端晚进入 CLOSED 阶段的原因。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值