TCP 三次握手

引言:网络通信的基石

TCP 三次握手是建立可靠网络连接的基础过程。本文将聚焦核心内容,清晰解析握手过程中的状态转换、关键函数调用,并通过图表直观展示这一机制。

一、三次握手核心流程

Client Server SYN=1, Seq=X (SYN_SENT) SYN=1, ACK=1, Seq=Y, Ack=X+1 (SYN_RCVD) ACK=1, Seq=X+1, Ack=Y+1 (ESTABLISHED) Client Server

步骤解析:

  1. SYN:客户端发送同步请求(序列号=X)
  2. SYN-ACK:服务器确认并发送同步(序列号=Y,确认号=X+1)
  3. ACK:客户端确认(序列号=X+1,确认号=Y+1)

二、状态转换图解

Client 调用connect()
发送SYN 收到SYN+ACK
发送ACK Client_CLOSED Client_SYN_SENT Client_ESTABLISHED Server 调用listen() 收到SYN
发送SYN+ACK 收到ACK Server_CLOSED Server_LISTEN Server_SYN_RCVD Server_ESTABLISHED

关键状态:

  • LISTEN:服务端准备接收连接
  • SYN_SENT:客户端已发送SYN
  • SYN_RCVD:服务端收到SYN并回复
  • ESTABLISHED:连接建立完成

三、客户端与服务端关键函数

客户端流程:

c 复制代码
int sock = socket(AF_INET, SOCK_STREAM, 0); // 创建套接字

struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);

connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); // 触发三次握手

服务端流程:

c 复制代码
int server_fd = socket(AF_INET, SOCK_STREAM, 0); // 创建套接字

struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);

bind(server_fd, (struct sockaddr*)&address, sizeof(address)); // 绑定端口
listen(server_fd, 5); // 进入LISTEN状态

int new_socket = accept(server_fd, NULL, NULL); // 接受已建立的连接

函数作用:

函数 作用 触发状态变化
listen() 服务端准备接收连接 CLOSED → LISTEN
connect() 客户端发起连接 CLOSED → SYN_SENT
accept() 服务端接受已建立的连接 无状态变化

四、常见问题解答

1. 为什么需要三次握手?

防止失效的连接请求突然到达服务端:

  • 两次握手:服务端收到过期SYN会直接建立连接
  • 三次握手:客户端需要确认才能建立连接

2. SYN洪水攻击是什么?

攻击者发送大量SYN但不完成握手,耗尽服务端资源

防御方案

bash 复制代码
# 启用SYN Cookies
sysctl -w net.ipv4.tcp_syncookies=1

五、抓包分析要点

使用Wireshark观察:

  1. SYN包:Flags=0x002 (SYN)
  2. SYN-ACK包:Flags=0x012 (SYN, ACK)
  3. ACK包:Flags=0x010 (ACK)

关键字段:

  • 序列号:随机初始值
  • 确认号:期望接收的下一个序列号
  • 窗口大小:接收缓冲区容量

总结

三次握手核心要点:

  1. 状态转换:SYN_SENT → SYN_RCVD → ESTABLISHED
  2. 关键函数
    • 客户端:connect() 触发握手
    • 服务端:listen() 准备连接,accept() 获取连接
  3. 设计目的:可靠地同步序列号,防止无效连接

理解这些核心概念,就能掌握TCP连接的建立机制,为网络编程和故障排查打下坚实基础。

相关推荐
FungLeo5 分钟前
一步一步配置 Ubuntu Server 的 NodeJS 服务器详细实录——3. 服务器软件更新,以及常用软件安装
服务器·数据库·ubuntu
时之彼岸Φ8 分钟前
网络攻防技术四:网络侦察技术
开发语言·网络
xiaohanbao0927 分钟前
day44 python 训练CNN网络并使用Grad-CAM可视化
网络·人工智能·python·深度学习·学习·机器学习·cnn
巴拉特好队友1 小时前
捋捋wireshark
网络·测试工具·wireshark
iummature1 小时前
wireshark分析国标rtp ps流
网络·测试工具·wireshark
这儿有一堆花1 小时前
Wireshark 使用教程:让抓包不再神秘
网络·测试工具·wireshark
藥瓿亭1 小时前
IPtables部署和使用
linux·运维·服务器·网络·iptables·防火墙·firewall
zhaoolee2 小时前
一次借助ChatGPT抵御恶意攻击的经历,为个人服务器添加自动防御系统Fail2ban
运维·服务器·chatgpt
搬码临时工2 小时前
内网怎么映射外网ip? 内网的地址快速映射给外网访问用方法
运维·服务器·网络·物联网·网络协议·tcp/ip·智能路由器
superior tigre2 小时前
CNN卷积网络:让计算机拥有“火眼金睛“(superior哥AI系列第4期)
网络·人工智能·cnn