网络基础之TCP的三次握手,四次挥手

TCP 三次握手与四次挥手常见面试题

一、三次握手(建立连接)

过程解析:

  1. 第一次握手(客户端→服务器)

    • 客户端发送带有SYN=1和随机序列号Seq=x的报文段,请求建立连接,进入SYN_SENT状态。
  2. 第二次握手(服务器→客户端)

    • 服务器收到请求后,发送SYN=1ACK=1、确认号Ack=x+1和自身随机序列号Seq=y的报文段,进入SYN_RCVD状态。
  3. 第三次握手(客户端→服务器)

    • 客户端确认收到服务器的响应,发送ACK=1、确认号Ack=y+1、序列号Seq=x+1的报文段,进入ESTABLISHED状态;服务器收到后也进入ESTABLISHED状态,连接建立完成。
常见面试题 1:为什么需要三次握手?
  • 原因 1:防止历史连接初始化
    若两次握手,客户端旧的 SYN 报文段可能被服务器接收,导致建立无效连接(如网络延迟导致旧报文段后到达)。三次握手时,服务器的 SYN+ACK 会被客户端识别为旧连接而拒绝。

  • 原因 2:确保双向通信可达
    三次握手可验证客户端和服务器的发送 / 接收能力:

    • 第一次:客户端能发,服务器能收;
    • 第二次:服务器能发,客户端能收;
    • 第三次:客户端能发(确认服务器的 ACK),服务器能收(确认客户端的 ACK)。
二、四次挥手(断开连接)

过程解析:

  1. 第一次挥手(主动关闭方→被动关闭方)

    • 客户端(或服务器)发送FIN=1、序列号Seq=u的报文段,请求关闭连接,进入FIN_WAIT_1状态。
  2. 第二次挥手(被动关闭方→主动关闭方)

    • 被动关闭方发送ACK=1、确认号Ack=u+1、序列号Seq=v的报文段,确认关闭请求,进入CLOSE_WAIT状态;主动关闭方收到后进入FIN_WAIT_2状态。
  3. 第三次挥手(被动关闭方→主动关闭方)

    • 被动关闭方处理完剩余数据后,发送FIN=1ACK=1、确认号Ack=u+1、序列号Seq=w的报文段,请求关闭连接,进入LAST_ACK状态。
  4. 第四次挥手(主动关闭方→被动关闭方)

    • 主动关闭方发送ACK=1、确认号Ack=w+1、序列号Seq=u+1的报文段,进入TIME_WAIT状态;被动关闭方收到后进入CLOSED状态,主动关闭方等待2MSL后也进入CLOSED状态。
常见面试题 2:为什么挥手需要四次?
  • 原因:TCP 的半关闭特性
    服务器收到客户端的 FIN 时,可能仍有数据未发送完,因此先回复 ACK 确认关闭请求(第二次挥手),待数据发送完毕后再发送 FIN(第三次挥手)。而三次握手时,服务器可在 SYN+ACK 中同时确认和请求连接,因此只需三次。
常见面试题 3:TIME_WAIT 状态的作用是什么?
  1. 确保最后一次 ACK 到达服务器
    若 ACK 丢失,服务器会重发 FIN,TIME_WAIT 状态的客户端可重新发送 ACK,避免连接异常关闭。

  2. 避免旧报文段干扰新连接
    旧连接的报文段可能在网络中滞留,等待2MSL(最大报文段生存时间的 2 倍)后,旧报文段会自然失效,防止新连接接收旧数据。

常见面试题 4:SYN Flood 攻击是什么?如何防御?
  • 攻击原理:
    攻击者发送大量 SYN 报文段,占用服务器的半连接队列(SYN_RCVD 状态),导致正常连接请求被拒绝。

  • 防御措施:

    • SYN Cookie: 服务器不存储半连接状态,而是根据客户端 IP、端口等信息生成 Cookie,收到 ACK 时验证 Cookie 合法性。
    • 缩短半连接超时时间: 清理无效的 SYN_RCVD 状态,释放资源。
    • TCP Syncookies: 内核参数net.ipv4.tcp_syncookies=1开启,动态分配资源。
常见面试题 5:三次握手和四次挥手中的状态转换?
  • 三次握手状态:
    客户端:CLOSED → SYN_SENT → ESTABLISHED
    服务器:CLOSED → LISTEN → SYN_RCVD → ESTABLISHED

  • 四次挥手状态:
    主动关闭方:ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED
    被动关闭方:ESTABLISHED → CLOSE_WAIT → LAST_ACK → CLOSED

三、核心总结对比
阶段目的关键报文段为什么是 N 次?
三次握手建立可靠连接SYN→SYN+ACK→ACK确保双向通信,防止历史连接
四次挥手安全释放连接FIN→ACK→FIN→ACK支持半关闭,允许剩余数据传输
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值