TCP、UDP、WebSocket 和 HTTP 教程

embedded/2025/3/6 17:52:54/

一、TCP(传输控制协议)

1. 原理

TCP 处于传输层,负责为应用层提供可靠的、面向连接的字节流服务。在数据传输前,它会通过"三次握手"建立连接,确保通信双方都具备收发数据的能力;传输过程中,采用确认机制、重传机制和滑动窗口机制保证数据的可靠和有序;传输结束后,使用"四次挥手"断开连接。

三次握手建立连接
  • 第一次握手:客户端向服务器发送一个 SYN 包,其中 seq = xx 为客户端随机生成的初始序列号),表明客户端希望与服务器建立连接。
  • 第二次握手:服务器收到 SYN 包后,向客户端发送 SYN + ACK 包。SYN 表示同意建立连接,seq = yy 为服务器随机生成的初始序列号);ACK 是对客户端 SYN 包的确认,ack = x + 1
  • 第三次握手:客户端收到 SYN + ACK 包后,向服务器发送 ACK 包,seq = x + 1ack = y + 1,此时连接建立成功。
四次挥手断开连接
  • 第一次挥手:客户端向服务器发送 FIN 包,seq = u,表示客户端没有数据要发送了,请求关闭连接。
  • 第二次挥手:服务器收到 FIN 包后,向客户端发送 ACK 包,seq = vack = u + 1,表示同意关闭客户端到服务器的连接。
  • 第三次挥手:服务器向客户端发送 FIN 包,seq = v,表示服务器也没有数据要发送了,请求关闭服务器到客户端的连接。
  • 第四次挥手:客户端收到 FIN 包后,向服务器发送 ACK 包,seq = u + 1ack = v + 1,连接关闭。

2. 时序图

Client Server 三次握手建立连接 SYN seq=x SYN+ACK seq=y, ack=x+1 ACK seq=x+1, ack=y+1 数据传输 数据 确认 loop [多次数据传输] 四次挥手断开连接 FIN seq=u ACK seq=v, ack=u+1 FIN seq=v ACK seq=u+1, ack=v+1 Client Server

3. 代码示例(Python)

import socket# 创建 TCP 套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址和端口
server_socket.bind(('localhost', 8888))
# 监听连接
server_socket.listen(1)print('Waiting for a connection...')
# 接受客户端连接
conn, addr = server_socket.accept()
print(f'Connected by {addr}')while True:# 接收客户端数据data = conn.recv(1024)if not data:break# 发送响应数据conn.sendall(data)# 关闭连接
conn.close()

二、UDP(用户数据报协议)

1. 原理

UDP 是一种无连接的传输层协议,不保证数据的可靠传输和顺序性。发送方直接将数据封装成 UDP 数据报发送,接收方接收数据报,无需事先建立连接和后续断开连接的操作。每个 UDP 数据报包含源端口、目的端口、长度和校验和等信息。

2. 时序图

Client Server UDP 数据报 UDP 数据报 loop [多次数据传输] Client Server

3. 代码示例(Python)

import socket# 创建 UDP 套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址和端口
server_socket.bind(('localhost', 8888))print('Waiting for data...')
while True:# 接收数据data, addr = server_socket.recvfrom(1024)print(f'Received from {addr}: {data.decode()}')# 发送响应数据server_socket.sendto(data, addr)

三、WebSocket

1. 原理

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,工作在应用层。它基于 TCP 协议,通过 HTTP 协议进行握手升级。客户端发送 HTTP 请求,请求头包含 Upgrade: websocket 字段,服务器若支持则返回状态码为 101 的 HTTP 响应,表示同意升级。之后双方可通过 WebSocket 进行实时双向通信。

2. 时序图

Client Server WebSocket 握手 HTTP 请求(Upgrade: websocket HTTP 响应(101 Switching Protocols) 全双工通信 WebSocket 消息 WebSocket 消息 loop [多次数据交互] Client Server

3. 代码示例(Python + Flask-SocketIO)

from flask import Flask
from flask_socketio import SocketIOapp = Flask(__name__)
socketio = SocketIO(app)@socketio.on('connect')
def handle_connect():print('Client connected')@socketio.on('message')
def handle_message(message):print(f'Received message: {message}')socketio.send('Server received: ' + message)if __name__ == '__main__':socketio.run(app, debug=True)

四、HTTP(超文本传输协议)

1. 原理

HTTP 是应用层协议,基于 TCP 协议实现。它是无状态的,即服务器不会记录客户端的历史请求信息。采用请求 - 响应模式,客户端向服务器发送请求,服务器根据请求进行处理并返回响应。

请求结构
  • 请求行:包含请求方法(如 GET、POST 等)、请求 URI 和 HTTP 版本。
  • 请求头:包含一系列键值对,如 User - Agent 表示客户端信息,Content - Type 表示请求体的类型等。
  • 请求体:可选部分,用于携带请求的数据,如表单数据、JSON 数据等。
响应结构
  • 状态行:包含 HTTP 版本、状态码和状态消息,如 200 OK 表示请求成功。
  • 响应头:同样包含一系列键值对,如 Content - Length 表示响应体的长度,Content - Type 表示响应体的类型。
  • 响应体:包含服务器返回的实际数据,如 HTML 页面、JSON 数据等。

2. HTTP 与 TCP 的区别

  • 层次不同:TCP 是传输层协议,负责数据的可靠传输;HTTP 是应用层协议,基于 TCP 提供的服务进行应用数据的传输。
  • 连接特性:TCP 是面向连接的,在传输数据前需要建立连接,传输后断开连接;HTTP 本身是无状态的,每次请求都是独立的,虽然基于 TCP 连接,但连接可以复用也可以每次重新建立。
  • 功能侧重点:TCP 主要关注数据传输的可靠性、顺序性和流量控制;HTTP 关注的是如何在客户端和服务器之间传输超文本等应用数据,以及如何处理请求和响应。

3. 时序图

Client Server TCP 连接建立 HTTP 请求 HTTP 响应 TCP 连接关闭 loop [多次请求响应] Client Server

4. 代码示例(Python + Flask)

from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello_world():return 'Hello, World!'if __name__ == '__main__':app.run(debug=True)

五、对比表格

协议优点缺点实际使用场景
TCP可靠传输,适合对数据准确性要求高的场景;面向连接,能保证数据按序到达建立和断开连接开销大;传输效率相对较低文件传输、电子邮件、网页浏览等
UDP无连接,开销小,传输速度快;适合实时性要求高的场景不可靠传输,可能会丢包、乱序实时音视频传输、在线游戏等
WebSocket全双工通信,实时性强;可以在浏览器和服务器之间进行实时通信服务器资源消耗大;协议复杂度较高实时聊天、实时数据更新、在线协作等
HTTP简单易用,无状态,适合快速处理请求;广泛应用于 Web 开发每次请求都需要建立新的连接,开销大;不适合实时通信网页浏览、API 调用等

六、实际使用场景总结

TCP

  • 文件传输:如 FTP(文件传输协议),确保文件完整无误地传输。
  • 电子邮件:SMTP(简单邮件传输协议)、POP3(邮局协议版本 3)和 IMAP(互联网邮件访问协议)等协议都基于 TCP,保证邮件的可靠传输。
  • 网页浏览:HTTP 协议通常基于 TCP 传输,确保网页内容准确无误地显示给用户。

UDP

  • 实时音视频传输:如 VoIP(网络电话)、视频会议等,对实时性要求高,允许一定的丢包。
  • 在线游戏:游戏中的实时位置更新、动作同步等需要低延迟,UDP 更适合。

WebSocket

  • 实时聊天:如即时通讯软件,用户可以实时收发消息。
  • 实时数据更新:如股票行情、天气预报等,服务器可以实时推送最新数据。
  • 在线协作:如多人在线文档编辑、多人游戏等,实现实时协作。

HTTP

  • 网页浏览:用户通过浏览器访问网页,浏览器向服务器发送 HTTP 请求,服务器返回网页内容。
  • API 调用:前后端分离的开发模式中,前端通过 HTTP 请求调用后端的 API 接口获取数据。

http://www.ppmy.cn/embedded/170533.html

相关文章

【大模型安全】模型对抗攻击手段

【大模型安全】模型对抗攻击手段 1.基于梯度的攻击方法(白盒)FGSM 攻击PGD 攻击 2.基于优化的攻击方法(白盒)3.基于迁移的攻击方法(黑盒)4.基于GAN的攻击方法(灰盒)5.基于决策边界的…

版本控制器Git和gdb

一.版本控制器Git 1.版本控制简单来讲可以对每一份代码版本进行复制保存,保证每一版代码都可查 2.仓库的本质也是一个文件夹 3.git既是一个客户端,也是一个服务器,是一个版本控制器。而gitee和GitHub都是基于git的网站或平台 4.git的基本…

Centos 7.9内核升级

手动内核从3.10升级到5.15 从https://dl.lamp.sh/kernel/el7/下载两个包 安装主内核包 sudo rpm -ivh kernel-ml-5.15.148-1.el7.elrepo.x86_64.rpm 安装开发包(编译 eBPF 必需) sudo rpm -ivh kernel-ml-devel-5.15.148-1.el7.elrepo.x86_64.rpm …

23种设计模式之《模板方法模式(Template Method)》在c#中的应用及理解

程序设计中的主要设计模式通常分为三大类,共23种: 1. 创建型模式(Creational Patterns) 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。 工厂方法模式&#xff0…

【漫话机器学习系列】119.小批量随机梯度方法

1. 引言 在机器学习和深度学习中,梯度下降(Gradient Descent)是一种常见的优化算法,用于调整模型参数以最小化损失函数。然而,在处理大规模数据集时,使用传统的梯度下降(GD)可能会面…

LangChain-08 Query SQL DB 通过GPT自动查询SQL

我们需要下载一个 LangChain 官方提供的本地小数据库。 安装依赖 SQL: https://raw.githubusercontent.com/lerocha/chinook-database/master/ChinookDatabase/DataSources/Chinook_Sqlite.sql Shell: pip install --upgrade --quiet langchain-core langchain-community la…

[内网安全] Windows 本地认证 — NTLM 哈希和 LM 哈希

关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:SAM 文件 & Windows 本地认证流程 0x0101:SAM 文件简介 Windows 本地账户的登录密码是存储在系统本地的 SAM 文件中的,在登录 Windows 的时候&am…

GCC RISCV 后端 -- cc1 入口

GCC编译工具链中的 gcc 可执行程序,实际上是个驱动程序(Driver),其根据输入的参数,然后调用其它不同的程序,对输入文件进行处理,包括编译、链接等。可以通过以下命令查看: gcc -v h…