目录

一、TCP 协议的核心定位与特性

1.1 协议栈中的位置

1.2 五大核心特性

二、TCP 连接建立与终止的底层逻辑

2.1 三次握手(连接建立)

2.2 四次挥手(连接终止)

三、TCP 可靠传输的核心机制

3.1 序列号与确认机制

3.2 滑动窗口协议

3.3 超时重传与快速重传

四、TCP 拥塞控制算法解析

4.1 慢启动(Slow Start)

4.2 拥塞避免(Congestion Avoidance)

4.3 快速恢复(Fast Recovery)

五、TCP 实战:使用 Python 实现 TCP 通信

5.1 TCP 服务器实现

5.2 TCP 客户端实现

六、TCP 性能优化与常见问题

6.1 关键参数调优

6.2 常见问题与解决方案

总结


           TCP(Transmission Control Protocol,传输控制协议)是互联网核心协议之一,作为 OSI 七层模型中传输层的关键协议,它为上层应用提供了可靠、有序、面向连接的数据传输服务。本文将从技术底层出发,系统解析 TCP 的核心机制、工作原理及实战应用,帮助读者构建对 TCP 协议的完整认知体系。

一、TCP 协议的核心定位与特性

1.1 协议栈中的位置

TCP 工作在 OSI 模型的传输层,承上启下连接应用层与网络层:

  • 向上:为 HTTP、FTP、SMTP 等应用层协议提供可靠传输能力
  • 向下:基于 IP 协议(网络层)完成跨网络的数据投递

1.2 五大核心特性

TCP 区别于 UDP 的关键特性可概括为:

  • 面向连接:通信前必须建立连接(三次握手),结束后释放连接(四次挥手)
  • 可靠传输:通过确认应答、超时重传、校验和等机制保证数据不丢失、不损坏
  • 字节流服务:将应用数据视为连续字节流,不保留应用层消息边界
  • 流量控制:基于滑动窗口机制,防止发送方速率超过接收方处理能力
  • 拥塞控制:通过慢启动、拥塞避免等算法,动态适应网络负载状况

二、TCP 连接建立与终止的底层逻辑

2.1 三次握手(连接建立)

TCP 通过三次握手建立连接,核心目的是同步双方的序列号并确认通信能力:

三次握手的必要性

  • 第一次握手(Client→Server):客户端告知服务器 "我要发送数据了"
  • 第二次握手(Server→Client):服务器回应 "我收到了,我也准备好接收了"
  • 第三次握手(Client→Server):客户端确认 "我知道你准备好了,开始通信"

若仅用两次握手,服务器无法确认客户端是否收到自己的准备信号,可能导致服务器资源浪费。

2.2 四次挥手(连接终止)

TCP 通过四次挥手释放连接,因通信双方均可主动关闭连接,需双向确认:

 

TIME_WAIT 状态的意义

  • 确保最后一个 ACK 能到达服务器(防止服务器因未收到 ACK 而重发 FIN)
  • 等待网络中残留的数据包过期,避免新连接收到旧连接的数据包

三、TCP 可靠传输的核心机制

3.1 序列号与确认机制

TCP 将传输的数据视为字节流,每个字节都有唯一序列号:

  • 发送方:为每个数据包分配起始序列号(seq)
  • 接收方:通过确认号(ack)告知发送方 "已正确接收至 ack-1 字节"
发送方数据: [1-100] [101-200] [201-300]
发送包seq: 1        101       201
接收方ack: 101      201       301

3.2 滑动窗口协议

滑动窗口是 TCP 提高传输效率的关键技术,允许发送方在未收到确认时连续发送多个数据包:

发送窗口 = min(拥塞窗口, 接收窗口)
  • 接收窗口(rwnd):接收方告知发送方可发送的最大字节数(由接收缓冲区大小决定)
  • 拥塞窗口(cwnd):发送方根据网络拥塞状况动态调整的窗口大小

3.3 超时重传与快速重传

  • 超时重传:发送方设置超时计时器,未收到确认则重传数据包
  • 快速重传:接收方收到失序数据包时立即发送重复确认,发送方收到 3 个重复确认后立即重传(无需等待超时)
正常传输: [1]→ACK2 [2]→ACK3 [3]→ACK4 [4]→ACK5丢包场景: [1]→ACK2 [2]→ACK3 [3]丢失 [4]→ACK3(重复确认)[5]→ACK3(重复确认)[6]→ACK3(重复确认)发送方收到3个ACK3后,立即重传[3]

四、TCP 拥塞控制算法解析

TCP 通过拥塞控制避免网络因过度负载而崩溃,核心算法包括:

4.1 慢启动(Slow Start)

  • 初始 cwnd=1 个报文段
  • 每收到一个确认,cwnd 加倍(指数增长)
  • 当 cwnd 达到慢启动阈值(ssthresh),进入拥塞避免阶段

4.2 拥塞避免(Congestion Avoidance)

  • 每收到一个确认,cwnd 增加 1(线性增长)
  • 当检测到丢包,将 ssthresh 设为当前 cwnd 的一半,cwnd 重置为 1,重新进入慢启动

4.3 快速恢复(Fast Recovery)

  • 收到 3 个重复确认后,不重置 cwnd 为 1,而是设为 ssthresh
  • 每收到一个重复确认,cwnd 增加 1
  • 收到新的确认后,进入拥塞避免阶段

 

五、TCP 实战:使用 Python 实现 TCP 通信

5.1 TCP 服务器实现

import socket
import threadingdef handle_client(client_socket, client_addr):"""处理客户端连接"""print(f"新连接: {client_addr}")try:# 接收客户端数据(最大1024字节)while True:data = client_socket.recv(1024)if not data:  # 客户端关闭连接breakprint(f"收到来自{client_addr}的数据: {data.decode('utf-8')}")# 发送响应response = f"已收到: {data.decode('utf-8')}"client_socket.sendall(response.encode('utf-8'))except Exception as e:print(f"处理客户端{client_addr}时出错: {e}")finally:client_socket.close()print(f"连接{client_addr}已关闭")def start_server(host='0.0.0.0', port=8888):"""启动TCP服务器"""# 创建TCP套接字(SOCK_STREAM表示TCP协议)server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置端口复用(避免服务器重启时出现"地址已在使用"错误)server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 绑定地址和端口server_socket.bind((host, port))# 开始监听(最大等待连接数为5)server_socket.listen(5)print(f"服务器已启动,监听{host}:{port}")try:while True:# 接受客户端连接(阻塞操作)client_socket, client_addr = server_socket.accept()# 创建线程处理客户端,主线程继续接受新连接client_thread = threading.Thread(target=handle_client,args=(client_socket, client_addr))client_thread.start()except KeyboardInterrupt:print("服务器正在关闭...")finally:server_socket.close()if __name__ == "__main__":start_server()

5.2 TCP 客户端实现

import socketdef start_client(host='localhost', port=8888):# 创建TCP套接字client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接服务器client_socket.connect((host, port))print(f"已连接到服务器{host}:{port}")try:while True:# 输入要发送的数据message = input("请输入要发送的消息(输入exit退出): ")if message.lower() == 'exit':break# 发送数据client_socket.sendall(message.encode('utf-8'))# 接收响应response = client_socket.recv(1024)print(f"服务器响应: {response.decode('utf-8')}")finally:# 关闭连接client_socket.close()print("连接已关闭")if __name__ == "__main__":start_client()

六、TCP 性能优化与常见问题

6.1 关键参数调优

  • TCP_NODELAY:禁用 Nagle 算法(减少小数据包延迟,适合实时通信)
    # 禁用Nagle算法示例
    client_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
    
  • SO_KEEPALIVE:启用保活机制(检测死连接)
    # 启用TCP保活
    client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
    # 设置保活参数(单位:秒)
    client_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 60)    # 60秒无数据发送保活包
    client_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 10)   # 保活包间隔10秒
    client_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 3)      # 最多发送3个保活包
    

6.2 常见问题与解决方案

  • TIME_WAIT 积累:服务器频繁创建和关闭连接会导致大量 TIME_WAIT 状态连接,可通过net.ipv4.tcp_tw_reuse=1net.ipv4.tcp_tw_recycle=1(Linux 系统参数)优化
  • 粘包问题:TCP 字节流特性导致应用层消息边界模糊,解决方案包括:
    • 固定消息长度
    • 消息头部添加长度字段
    • 使用特殊分隔符

总结

            TCP 协议通过连接管理、可靠传输、流量控制和拥塞控制四大机制,为互联网应用提供了稳定高效的传输服务。理解 TCP 的底层原理不仅有助于排查网络问题,更能指导我们写出更高效的网络程序。随着 QUIC 等新型传输协议的兴起,TCP 也在不断演进,但作为互联网的基石,其设计思想和核心机制仍值得每一位开发者深入学习。

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91096.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91096.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/91096.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA后端开发——“全量同步”和“增量同步”

“全量同步”和“增量同步”是数据处理、系统集成和数据库领域中两个基本概念。描述了两种截然不同的数据同步策略,理解它们的区别对于设计任何数据系统都至关重要。全量同步 核心思想:全部替换,一步到位。在技术上,全量同步通常意…

修改CentOS的SSH登录端口(22端口)

要修改CentOS系统的SSH服务默认端口(22端口),请按照以下步骤操作: 备份SSH配置文件 sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak编辑SSH配置文件 sudo vi /etc/ssh/sshd_config查找并修改端口设置 找到以下行(大约在第13行左右):…

python导包机制-更优方式

在学习某个大模型应用的后端时,发现: xxx |-----src |------\---modules |------\------\------b.py |-----app.py在app.py中可以使用src.modules.b来进行导入。之前我导入时是形如.modules.b这种形式(前面有.),但是当…

检索召回率优化探究一:基于 LangChain 0.3集成 Milvus 2.5向量数据库构建的智能问答系统

背景 基于 LangChain 0.3集成 Milvus 2.5向量数据库构建的 NFRA(National Financial Regulatory Administration,国家金融监督管理总局)政策法规智能问答系统,第一个版本的检索召回率是 79.52%,尚未达到良好、甚至是优…

《整合Spring Cache:本地缓存、Redis与Caffeine对比实践》

🚀 整合Spring Cache:本地缓存、Redis与Caffeine对比实践 📌 前言 在高并发、高性能的系统设计中,缓存始终扮演着不可替代的角色。Spring Cache 作为 Spring 框架原生提供的缓存抽象层,极大简化了缓存接入的复杂度。…

easyexcel填充方式导出-合并单元格并设置边框

填充的模板最后导出效果实体 /*** 账户实体类* author test* date 2025-07-28*/ Getter Setter class Test {/*** 账户类型*/private String accType;/*** 账户余额*/private String money; }导出逻辑 /*** 导出文件逻辑*/ public void exportReport(List<Test> data) { …

Jenkins + SonarQube 从原理到实战一:基于 K8s 部署与使用(含中文插件与 Python 扫描)

前言 公司开发部门希望在 Jenkins 构建过程中自动集成 C/C 的代码扫描&#xff0c;正好我也没接触过 SonarQube&#xff0c;于是记录下从零开始部署 SonarQube 服务并集成到 CI/CD 的过程&#xff0c;供后来者参考。 一、SonarQube 原理与工作机制详解 1.1 什么是 SonarQube&…

Linux(Centos 7.6)命令详解:sz

1.命令作用使用ZMODEM/YMODEM/XMODEM协议发送文件(Send file(s) with ZMODEM/YMODEM/XMODEM protocol)注意: 需要yum install lrzsz (yum provides sz可以查看rz命令是什么rpm包提供的)2.命令语法Usage: sz [options] file ...or: sz [options] -{c|i} COMMAND3.参数详解OPTION…

智能运维中的数据转换

《智能运维实践 苏娜 孙琳 王鸽著 人工智能技术丛书 自然语言处理的常用算法 日志异常检测 根因定位 网络流量异常检测 清华大学出版社》【摘要 书评 试读】- 京东图书 数据转换是数据预处理中的关键步骤&#xff0c;用于将数据从原始格式转换为适合分析和建模的形式。这一过程…

IAR编辑器如何让左侧的工具栏显示出来?

在IAR编辑器中恢复左侧工具栏显示&#xff0c;可通过以下方法操作&#xff1a; 一、通过菜单栏启用工具栏 ‌进入视图菜单‌ 点击顶部菜单栏的 ‌"View"‌ → 在弹出列表中勾选 ‌"Workspace"‌ 若工具栏仍不显示&#xff0c;查看菜单栏右侧是否有 ‌"…

ADB+Python控制(有线/无线) Scrcpy+按键映射(推荐)

要实现电脑通过键盘控制安卓平板屏幕点击的功能&#xff0c;可以采用以下方案&#xff1a; 方案一&#xff1a;ADBPython控制&#xff08;有线/无线&#xff09; 准备工具&#xff1a; 安卓平板开启开发者模式&#xff08;设置→关于平板→连续点击版本号&#xff09;启用USB调…

同态滤波算法详解:基于频域变换的光照不均匀校正

&#x1f3ad; 同态滤波&#xff1a;图像频域的调音师技术“如同调音师在音频处理中分离并调节不同频率成分&#xff0c;同态滤波能够在图像频域中精确分离光照与细节信息。”&#x1f3af; 图像频域调音的技术挑战 在数字图像处理中&#xff0c;光照不均匀问题如同音频中的混响…

Ubuntu简述及部署系统

1.什么是Ubuntu1.1概述Ubuntu属于Debian系列&#xff0c;Debian是社区类Linux的典范&#xff0c;是迄今为止最遵循GNU规范的Linux系统。Debain最早由lan Murdock于1993年创建&#xff0c;分为三个版本分支&#xff08;branch&#xff09;&#xff1a;stable&#xff0c;testing…

Claude Code安装部署

1️⃣安装 Node.js&#xff08;已安装可跳过&#xff09; 确保 Node.js 版本 ≥ 18.0 # Ubuntu / Debian 用户 curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo bash - sudo apt-get install -y nodejs node --version# macOS 用户 sudo xcode-select --install /b…

MATLAB近红外光谱分析技术及实践技术应用

专题一、MATLAB编程基础与进阶&#xff08;一&#xff09;1、MATLAB 安装、版本历史与编程环境2、MATLAB 基础操作&#xff08;矩阵操作、逻辑与流程控制、函数与脚本文件&#xff09;3、MATLAB文件读写&#xff08;mat、txt、xls、csv、jpg、wav、avi等格式&#xff09;专题二…

SQLFluff

一、SQLFluff 是什么&#xff1f; SQLFluff 是一个​​开源的 SQL 代码质量工具​​&#xff0c;专注于通过自动化方式提升 SQL 代码的可读性、一致性和规范性。其核心功能包括&#xff1a; ​​代码格式化​​&#xff1a;自动调整缩进、空格、换行等格式问题&#xff0c;支…

盲盒抽卡机小程序系统开发:连接线上线下娱乐新桥梁

在互联网技术的推动下&#xff0c;线上线下融合已经成为娱乐行业发展的必然趋势。盲盒抽卡机&#xff0c;这一原本在线下备受欢迎的娱乐项目&#xff0c;通过小程序系统的开发&#xff0c;成功实现了线上线下的无缝对接&#xff0c;成为连接线上线下娱乐的新桥梁。盲盒抽卡机小…

【SSL证书校验问题】通过 monkey-patch 关掉 SSL 证书校验

标签&#xff1a;Python、SSL、monkey-patch、httpx、aiohttp、requests、OpenAI 1 为什么会有这篇文章&#xff1f; 在本地调试 OpenAI 代理、数据抓取、私有服务、访问外网 时&#xff0c;经常会碰到如下报错&#xff1a; SSLCertVerificationError: [SSL: CERTIFICATE_VER…

VMWARE -ESXI-ntp时间同步无法启动异常处理

从服务界面查看NTP服务是停止的&#xff08;手动启动无效&#xff09;尝试到系统-时间设置-添加服务-网络时间协议&#xff0c;添加阿里云NTP服务器&#xff08;网络可达&#xff09; ntp.aliyun.com 点击确定报错-无法更改主机配置出现上面的情况多半是DNS没有设置ssh登录到服…

yolo11分类一键训练工具免安装环境windows版使用教程

这个是windows上用于yolo11分类训练工具&#xff0c;不需要写代码只需要按照要求摆放好分类图片文件夹就可以训练。软件内置cuda和python模块&#xff0c;因此不需要安装python环境和cuda就可以使用。注意需要电脑配备有nvidia显卡才能使用。要求显存>4GB。首先我们打开软件…