news 2026/5/15 9:40:24

深入 TCP 核心:握手、挥手、滑动窗口与并发服务器实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入 TCP 核心:握手、挥手、滑动窗口与并发服务器实战

一、 连接的诞生与消亡

1. 三次握手 (The 3-Way Handshake)

发生时机connect()调用时。
本质:双方确认对方的发送和接收能力正常,并同步初始序列号 (ISN)。

  • 第一次:客户端发送SYN=1, seq=J。(我想连你)
  • 第二次:服务器回复SYN=1, ACK=1, ack=J+1, seq=K。(收到,我也想连你)
  • 第三次:客户端回复ACK=1, ack=K+1。(收到,连接建立!)

程序表现:当三次握手在内核层面全部完成后,客户端的connect函数才会返回 0 (成功)。此时双方状态变为ESTABLISHED

2. 四次挥手 (The 4-Way Wave)

发生时机close()调用时。
本质:TCP 是全双工的,断开需要双向分别关闭。

  • 第一次:主动方发FIN。(我没数据发了,申请关闭发送通道)
  • 第二次:被动方回ACK。(知道了,但我可能还有数据没发完,你先等着)
    • 此时处于半关闭状态 (Half-Close)
  • 第三次:被动方发FIN。(我的数据也发完了,申请关闭)
  • 第四次:主动方回ACK。(好的,再见)。

为什么是四次?
握手时,服务器的 SYN 和 ACK 可以合并在一个包里发。但在挥手时,服务器收到 FIN 后,可能还需要发送未处理完的数据,所以先回 ACK,等数据发完了再发自己的 FIN。


二、 流量控制的秘密:滑动窗口

在 TCP 头部中有一个字段叫Window

  • 误区:它不是屏幕上的窗口,而是一个数值。
  • 本质告诉我你还能吃多少(接收缓冲区的剩余容量)。

工作机制

  1. 接收方在回复 ACK 时,会带上自己的Win大小。
  2. 发送方根据这个数值调整发送速度。
  3. 如果Win=0,发送方就会停止发送(阻塞),直到窗口变大。

这实现了流量控制,防止发送方把接收方“撑死”。


三、 突破瓶颈:多进程并发服务器

1. 问题背景

我们之前写的服务器是迭代服务器(Iterative Server):

while(1){accept();// 接一个process();// 处理完}// 才能接下一个

如果有客户端连上后一直不说话(挂机),process()就会一直阻塞,导致后续的客户端无法连接。

2. 解决方案:多进程模型

利用fork()创建子进程。

  • 父进程:只负责accept(即“迎宾小姐”),一有客人来就 fork 一个子进程。
  • 子进程:负责具体的通信(即“服务员”),服务完一个客人就退出。

3. 代码实战 (tcp_mp_server.c)

为了避免僵尸进程(Zombie Process),我们需要通过信号机制回收子进程。

#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<arpa/inet.h>#include<sys/socket.h>#include<signal.h>#include<sys/wa
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 0:47:56

java 环境配置(详细教程)

Java 环境配置详细教程&#xff08;2025–2026 最新主流方式&#xff09; 以下教程主要针对 Windows、macOS、Linux&#xff08;Ubuntu/Debian/CentOS&#xff09; 三种主流操作系统&#xff0c;2025–2026 年最推荐的配置方式。 目前&#xff08;2026年初&#xff09;最推荐…

作者头像 李华
网站建设 2026/5/10 6:50:33

同事用“与运算“改了这几行代码,运行效率直接起飞~

正文 大家好&#xff0c;我是bug菌~ 1 问题背景 最近由于项目指标的需求&#xff0c;查了下程序各个部分的运行效率&#xff0c;发现一直用的环形缓冲区在耗时占比中还挺突出&#xff0c;于是过了一遍代码并尝试着去优化一下&#xff0c;没想到改动不大却得到了较大的效率提升。…

作者头像 李华
网站建设 2026/5/4 0:48:06

开题报告卡壳?虎贲等考 AI:一键搭建逻辑闭环,开题答辩一次过

论文写作的第一道坎&#xff0c;从来都是开题报告。选题太宽泛被导师驳回&#xff0c;技术路线图画得乱七八糟&#xff0c;研究意义写得像 “空话套话”&#xff0c;熬了好几个通宵的初稿&#xff0c;还是被批 “缺乏可行性”&#xff1f;作为深耕论文写作科普的博主&#xff0…

作者头像 李华