TCP三次握手与四次挥手详解(含标志位示例)

TCP三次握手与四次挥手详解(含标志位示例)


🚀 一、TCP三次握手

目的:在客户端与服务器之间建立可靠的双向连接。
标志位SYN(同步)、ACK(确认)。

💡 握手过程

1️⃣ 第一次握手:客户端 → 服务器

  • 客户端向服务器发送连接请求。
  • 报文段中:
    • SYN = 1:表示同步请求。
    • seq = x:初始序列号,x 是随机生成的。
  • 标志位:SYN
  • 📄 示例报文
客户端 → 服务器:SYN=1, seq=x

2️⃣ 第二次握手:服务器 → 客户端

  • 服务器接收连接请求,同意建立连接。
  • 报文段中:
    • SYN = 1:表示同意同步。
    • ACK = 1:确认收到客户端的请求。
    • seq = y:服务器生成自己的初始序列号。
    • ack = x + 1:确认号,表示客户端的下一个期望序号。
  • 标志位:SYN + ACK
  • 📄 示例报文
服务器 → 客户端:SYN=1, ACK=1, seq=y, ack=x+1

3️⃣ 第三次握手:客户端 → 服务器

  • 客户端确认服务器的回应。
  • 报文段中:
    • ACK = 1:确认收到服务器的响应。
    • seq = x + 1:客户端发送的序号。
    • ack = y + 1:确认号,表示服务器的下一个期望序号。
  • 标志位:ACK
  • 📄 示例报文
客户端 → 服务器:ACK=1, seq=x+1, ack=y+1

三次握手完成后,双方建立了可靠的TCP连接,开始传输数据。


🛑 二、TCP四次挥手

目的:断开TCP连接,保证数据传输完整。
标志位FIN(结束)、ACK(确认)。

💡 挥手过程

1️⃣ 第一次挥手:客户端 → 服务器

  • 客户端发起关闭请求。
  • 报文段中:
    • FIN = 1:表示请求终止连接。
    • seq = u:客户端当前序号。
  • 标志位:FIN
  • 📄 示例报文
客户端 → 服务器:FIN=1, seq=u

2️⃣ 第二次挥手:服务器 → 客户端

  • 服务器确认客户端的关闭请求。
  • 报文段中:
    • ACK = 1:确认收到客户端的关闭请求。
    • seq = v:服务器当前序号。
    • ack = u + 1:确认号,表示服务器已接收客户端的 FIN。
  • 标志位:ACK
  • 📄 示例报文
服务器 → 客户端:ACK=1, seq=v, ack=u+1

服务器此时处于CLOSE_WAIT状态,继续处理剩余数据。

3️⃣ 第三次挥手:服务器 → 客户端

  • 服务器处理完数据后,向客户端发起关闭请求。
  • 报文段中:
    • FIN = 1:请求终止连接。
    • seq = w:服务器当前序号。
  • 标志位:FIN
  • 📄 示例报文
服务器 → 客户端:FIN=1, seq=w

4️⃣ 第四次挥手:客户端 → 服务器

  • 客户端确认服务器的关闭请求。
  • 报文段中:
    • ACK = 1:确认服务器的 FIN。
    • seq = u + 1:客户端当前序号。
    • ack = w + 1:确认号,表示客户端已接收服务器的 FIN。
  • 标志位:ACK
  • 📄 示例报文
客户端 → 服务器:ACK=1, seq=u+1, ack=w+1

四次挥手完成后,TCP连接正式断开。


🔥 三次握手 & 四次挥手过程图解

  三次握手:
  
    客户端                          服务器
      |------- SYN(seq=x) --------->|
      |<------ SYN+ACK(seq=y, ack=x+1) ----|
      |------- ACK(ack=y+1) ------->|
      |        建立连接成功         |

  四次挥手:
  
    客户端                          服务器
      |------- FIN(seq=u) --------->|
      |<------ ACK(ack=u+1) --------|
      |<------ FIN(seq=w) ----------|
      |------- ACK(ack=w+1) ------->|
      |        连接关闭完成         |

示例代码

下面是使用 Go 实现的 TCP 客户端与服务器,展示握手与挥手过程:

服务器:

package main

import (
	"fmt"
	"net"
)

func main() {
	listener, _ := net.Listen("tcp", ":8080")
	defer listener.Close()

	fmt.Println("服务器启动,等待连接...")

	conn, _ := listener.Accept()
	fmt.Println("客户端连接成功")

	buffer := make([]byte, 1024)
	n, _ := conn.Read(buffer)
	fmt.Println("接收数据:", string(buffer[:n]))

	conn.Write([]byte("欢迎连接!"))

	conn.Close()
}

客户端:

package main

import (
	"fmt"
	"net"
)

func main() {
	conn, _ := net.Dial("tcp", "localhost:8080")
	defer conn.Close()

	fmt.Println("已连接到服务器")

	conn.Write([]byte("Hello, Server!"))

	buffer := make([]byte, 1024)
	n, _ := conn.Read(buffer)
	fmt.Println("服务器回复:", string(buffer[:n]))
}

🚀 总结

  • 三次握手
    • 确保双方都能接收和发送数据,建立可靠连接。
  • 四次挥手
    • 确保双方的数据传输完成后,安全释放连接。

✅ 三次握手和四次挥手是 TCP 保证数据传输可靠性的重要机制!🔥

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值