UDP 与 TCP 调用接口的差异:面试高频问题解析与实战总结

news2025/6/9 5:16:31

在日常开发中,我们经常使用封装良好的 TCP 协议栈,比如 HTTP 客户端、Moudou 网络库等,因此很少从“裸 API”角度深入了解 TCP 和 UDP 的套接字调用流程。但在一些系统底层开发或者网络编程面试中,常被问到“TCP 和 UDP 的调用流程差异”,本文旨在通过对比这两种协议的套接字接口(Socket API),帮助我们从实战角度梳理其区别,提升面试应对能力。


一、TCP 与 UDP 套接字调用流程对比

操作步骤TCP(面向连接)UDP(无连接)
创建套接字socket()socket()
绑定地址bind()(可选,客户端通常不显式绑定)bind()(服务端通常绑定)
监听连接listen()❌(UDP 无需监听)
接收连接accept()❌(UDP 无连接,无 accept)
连接远端connect()(客户端调用)可选:可 connect(),也可不调用
发送数据send() / write()(仅在连接建立后)sendto()(需提供目标地址)或 send()(已 connect)
接收数据recv() / read()recvfrom()recv()(已 connect)
关闭连接close()close()

二、UDP 缺失的接口详解

UDP 相较于 TCP,缺失了“面向连接”的一整套接口调用,如下:

  1. listen()

    • 作用于 TCP:监听某个端口,等待连接请求。

    • UDP 无需监听,因为它是无连接的,每个到来的报文可以直接接收。

  2. accept()

    • TCP 使用该函数从监听队列中取出一个已连接的 socket。

    • UDP 不存在连接队列,自然也不需要 accept。

  3. write() / send()(仅用于连接套接字)

    • TCP 必须经过 connect/accept 建立连接后才能使用。

    • UDP 如果未使用 connect(),不能直接调用 send,需使用 sendto()


三、UDP 特有或灵活的接口行为

虽然接口上“缺失”了一些 TCP 所需的调用,但 UDP 也有自己灵活之处:

  • sendto() / recvfrom()

    • 适用于无需绑定连接的场景,每次传输都指定对端地址,灵活应对多客户端。

  • connect() 可选

    • UDP 虽是无连接,但也可以调用 connect()设定默认目标地址,之后就可以使用 send()/recv(),系统会隐式丢弃来自其他地址的包。

    • 好处是调用时简洁,提高效率。

  • 适合广播、多播

    • TCP 无法进行广播/多播;UDP 支持通过 setsockopt() 开启广播、配置多播组。


四、开发者常见误区与面试提醒

1. “UDP 无需 bind()?”

  • ❌错。UDP 服务端一般需要 bind(),否则不会接收到数据。

2. “UDP 无状态就不能使用 connect()?”

  • ❌错。UDP 的 connect() 只是设定目标地址,并非建立真正连接。

3. “UDP 更简单”?

  • ✅接口流程确实更短,但开发者需自行处理会话管理、数据可靠性、顺序等问题。


五、代码对比示例

TCP 服务器伪代码(C 风格)

int listenfd = socket(AF_INET, SOCK_STREAM, 0);
bind(listenfd, ...);
listen(listenfd, SOMAXCONN);
int connfd = accept(listenfd, ...);
recv(connfd, ...);
send(connfd, ...);
close(connfd);

UDP 服务器伪代码

int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
bind(sockfd, ...);
recvfrom(sockfd, buffer, ..., &client_addr, ...);
sendto(sockfd, buffer, ..., &client_addr, ...);

六、适用场景差异总结

协议特点适用场景
TCP面向连接、可靠、顺序、流式Web服务、大文件传输
UDP无连接、不保证可靠和顺序、报文式DNS、音视频流、游戏、IoT、广播

七、总结

  • TCP 多了一整套连接管理接口(listen/accept),适合需要可靠性和状态跟踪的场景;

  • UDP 接口简洁,但开发者需额外处理可靠性逻辑

  • 面试时建议从接口流程图和代码对比角度进行讲解,配合典型场景举例,能快速展示掌握深度。


如果你也有从封装库转向裸 socket 编程的需求,或者想强化网络编程基础,理解这些基础接口的区别会对你帮助巨大。

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

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

相关文章

AI时代:学习永不嫌晚,语言多元共存

最近看到两个关于AI的两个问题,“现在开始学习AI,是不是为时已晚?”、“AI出现以后,翻译几乎已到末路,那么,随着时代的进步,中文会一统全球吗?” 联想到自己正在做的“万能AI盒”小程…

行为型设计模式之Mediator(中介者)

行为型设计模式之Mediator(中介者) 1)意图 用一个中介对象来封装一系列的对象的交互。中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 2)结构 其中&#xff…

三维图形、地理空间、激光点云渲染技术术语解析笔记

三维图形、地理空间、激光点云渲染技术术语解析笔记 code review! 文章目录 三维图形、地理空间、激光点云渲染技术术语解析笔记1. Minecraft风格的方块渲染2. Meshing(网格化)3. Mipmapping(多级纹理映射)4. Marching Cubes&…

从webrtc到janus简介

1.基础知识 1.1 信令的基础知识 在 WebRTC(Web Real-Time Communication) 中,信令(Signaling) 是实现浏览器之间实时通信的关键机制,负责在通信双方(或多方)之间传递控制信息&…

JVM 核心概念深度解析

最近正在复习Java八股,所以会将一些热门的八股问题,结合ai与自身理解写成博客便于记忆 一、JVM内存结构/运行时数据区 JVM运行时数据区主要分为以下几个部分: 程序计数器(PC Register) 线程私有,记录当前线程执行的字节码行号唯…

api将token设置为环境变量

右上角 可以新增或者是修改当前的环境 环境变量增加一个token,云端值和本地值可以不用写 在返回token的接口里设置后执行操作,通常是登录的接口 右侧也有方法提示 //设置环境变量 apt.environment.set("token", response.json.data.token); 在需要传t…

SIFT算法详细原理与应用

SIFT算法详细原理与应用 1 SIFT算法由来 1.1 什么是 SIFT? SIFT,全称为 Scale-Invariant Feature Transform(尺度不变特征变换),是一种用于图像特征检测和描述的经典算法。它通过提取图像中的局部关键点,…

AlphaDrive:通过强化学习和推理释放自动驾驶中 VLM 的力量

AlphaDrive: Unleashing the Power of VLMs in Autonomous Driving via Reinforcement Learning and Reasoning 25年3月来自华中科技大学和地平线的论文 OpenAI 的 o1 和 DeepSeek R1 在数学和科学等复杂领域达到甚至超越了人类专家水平,其中强化学习(R…

【八股消消乐】如何解决SQL线上死锁事故

😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本专栏《八股消消乐》旨在记录个人所背的八股文,包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点&#xff…

如何使用 HTML、CSS 和 JavaScript 随机更改图片颜色

原文:如何使用 HTML、CSS 和 JavaScript 随机更改图片颜色 | w3cschool笔记 (请勿标记为付费!!!!) 在网页开发中,为图片添加动态效果可以显著提升用户体验。今天,我将向…

CAN通信收发测试(USB2CAN模块测试实验)

1.搭建测试环境 电脑:安装 USB 驱动,安装原厂调试工具,安装cangaroo(参考安装包的入门教程即可) USB驱动路径:~\CAN分析仪资料20230701_Linux\硬件驱动程序 原厂调试工具路径:~\CAN分析仪资料2…

OSCP备战-BSides-Vancouver-2018-Workshop靶机详细步骤

一、靶机介绍 靶机地址:https://www.vulnhub.com/entry/bsides-vancouver-2018-workshop%2C231/ 靶机难度:中级(CTF) 靶机发布日期:2018年3月21日 靶机描述: Boot2root挑战旨在创建一个安全的环境&…

PDF转Markdown/JSON软件MinerU最新1.3.12版整合包下载

MinerU发布至今我已经更新多版整合包了,5天前MinerU发布了第一个正式版1.0.1,并且看到在18小时之前有更新模型文件,我就做了个最新版的一键启动整合包。 2025年02月21日更新v1.1.0版整合包 2025年02月27日更新v1.2.0版整合包 2025-06-05 更…

【深入学习Linux】System V共享内存

目录 前言 一、共享内存是什么? 共享内存实现原理 共享内存细节理解 二、接口认识 1.shmget函数——申请共享内存 2.ftok函数——生成key值 再次理解ftok和shmget 1)key与shmid的区别与联系 2)再理解key 3)通过指令查看/释放系统中…

编程基础:执行流

能帮到你的话,就给个赞吧 😘 文章目录 执行流同步:顺序执行,只有一个执行流异步:新开后台(次)执行流,后台执行流要确保不能影响主执行流。共有两个执行流。 阻塞:任务阻塞执行流,导致…

理解非结构化文档:将 Reducto 解析与 Elasticsearch 结合使用

作者:来自 Elastic Adel Wu 演示如何将 Reducto 的文档处理与 Elasticsearch 集成以实现语义搜索。 Elasticsearch 与业界领先的生成式 AI 工具和提供商有原生集成。欢迎观看我们的网络研讨会,了解如何超越 RAG 基础,或使用 Elastic 向量数据…

[面试精选] 0094. 二叉树的中序遍历

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 94. 二叉树的中序遍历 - 力扣(LeetCode) 2. 题目描述 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 3. 题目示例 示例 1 : 输入&…

学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1]

学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1] 学习机器学习,需要学习如何预处理原始数据,这里用到pandas,将原始数据转换为张量格式的数据。 1、安装pandas pip install pandas 2、写入和读取数据 >>创建一个人工…

2025年6月6日第一轮

2025年6月6日 The rapid in Chiese industdy is developnig e,and it is From be in a enjoy a deep is developing The drone industry in China is developing The drone industy in china develops rapidly and is in a leading position in in the world. The dro…

12-Oracle 23ai Vector 使用ONNX模型生成向量嵌入

一、Oracle 23ai Vector Embeddings 核心概念​ 向量嵌入(Vector Embeddings)​​ -- 将非结构化数据(文本/图像)转换为数值向量 - - 捕获数据的语义含义而非原始内容 - 示例:"数据库" → [0.24, -0.78, 0.5…