【网络协议】TCP、HTTP、MQTT 和 WebSocket 对比
从协议本质、工作原理、特点、应用场景等方面详细对比 TCP、HTTP、MQTT 和 WebSocket。
1. TCP(Transmission Control Protocol,传输控制协议)
本质
- 协议类型:传输层协议(OSI模型第4层)。
- 核心功能:提供可靠的、面向连接的、全双工的字节流传输服务。
- 作用:确保数据在不可靠的网络中可靠传输,是互联网通信的基础。
工作原理
- 三次握手建立连接:
- 客户端发送
SYN
包。 - 服务端回复
SYN-ACK
包。 - 客户端发送
ACK
包,连接建立。
- 客户端发送
- 四次挥手断开连接:通过
FIN
和ACK
包协商关闭连接。 - 流量控制与拥塞控制:通过滑动窗口、慢启动等机制优化传输效率。
- 数据校验:通过校验和(Checksum)确保数据完整性。
特点
- 可靠传输:通过重传机制保证数据不丢失、不重复、有序到达。
- 面向连接:通信前需建立连接,通信后释放连接。
- 全双工:双方可同时发送和接收数据。
- 无状态:仅关注数据传输,不关心应用层协议的具体内容。
应用场景
- 所有需要可靠传输的场景,如文件传输(FTP)、电子邮件(SMTP)、HTTP 等。
2. HTTP(Hypertext Transfer Protocol,超文本传输协议)
本质
- 协议类型:应用层协议(OSI模型第7层)。
- 核心功能:客户端-服务器模型下,用于网页、API等资源的请求与响应。
- 依赖:基于 TCP 传输(通常使用 TCP 80 端口,HTTPS 使用 443 端口)。
工作原理
- 请求-响应模式:
- 客户端发送请求(如
GET /index.html HTTP/1.1
)。 - 服务端处理请求并返回响应(如
200 OK
和 HTML 内容)。
- 客户端发送请求(如
- 无状态:每次请求独立,需通过 Cookie 或 Token 维持会话。
- 版本演进:
- HTTP/1.1:支持长连接(Keep-Alive),减少握手开销。
- HTTP/2:二进制分帧、多路复用,提升性能。
- HTTP/3:基于 QUIC 协议,减少延迟。
特点
- 无状态:每个请求独立,需额外机制维护会话。
- 文本协议:请求和响应内容为文本格式(如 JSON、XML)。
- 单向通信:客户端主动发起请求,服务端被动响应。
- 高延迟:每次请求需建立 TCP 连接(HTTP/1.1 改善,但仍有开销)。
应用场景
- 网页浏览、API 调用、文件下载等。
3. MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)
本质
- 协议类型:应用层协议(OSI模型第7层)。
- 核心功能:轻量级、低带宽、高可靠的消息发布-订阅模式协议。
- 设计目标:为物联网(IoT)设备提供高效通信,适合资源受限环境。
工作原理
- 发布-订阅模型:
- Broker(消息代理):中心服务器,管理主题(Topic)和消息路由。
- Publisher(发布者):向特定主题发布消息。
- Subscriber(订阅者):订阅感兴趣的主题,接收消息。
- QoS(服务质量等级):
- QoS 0:最多一次(尽力而为,可能丢失)。
- QoS 1:至少一次(确保到达,可能重复)。
- QoS 2:恰好一次(严格保证不重复、不丢失)。
- 轻量级:固定报文头仅 2 字节(QoS 0 时),文本主题。
特点
- 低带宽、低开销:适合物联网设备(如传感器、嵌入式设备)。
- 异步通信:发布者与订阅者无需同时在线。
- 可靠消息传递:通过 QoS 级别保证消息可靠性。
- 基于 TCP:默认使用 TCP 1883 端口(加密版 MQTT-SN 使用 8883)。
应用场景
- 物联网设备通信(如智能家居、工业监控)、传感器数据采集、移动推送通知。
4. WebSocket
本质
- 协议类型:应用层协议(OSI模型第7层)。
- 核心功能:全双工、实时通信协议,建立在 TCP 之上。
- 设计目标:解决 HTTP 的单向请求-响应模式,实现实时双向通信。
工作原理
- 基于 HTTP 协议升级:
- 客户端通过 HTTP 请求发起 WebSocket 握手(
Upgrade: websocket
)。 - 服务端响应
101 Switching Protocols
,切换到 WebSocket 协议。
- 客户端通过 HTTP 请求发起 WebSocket 握手(
- 全双工通信:连接建立后,客户端和服务器可随时发送数据帧。
- 数据格式:二进制或文本帧,支持心跳机制(Ping/Pong)保持连接。
特点
- 持久连接:一次握手后长期保持连接,无需重复建立 TCP 连接。
- 双向通信:服务端可主动推送消息到客户端。
- 低延迟:适合实时性要求高的场景。
- 依赖 TCP:默认使用 80/443 端口(与 HTTP 共享)。
应用场景
- 实时聊天、在线游戏、股票行情推送、协同编辑等需要实时交互的场景。
核心区别总结
特性 | TCP | HTTP | MQTT | WebSocket |
---|---|---|---|---|
协议类型 | 传输层(第4层) | 应用层(第7层) | 应用层(第7层) | 应用层(第7层) |
通信模式 | 全双工字节流 | 请求-响应(单向) | 发布-订阅(异步) | 全双工(双向) |
连接方式 | 面向连接(需握手) | 无连接(HTTP/1.1 支持长连接) | 面向连接(通过 Broker) | 面向连接(持久连接) |
可靠性 | 可靠(重传机制) | 可靠(依赖 TCP) | 可靠(QoS 1/2) | 可靠(依赖 TCP) |
带宽/开销 | 较低(基础传输层) | 较高(文本协议) | 极低(二进制+轻量) | 中等(二进制帧) |
实时性 | 一般(需应用层优化) | 较差(需轮询或长轮询) | 较好(异步推送) | 极佳(全双工) |
典型端口 | 80(HTTP)、443(HTTPS) | 80(HTTP)、443(HTTPS) | 1883(MQTT)、8883(MQTT-SN) | 80(WebSocket)、443(WSS) |
适用场景 | 所有可靠传输场景 | Web 请求响应 | 物联网、低带宽设备 | 实时双向通信 |
关键区别对比
-
协议层级
- TCP 是传输层协议,负责底层数据传输;
- HTTP/MQTT/WebSocket 是应用层协议,依赖 TCP 提供可靠传输。
-
通信模式
- HTTP 是单向请求-响应模式,客户端主动发起;
- MQTT 是异步的发布-订阅模式,通过 Broker 中转;
- WebSocket 是全双工模式,服务端可主动推送。
-
实时性
- HTTP 需轮询或长轮询(如 SSE)实现近实时,开销大;
- MQTT 和 WebSocket 支持实时推送,延迟更低。
-
带宽与资源
- MQTT 是最轻量的,适合物联网设备;
- WebSocket 比 HTTP 更高效,但比 MQTT 复杂;
- HTTP 文本协议开销较大。
-
连接管理
- TCP 需显式建立和关闭连接;
- HTTP 短连接(HTTP/1.1 支持长连接);
- MQTT/WebSocket 保持持久连接。
选择建议
- 需要可靠传输但无特定应用需求 → TCP
- 网页浏览、API 调用 → HTTP/HTTP/2/HTTP/3
- 物联网设备通信、低带宽环境 → MQTT
- 实时双向通信(如聊天、游戏) → WebSocket
相关文章:
【网络协议】TCP、HTTP、MQTT 和 WebSocket 对比
从协议本质、工作原理、特点、应用场景等方面详细对比 TCP、HTTP、MQTT 和 WebSocket。 1. TCP(Transmission Control Protocol,传输控制协议) 本质 协议类型:传输层协议(OSI模型第4层)。核心功能&#x…...
Cython打包多层目录Python文件方法
为了使用Cython打包多层目录下的Python文件,并保持目录结构,请按照以下步骤操作: 步骤1:项目结构示例 假设项目结构如下: myproject/setup.pysrc/__init__.pymodule1.pysubdir/__init__.pymodule2.py步骤2ÿ…...

[数据结构]5. 栈-Stack
栈-Stack 1. 介绍2. 栈的实现2.1 基于链表的实现2.2 基于数组的实现 3. 栈操作CreateInitilizateDestoryPushPopTopEmptySize 1. 介绍 栈(stack) 是一种遵循先入后出逻辑的线性数据结构。顶部称为“栈顶”,底部称为“栈底”。把元素添加到栈…...
2020年下半年试题三:论云原生架构及其应用
论文库链接:系统架构设计师论文 论文题目 近年来,随着数字化转型不断深入,科技创新与业务发展不断融合,各行各业正在从大工业时代的固化范式进化成面向创新型组织与灵活型业务的崭新模式。在这一背景下,以容器盒微服务…...

基于Spring Boot + Vue的高校心理教育辅导系统
一、项目背景介绍 随着高校对学生心理健康教育的重视,传统的人工心理辅导与测评模式已经难以满足广大师生的个性化需求。为了提高心理服务的效率、便捷度和覆盖范围,本项目开发了一个高校心理教育辅导系统,集成心理评测、辅导预约、留言交流…...

JavaSwing之-JDialog
JavaSwing之-JDialog JDialog 是 Java Swing 中用于创建对话框窗口的容器类,继承自 Dialog 类(AWT),常用于显示临时信息、获取用户输入或执行模态操作。它是 javax.swing.JDialog 包中的类。 与 JFrame 不同的是,JDia…...

【学习路线】 游戏客户端开发入门到进阶
目录 游戏客户端开发入门到进阶:系统学习路线与推荐书单一、学习总原则:从底层出发,项目驱动,持续迭代二、推荐学习路线图(初学者→进阶)第一阶段:语言基础与编程思维第二阶段:游戏开…...

部署安装gitlab-ce-17.9.7-ce.0.el8.x86_64.rpm
目录 编辑 实验环境 所需软件 实验开始 安装部署gitlab171.配置清华源仓库(版本高的系统无需做)vim /etc/yum.repos.d/gitlab-ce.repo 2.提前下载包dnf localinstall gitlab-ce-17.9.7-ce.0.el8.x86_64.rpm --rocklinux 3.修改配…...

备战菊厂笔试2-BFS记忆化MLE?用Set去重-Set会TLE?用SortedSet剪枝
目录 200.岛屿数量 不用getnei,直接在dfs判断,去掉解包 如果害怕栈溢出那么可以用bfs 2617.网格图中最少访问的格子数 注意特判! MLE主要是因为vis占用的内存过大 用SortedSet有序剪枝 什么是SortedSet? 基本性质 导入 …...
主机A向主机B发送一个长度为L字节的文件,假设TCP的MSS为1460字节,则在TCP的序号不重复使用的前提下,L的最大值是多少?
📘题干回顾: 主机A向主机B发送一个长度为L字节的文件,假设TCP的MSS为1460字节,则在TCP的序号不重复使用的前提下,L的最大值是多少? 这个问题关键在于“TCP序号不重复使用”。 ✅ 正确答案是:D.…...

【RabbitMQ】发布确认机制的具体实现
文章目录 模式介绍建立连接单独确认代码实现逻辑运行结果 批量确认代码实现逻辑运行结果 异步确认实现逻辑介绍代码实现逻辑运行结果 三种策略对比以及完整代码 模式介绍 作为消息中间件,都会面临消息丢失的问题,消息丢失大概分为三种情况: …...

React状态管理-对state进行保留和重置
相同位置的相同组件会使得 state 被保留下来 当你勾选或清空复选框的时候,计数器 state 并没有被重置。不管 isFancy 是 true 还是 false,根组件 App 返回的 div 的第一个子组件都是 <Counter />: 你可能以为当你勾选复选框的时候 st…...

vue和springboot交互数据,使用axios【跨域问题】
vue和springboot交互数据,使用axios【跨域问题】 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】&…...

AJAX 使用 和 HTTP
ajax学习 promise和 awit Node.js 和 webpack 前端工程化 Git工具 AJAX异步的JS和XML: 使用XML对象和服务器通信 在这里插入图片描述 统一资源定位符 URL HTTP 超文本传输协议 域名 资源路径 资源目录和类型 URL 查询参数 使用?表示之后的参数…...

MySQL之基础事务
目录 引言: 什么是事务? 事务和锁 mysql数据库控制台事务的几个重要操作指令(transaction.sql) 1、事物操作示意图: 2.事务的隔离级别 四种隔离级别: 总结一下隔离指令 1. 查看当前隔离级别 …...
uniapp设置 overflow:auto;右边不显示滚动条的问题
设置了overflow:auto;或者其它overflow的属性不显示滚动条是因为在uniapp中默认隐藏了滚动条 解决方法: //强制显示滚动条 ::-webkit-scrollbar {width: 8px !important;background: #ccc !important;display: block !important;}//设置滚动条颜色.cu-…...
数据库基础复习笔记
数据库 相关概念 名称全称检查数据库存储数据的仓库,数据是有组织的进行存储DataBase(DB)数据库管理系统操作和管理数据库的大型软件DataBase Management System(DBMS)SQL操作关系型数据库的编程语言,定义了一套操作关系型数据库…...

MySQL基础关键_013_常用 DBA 命令
目 录 一、MySQL 用户信息存储位置 二、新建用户 1.创建本地用户 2.创建外网用户 三、用户授权 1.说明 2.实例 四、撤销授权 五、修改用户密码 六、修改用户名、主机名/IP地址 七、删除用户 八、数据备份 1.导出数据 2.导入数据 (1)方式…...
爬虫请求频率应控制在多少合适?
爬虫请求频率的控制是一个非常重要的问题,它不仅关系到爬虫的效率,还涉及到对目标网站服务器的影响以及避免被封禁的风险。合理的请求频率需要根据多个因素来综合考虑,以下是一些具体的指导原则和建议: 一、目标网站的政策 查看网…...
探秘网络邮差:FTP、Telnet、SMTP、NFS、SNMP介绍
引言:谁是网络世界的“邮差”? 想象一下,你正在网上冲浪——发送一封邮件、上传一份文件、远程登录服务器,甚至只是打开一个网页。这些看似简单的操作背后,其实有一群默默无闻的“邮差”在辛勤工作。它们就是应用层协…...

java基础:异常体系
目录 一、java异常体系介绍二、异常1、运行时异常2、非运行时异常 三、错误四、异常的处理方式1、方式1:throws声明抛出异常1.1、throws关键字1.2、throw关键字 2、方式2:try-catch-finally 一、java异常体系介绍 异常体系图如下: Throwable…...
CSS Grid布局:从入门到实战
CSS Grid布局:从入门到实战 一、初识Grid布局 还在为网页布局发愁吗?Flexbox虽然好用,但当遇到复杂布局时,CSS Grid才是真正的王者。Grid布局是CSS中最强大的二维布局系统,它就像一张无形的网格纸,让我们…...

记录算法笔记(20025.5.14)对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false 提示: 树中节点数目…...

QT Creator配置Kit
0、背景:qt5.12.12vs2022 记得先增加vs2017编译器 一、症状: 你是否有以下症状? 1、用qt新建的工程,用qmake,可惜能看见的只有一个pro文件? 2、安装QT Creator后,使用MSVC编译显示no c com…...

JVM 与云原生的完美融合:引领技术潮流
最近佳作推荐: Java 大厂面试题 – 揭秘 JVM 底层原理:那些令人疯狂的技术真相(New) Java 大厂面试题 – JVM 性能优化终极指南:从入门到精通的技术盛宴(New) Java 大厂面试题 – JVM 深度剖析&…...
Ubuntu24.04编译ORB_SLAM的一系列报错解决
Ubuntu24.04编译ORB_SLAM的一系列报错解决 decay_t报错 报错信息:error: ‘decay_t’ is not a member of ‘std’;did you mean ‘decay’ 将CMakeLists.txt中第17行的c标准修改为c14即可: 修改前: CHECK_CXX_COMPILER_FLAG…...

为何大模型都使用decoder-only?
第一章 架构之争的历史脉络 1.1 从双向到单向的革命 2017年,BERT的横空出世让双向注意力机制成为NLP领域的“武林盟主”。通过Masked Language Modeling(MLM),BERT在阅读理解、情感分析等任务中展现出惊人的表现,但它…...
《Effective Python》第2章 字符串和切片操作——Python 字符串格式化的现代选择f-strings
引言 本篇博客基于学习《Effective Python》第三版 Chapter 2: Strings and Slicing 的 Item 11 “Prefer Interpolated F-Strings Over C-style Format Strings and str.format” 的总结与延伸。 字符串格式化是 Python 编程中的常见操作,用于动态生成可读性高的…...

企业报表平台如何实现降本增效
一、你的企业是否正被这些问题拖累? 财务还在手动汇总各门店的Excel销售数据;市场部总抱怨“客户分析全靠拍脑袋”;仓库突然发现爆款断货,但上周的报表显示库存充足…… 这些场景你是否熟悉?数据散落在ERP、E…...

Ollama+OpenWebUI+docker完整版部署,附带软件下载链接,配置+中文汉化+docker源,适合内网部署,可以局域网使用
前言: 因为想到有些环境可能没法使用外网的大模型,所以可能需要内网部署,看了一下ollama适合小型的部署,所以就尝试了一下,觉得docker稍微简单一点,就做这个教程的,本文中重要的内容都会给下载…...