关于TCP三次握手和四次挥手的理解

1.三次握手:

服务器一定处于Listen状态,否则客户端发过来的连接会被拒绝。注:服务器和客户端的角色是相对的。

  • 第一次握手:客户端发送第一次握手(客户端发送连接请求(SYN包)到服务器)之后客户端由Closed状态转为Syn-Send状态;

  • 第二次握手:服务器收到第一次握手的客户端SYN包,然后发送第二次握手(服务器发送SYN+ACK(客户端SYN包的确认包给客户端)之后服务器由Listen状态转为Sync-Recv状态;

  • 第三次握手:客户端收到第二次握手的服务器SYN+ACK包,然后发送第三次握手(客户端对“服务器的SYNC+ACK包“的ACK包给给服务器)之后客户端就转为ESTABLISHED状态,服务器收到第三次握手的客户端ACK包之后也进入了ESTABLISHED。
      在这里插入图片描述
    握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都将被一直保持下去。

2.四次挥手:

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
  主动关闭的一方(可能是服务器也可能是客户端)的状态迁移:FIN-WAIT1->FIN-WAIT2->TIME_WAIT-CLOSED
  被动关闭的一方的状态迁移:CLOSE_WAIT->LAST_ACK->CLOSED
  
  假设客户端主动关闭连接,以下说明客户端和服务器如何迁移:

  • 第一次挥手:客户端发送第一个FIN包给服务器,之后客户端由ESTABLISHED状态转为FIN_WAIT1状态;

  • 第二次挥手:服务器收到客户端的FIN包之后,发送ACK确认包给客户端,服务器进入CLOSE_WAIT状态,等待服务器自身的socket关闭等处理(等待IO,业务处理,资源回收等等);
    客户端收到服务器的ACK包后,进入FIN_WAIT2状态,等待服务器关闭(服务器调用close函数发送服务器的FIN包);

  • 第三次挥手:服务器发送一个FIN,用来关闭服务器到客户端的数据传送,也就是告诉客户端,我的数据也发送完了,不会再给你发数据了。服务器进入LAST_ACK状态;

  • 第四次挥手:客户端收到FIN后,发送一个ACK给服务器,确认序号为收到序号+1,至此,完成四次挥手。服务器收到ACK包后,进入CLOSED状态;
      客户端等待2MSL时间,进入CLOSED状态
      在这里插入图片描述

3. 三次握手四次挥手合并图

在这里插入图片描述

思考:

为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

答:
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能未必会马上会关闭SOCKET,即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值