【学习笔记】TCP 与 UDP

        TCP(Transmission Control Protocol)与UDP(User Datagram Protocol)是 网络通讯 中最基础也最常用的两种 传输层 协议。

文章目录

      • 1. 简介
      • 2. OSI 与 TCP/IP 模型中的定位
      • 3. 协议原理与关键机制
        • 3.1 UDP
        • 3.2 TCP
      • 5. 实践:Socket 接口示例
        • C语言
        • Go语言
        • Python语言
      • 6. 调优


1. 简介

        TCP 是1974年由早期的NCP(Network Control Protocol)逐渐演化出来的概念。它在1980年被拆分成了现在常见的TCP与IP协议,形成经典的 TCP/IP 协议簇。后来,UDP 在 RFC 768(互联网工程任务协会,Internet Engineering Task Force, IETF,发布的一个标准文件)中发布,用于减少延迟、适应简单的请求或应答环境,如DNS(域名系统)。
        90年代后,TCP 持续优化拥塞控制算法(如Tahoe、Reno、CUBIC),在万兆与云计算场景中处于核心地位。而UDP则在实时音视频、VoIP(基于IP的语音传输,一种语音通话技术)、在线游戏等领域被广泛使用。

2. OSI 与 TCP/IP 模型中的定位

在这里插入图片描述
TCP/IP模型将传统的OSI理论模型简化为4层结构,传输层分为TCP/UDP两种机制。

3. 协议原理与关键机制

3.1 UDP

在这里插入图片描述
【注】

  • 源/目的端口: 标识进程级别的通信端点
  • 长度: 头部与数据总长度,最小8字节
  • 校验和: 包含伪首部,检验UDP头与数据的完整性

【机制】

  • 无握手: 发送即完成,无三次握手
  • 无重传: 丢包不重发、无拥塞控制,由上层应用决定策略。
  • 场景: 实时音视频、DNS查询等。实时性要求高,应用自有可靠机制或可忽略丢包。
3.2 TCP

在这里插入图片描述

【注】

  • 序列号 / 确认号: 实现可靠传输的核心,按字节计数流
  • Flags: URG,ACK,PSH,RST,SYN,FIN等,控制连接的建立,终止与数据推送。
  • 窗口大小: 流量控制的关键,接收方通告自己缓存区的剩余空间
  • 选项: 常见有最大报文段MSS、时间戳、窗口缩放等,用于性能优化。

【机制】

  • 三次握手(3-way Handshake):
       1. 客户端发送SYN,选择输出序列号x
       2. 服务端回应 SYN+ACK,确认号 x+1,并发送自己序列号 y
       3. 客户端再发 ACK 确认号 y+1,一切就绪

  • 四次挥手(4-way Teardown):
       1. 发起方发送 FIN。
       2. 对方 ACK。
       3. 对方再发 FIN。
       4. 原方 ACK,等待 TIME-WAIT 结束后真正释放。

  • 重传
    超时重传(RTO): 基于往返时间(RTT)估算,动态调整超时重传定时器。
    快速重传: 连续收到 3 个相同的ACK时,立即重传疑似丢失的报文段,而无需等待超时。

  • 拥塞控制算法
       1. 慢启动: 指数增长拥塞窗口(cwnd),直到达到阈值
       2. 拥塞避免: 加法增大,线性增长cwnd
       3. 快速重传与快速恢复: 检测到丢包后,一方面减小阈值,一方面快速恢复到阈值区。
       4. CUBIC(linux默认),BBR(Google提出)等

5. 实践:Socket 接口示例

下面以编程语言示例基础的TCP和UDP的服务端与客户端。

C语言
// UDP 客户端示例:初始化并发送
int sock = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in serv;
memset(&serv, 0, sizeof(serv));
serv.sin_family = AF_INET;
serv.sin_port = htons(9000);
serv.sin_addr.s_addr = inet_addr("127.0.0.1");
char *msg = "Hello UDP";
sendto(sock, msg, strlen(msg), 0, (struct sockaddr*)&serv, sizeof(serv));// TCP 服务器示例:接受连接并回复
int sock = socket(AF_INET, SOCK_STREAM, 0);
bind(sock, (struct sockaddr*)&serv, sizeof(serv));
listen(sock, 5);
int conn = accept(sock, NULL, NULL);
char buf[1024];
int len = recv(conn, buf, sizeof(buf), 0);
send(conn, "Hello TCP", 9, 0);
close(conn);
Go语言
// UDP Echo 服务器
addr, _ := net.ResolveUDPAddr("udp", ":9000")
conn, _ := net.ListenUDP("udp", addr)
buf := make([]byte, 1024)
for {n, remote, _ := conn.ReadFromUDP(buf)conn.WriteToUDP(buf[:n], remote)
}// TCP 客户端
conn, _ := net.Dial("tcp", "localhost:8000")
fmt.Fprintln(conn, "Hello TCP")
response, _ := bufio.NewReader(conn).ReadString('\n')
fmt.Println("Server replied:", response)
Python语言
# UDP 客户端
import socket
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp.sendto(b"Ping", ("localhost", 9000))
msg, _ = udp.recvfrom(1024)
print(msg)# TCP 服务器
import socket
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv.bind(("0.0.0.0", 8000))
srv.listen(1)
conn, addr = srv.accept()
data = conn.recv(1024)
conn.sendall(b"Hello TCP")
conn.close()

6. 调优

  1. TIME_WAIT消耗: 大量短连接会产生大量的TIME_WAIT,建议启动连接复用、长连接或HTTP/2多路复用。
  2. MTU与分片: 超大UDP报文易被分片丢弃,建议应用层自行分片与重组。
  3. Nagle算法: TCP默认启用Nagle,合并小包,可能会增加延迟,需要根据场景选择是否禁用。
  4. 内核缓冲区调整: 高带宽-时延环境下,增大send/recv缓冲区以避免吞吐瓶颈。
  5. 拥塞算法: Linux默认CUBIC,若要更低时延可使用BBR。

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

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

相关文章

HikariCP 可观测性最佳实践

HikariCP 介绍 HikariCP 是一个高性能、轻量级的 JDBC 连接池,由 Brett Wooldridge 开发。它以“光”命名,象征快速高效。它支持多种数据库,配置简单,通过字节码优化和智能管理,实现低延迟和高并发处理。它还具备自动…

Java SpringBoot 调用大模型 AI 构建智能应用实战指南

一、基础知识 (一)Java基础 Java是一种广泛使用的高级编程语言,具有简单、面向对象、分布式、解释型、健壮、安全、架构中立、可移植、高性能、多线程和动态等特点。在构建基于Spring Boot的AI应用之前,您需要具备扎实的Java基础…

电路图识图基础知识-降压启动(十五)

降压启动电动机控制电路 降压启动,是指启动时降低加在电动机定子绕组上的电压,待电动机启动起来后再将电压 恢复到额定值,使之运行在额定电压下。降压启动可以减小启动电流,从而减小线路电压降。 传统的降压启动包括定子串电阻或…

2025年大模型平台落地实践研究报告|附75页PDF文件下载

本报告旨在为各行业企业在建设落地大模型平台的过程中,提供有效的参考和指引,助力大模型更高效更有价值地规模化落地。本报告系统性梳理了大模型平台的发展背景、历程和现状,结合大模型平台的特点提出了具体的落地策略与路径,同时…

Docker慢慢学

1、Docker DeskTop 2、N8N下载 3、Kafka docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID1 -e KAFKA_ZOOKEEPER_CONNECTzookeeper:2181 -e KAFKA_ADVERTISED_LISTENERSPLAINTEXT://localhost:9092 -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR1 con…

Java 中创建线程主要有三种方式

在 Java 中,创建线程主要有三种方式,每种方式各有特点和适用场景。以下是详细说明和代码示例: 1. 继承 Thread 类 原理:自定义类继承 Thread 并重写 run() 方法,通过调用 start() 启动新线程。 特点:简单直…

ck-editor5的研究 (5):优化-页面离开时提醒保存,顺便了解一下 Editor的生命周期 和 6大编辑器类型

前言 经过前面的 4 篇内容,我们已经慢慢对 CKEditor5 熟悉起来了。这篇文章,我们就来做一个优化,顺便再补几个知识点: 当用户离开时页面时,提醒他保存数据了解一下 CKEditor5 的 六大编辑器类型了解一下 editor 实例对…

第42节:模型优化与部署:Web服务部署(Flask, FastAPI)

1. 引言 在现代人工智能和机器学习应用中,模型的开发只是整个流程的一部分。 将训练好的模型有效地部署为可访问的Web服务,使其能够处理实际请求并返回预测结果,是模型价值实现的关键环节。Python生态系统提供了多种轻量级Web框架,其中Flask和FastAPI是目前最受欢迎的选择…

LabVIEW超宽带紧凑场测量系统

采用 LabVIEW 开发超宽带紧凑场测量系统,实现天线方向图、目标雷达散射截面(RCS)及天线增益的自动化测量。通过品牌硬件设备,优化系统架构,解决传统测量系统在兼容性、数据处理效率及操作便捷性等方面的问题&#xff0…

vue2使用笔记、vue2和vue3的区别

文章目录 vue2和vue3的区别1. 实现数据响应式的原理不同2. 生命周期不同3. vue 2.0 采用了 option 选项式 API,vue 3.0 采用了 composition 组合式 API4. 新特性编译宏5. 父子组件间双向数据绑定 v-model 不同6. v-for 和 v-if 优先级不同7. 使用的 diff 算法不同8.…

CSS3美化页面元素

1. 字体 <span>标签 字体样式⭐ 字体类型&#xff08;font-family&#xff09; 字体大小&#xff08;font-size&#xff09; 字体风格&#xff08;font-style&#xff09; 字体粗细&#xff08;font-weight&#xff09; 字体属性&#xff08;font&#xff09; 2. 文本 文…

【笔记】Windows 下载并安装 ChromeDriver

以下是 在 Windows 上下载并安装 ChromeDriver 的笔记&#xff1a; ✅ Windows 下载并安装 ChromeDriver 1️⃣ 确认 Chrome 浏览器版本 打开 Chrome 浏览器 点击右上角 ︙ → 帮助 → 关于 Google Chrome 记下版本号&#xff0c;例如&#xff1a;114.0.5735.199 2️⃣ 下载…

工厂模式 vs 策略模式:设计模式中的 “创建者” 与 “决策者”

在日常工作里&#xff0c;需求变动或者新增功能是再常见不过的事情了。而面对这种情况时&#xff0c;那些耦合度较高的代码就会给我们带来不少麻烦&#xff0c;因为在这样的代码基础上添加新需求往往困难重重。为了保证系统的稳定性&#xff0c;我们在添加新需求时&#xff0c;…

Java web学习路径预览

Java web学习路径预览 &#xff08;图源&#xff1a;黑马程序员&#xff09; 目录 Java web学习路径预览 一、HTML、CSS、JS 1. HTML (HyperText Markup Language): 网页的骨架 2. CSS (Cascading Style Sheets): 网页的皮肤 3. JavaScript (JS): 网页的行为 二、Ajax、…

linux、docker、git相关操作

1 linux 1.1解压缩 1.1.1 zip zip xxx.zip file 把名为fle的文件压缩成xxx.zip -r 递归压缩&#xff1a;加上该选项才能压缩文件夹 zip -r example_new.zip 示例集 # 新建压缩包并命名为 example_new.zip zip -r xxx.zip file1 file2 dir1 将多个文件目录压成zip包 unzip fi…

Attention Is All You Need (Transformer) 以及Transformer pytorch实现

参考https://zhuanlan.zhihu.com/p/569527564 Attention Is All You Need (Transformer) 是当今深度学习初学者必读的一篇论文。 一. Attention Is All You Need (Transformer) 论文精读 1. 知识准备 机器翻译&#xff0c;就是将某种语言的一段文字翻译成另一段文字。 由…

深入浅出:Oracle 数据库 SQL 执行计划查看详解(1)——基础概念与查看方式

背景 在当今的软件开发领域&#xff0c;尽管主流开发模式往往倾向于采用单表模式&#xff0c;力图尽可能地减少表之间的连接操作&#xff0c;以期达到提高数据处理效率、简化应用逻辑等目的。然而&#xff0c;对于那些已经上线运行多年的运维老系统而言&#xff0c;它们内部往…

每天掌握一个Linux命令 - fail2ban

Linux 命令工具 fail2ban 使用指南 目录 Linux 命令工具 fail2ban 使用指南一、工具概述二、安装方式1. 包管理器安装&#xff08;推荐&#xff09;Debian/Ubuntu 系统CentOS/RHEL 系统Arch Linux 系统 2. 手动编译安装&#xff08;适用于自定义需求&#xff09; 三、核心功能四…

互联网大厂智能体平台体验笔记字节扣子罗盘、阿里云百炼、百度千帆 、腾讯元器、TI-ONE平台、云智能体开发平台

互联网大厂 字节扣子、阿里云百炼、百度千帆 、腾讯元器、TI-ONE平台、云智能体开发平台 体验 开始动手 了解 智能体&#xff0c;发现已经落后时代太远 光头部互联网大厂对开 公开的平台就已经这么多&#xff0c;可以学习和了解&#xff0c;相关的信息 整理了对应的平台地址…

ansible-playbook 进阶 接上一章内容

1.异常中断 做法1&#xff1a;强制正常 编写 nginx 的 playbook 文件 01-zuofa .yml - hosts : web remote_user : root tasks : - name : create new user user : name nginx-test system yes uid 82 shell / sbin / nologin - name : test new user shell : gete…