Java开发-面试题-0029- TCP 连接和断开连接,为什么使用三次握手,四次挥手?

Java开发-面试题-0029- TCP 连接和断开连接,为什么使用三次握手,四次挥手?

更多内容欢迎关注我(持续更新中,欢迎Star✨)

Github:CodeZeng1998/Java-Developer-Work-Note

(技术)微信公众号:CodeZeng1998

(生活)微信公众号:好锅

其他平台:CodeZeng1998好锅

TCP 的三次握手和四次挥手是建立和断开连接的核心机制,确保数据传输的可靠性。以下是详细说明:

一、TCP 三次握手

三次握手(Three-Way Handshake)是 TCP 建立连接的过程,涉及客户端和服务器端之间的三个步骤。通过这个过程,双方可以确认对方的接收和发送能力是否正常,连接是否可靠。

步骤说明:
  1. 第一次握手(SYN)
    • 客户端向服务器发送一个带有 SYN 标志的数据包,表示请求建立连接,并指定一个初始序列号 seq=x
    • 这个 SYN 包发送后,客户端进入==SYN_SENT 状态==,等待服务器响应。
  2. 第二次握手(SYN+ACK)
    • 服务器收到客户端的 SYN 包后,发送一个带有 SYN 和 ACK 标志的数据包,表示同意连接请求。服务器的这个数据包会包含自己的初始序列号 seq=y 和对客户端 SYN 包的确认号 ack=x+1
    • 服务器进入 SYN_RECEIVED 状态
  3. 第三次握手(ACK)
    • 客户端收到服务器的 SYN+ACK 包后,发送一个带有 ACK 标志的数据包,确认服务器的序列号 ack=y+1,并且自己的序列号 seq=x+1
    • 发送完这个包后,客户端进入 ESTABLISHED 状态==,表示连接已建立。
    • 服务器收到这个 ACK 包后,也进入 ESTABLISHED 状态

此时,客户端与服务器之间的 TCP 连接已经建立,可以开始传输数据。

过程示意图:
		客户端               		 服务器
  | --- SYN, seq=x -->               |
  | <-- SYN, ACK, seq=y, ack=x+1 --- |
  | --- ACK, ack=y+1 -->             |

二、TCP 四次挥手

四次挥手(Four-Way Handshake)是 TCP 断开连接的过程,保证数据的完全传输和连接的优雅关闭。它由四个步骤组成。

步骤说明:
  1. 第一次挥手(FIN)
    • 客户端发送一个带有 FIN 标志的数据包,表示要终止数据传输,并进入 FIN_WAIT_1 状态
    • 这个数据包表示客户端已经没有数据要发送,但仍可以接收数据。
  2. 第二次挥手(ACK)
    • 服务器收到 FIN 包后,发送一个带有 ACK 标志的数据包,确认收到客户端的 FIN,并进入 CLOSE_WAIT 状态
    • 客户端接收到 ACK 后,进入 FIN_WAIT_2 状态,等待服务器发送 FIN 包。
  3. 第三次挥手(FIN)
    • 服务器发送一个带有 FIN 标志的数据包,表示自己也要终止连接,进入 LAST_ACK 状态
    • 客户端收到这个 FIN 包后,进入 TIME_WAIT 状态,准备发送最终的确认。
  4. 第四次挥手(ACK)
    • 客户端发送最后一个带有 ACK 标志的数据包,确认服务器的 FIN 包,之后进入 CLOSED 状态,完成连接的关闭。
    • 服务器收到 ACK 后,也进入 CLOSED 状态,完成连接的关闭。
过程示意图:
		客户端                  服务器
  | --- FIN, seq=u --> 			|
  | <-- ACK, ack=u+1 --- 		|
  | <-- FIN, seq=v ---			|
  | --- ACK, ack=v+1 --> 		|
注意事项:
  • 客户端在 TIME_WAIT 状态会等待 2MSL(Maximum Segment Lifetime,最大报文生存时间)时间,确保服务器收到 ACK,并避免旧数据包的干扰。
  • CLOSE_WAIT 状态的服务器需要完成所有剩余数据的发送,再发出 FIN 包。

总结

  • 三次握手 确保双方能建立可靠的连接,保证数据传输前的准备工作完成。
  • 四次挥手 确保数据完全传输完毕,并优雅地关闭连接。

通过三次握手和四次挥手,TCP 实现了连接的可靠性和数据的完整性,是 TCP 协议可靠传输的基础。


为什么连接使用三次握手?

  • 三次握手的目的是为了确保双方都能够发送和接收数据,并且同步彼此的初始序列号,确保连接的可靠性。

  • 三次握手确保了双方都有能力发送和接收数据,并且同步了初始序列号,避免了连接失败或数据乱序的问题。


为什么断开连接使用四次挥手?

  • 四次挥手的目的是为了确保双方都能在断开连接前处理完所有数据,避免数据丢失或连接被过早关闭。

  • 四次挥手确保了双方都能优雅地完成所有数据的处理和传输,避免了数据丢失或连接异常关闭的风险。由于服务器可能需要完成剩余数据的发送,因此比建立连接多了一次握手

三次握手 是为了确保连接建立的可靠性,防止已经失效的连接请求导致错误的连接。

四次挥手 是为了确保数据传输的完整性和连接关闭的优雅性,避免数据丢失和潜在的错误。


以上就是本文相关的所有内容了,如果发现有误欢迎评论指正,更多内容欢迎各位关注。

在这里插入图片描述

上图是由 Pic 生成的

关键词:joker


在这里插入图片描述

更多内容欢迎关注我(持续更新中,欢迎Star✨)

Github:CodeZeng1998/Java-Developer-Work-Note

(技术)微信公众号:CodeZeng1998

(生活)微信公众号:好锅

其他平台:CodeZeng1998好锅

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值