深入浅出TCP 与 UDP

在这里插入图片描述


🔥 引言

在互联网的广阔天地里,TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)作为传输层的两大支柱,各自承担着不同的使命。下面这篇文章将带你从基础到进阶,全面解析它们的特点、差异及应用场景,同时通过实战代码加深理解。📚


🌐 基础认知概览

💻 TCP - 稳健的信使 🛡️

TCP,一个面向连接的协议,就像是互联网世界里的忠诚邮递员,确保每一份数据都能安全、准确地送达目的地。

  • 握手 🤝:TCP连接建立前会通过三次握手确保双方准备就绪。
  • 可靠性 📡:提供数据确认、重传机制,确保数据完整无缺,顺序传输。
  • 流量控制 📉:通过滑动窗口机制调节数据发送速率,避免接收方过载。
  • 拥塞控制 🚦:动态调整数据发送量,缓解网络拥堵。
  • 应用场景 📁:适合文件传输、网页浏览等需要高度可靠性的场景。

🎭 UDP - 敏捷的使者 🏃‍♂️

UDP,一个无连接的协议,更像是一位奔跑的快递员,快速但不保证包裹的最终到达状态。

  • 快速传输 🚀:无需建立连接,直接发送数据包,降低延迟。
  • 轻量级 🪶:头部简单,减少网络传输的开销。
  • 不保证顺序和完整性 😵:数据可能丢失、乱序,但适用于对实时性要求高的场景。
  • 多播支持 📡:能够实现一对多的高效数据分发。
  • 应用场景 🎮:适用于视频会议、在线游戏、DNS查询等实时性优先的场景。

🧑‍💻 实战演练:代码示例

TCP 服务器与客户端 示例

服务器(Node.js)
const net = require('net');// 创建TCP服务器
const server = net.createServer((socket) => {// 每当有新的连接建立时,这个回调函数会被执行,socket代表与客户端的连接console.log('A client connected.');// 为这个socket(即与单个客户端的连接)添加'data'事件监听器socket.on('data', (data) => {// 当接收到客户端发送的数据时,这个事件被触发console.log(`Received: ${data}`);// 将接收到的数据原样回传给客户端socket.write(`Echo: ${data}`);});// 可以在这里添加更多的事件处理,比如处理连接结束('end')、错误('error')等
});// 使服务器开始监听指定端口(这里是3000端口)
server.listen(3000, () => {console.log('TCP Server listening on port 3000');// 这个回调函数在服务器开始监听后执行,打印一条消息表明服务器已启动并监听指定端口
});
客户端(Node.js)
const net = require('net');// 定义服务器的IP地址和端口号
const SERVER_HOST = 'localhost'; // 如果服务器与客户端在同一台机器上,可以使用localhost或127.0.0.1
const SERVER_PORT = 3000; // 确保这个端口号与TCP服务器监听的端口一致// 创建一个新的TCP客户端Socket实例
const client = new net.Socket();// 连接到指定的服务器和端口
client.connect(SERVER_PORT, SERVER_HOST, () => {// 连接成功后的回调函数console.log('Connected to server'); // 打印提示信息,表明已成功连接到服务器// 定义要发送给服务器的消息const message = 'Hello, TCP Server!';// 使用write方法将消息发送给服务器client.write(message); // 实际发送消息// 可选:监听'data'事件以接收服务器的响应client.on('data', (data) => {console.log('Received:', data.toString()); // 接收到服务器数据时打印出来// client.end(); // 可以在此处选择关闭连接,根据实际应用需求决定});// 监听'end'事件,当连接结束时触发client.on('end', () => {console.log('Connection closed'); // 打印提示信息,表示连接已关闭});// 监听'error'事件,处理连接或数据传输过程中的错误client.on('error', (err) => {console.error('Error:', err); // 打印错误信息client.destroy(); // 遇到错误时关闭Socket,释放资源});
});

UDP 服务器与客户端 示例

服务器(Node.js)
// 导入Node.js的dgram模块,用于创建UDP通信的socket
const dgram = require('dgram');// 使用dgram模块创建一个UDP服务器socket,指定使用IPv4协议
const server = dgram.createSocket('udp4');// 为UDP服务器socket添加'message'事件监听器
// 当有UDP数据包从客户端发送到服务器时,该事件被触发
server.on('message', (msg, rinfo) => {// msg参数是接收到的数据内容,rinfo是一个对象,包含发送方的信息// rinfo.address是发送方的IP地址,rinfo.port是发送方的端口号// 打印接收到的消息内容及发送方的地址和端口信息console.log(`UDP message: ${msg} from ${rinfo.address}:${rinfo.port}`);
});// 让UDP服务器socket开始监听指定端口(这里是4000端口)
// 第二个参数是回调函数,当服务器开始监听后执行
server.bind(4000, () => {// 打印日志,表明UDP服务器已在指定端口成功启动并开始监听console.log('UDP Server listening on port 4000');
});
客户端(Node.js)
// 导入dgram模块,这是Node.js中用于创建UDP Socket的模块
const dgram = require('dgram');// 创建一个UDP客户端Socket,指定使用IPv4协议
const client = dgram.createSocket('udp4');// 使用客户端Socket发送消息到指定的服务器
// 参数分别是:要发送的数据(必须是Buffer或字符串)、服务器端口号、服务器地址、回调函数处理错误
client.send('Hello, UDP Server!', 4000, 'localhost', (err) => {// 如果发送过程中发生错误,则抛出异常if (err) throw err;// 打印日志,表明消息已成功发送console.log('UDP message sent');
});// 为客户端Socket添加'message'事件监听器,用于接收服务器的响应
client.on('message', (msg, rinfo) => {// 打印接收到的消息内容以及发送方的地址和端口console.log(`UDP response: ${msg} from ${rinfo.address}:${rinfo.port}`);
});// 监听'listening'事件,当客户端Socket准备好接收数据时触发
// (注意:UDP客户端通常不直接监听,此段代码更多是演示,实际中UDP客户端不需监听listening事件)
client.on('listening', () => {// 获取客户端Socket的地址信息const address = client.address();// 打印客户端的监听地址和端口,尽管UDP客户端不真正“监听”,此处逻辑更多是概念演示console.log(`UDP Client listening on ${address.address}:${address.port}`);
});

📈 总结

TCPUDP各有千秋,TCP以其可靠性成为大多数需要确保数据安全传输场景的首选,而UDP凭借其快速、轻量的优势,在实时通信领域大放异彩。

选择合适协议的关键在于理解应用的具体需求:是追求数据的准确无误,还是强调速度与实时性?希望这篇笔记能帮助你在未来的开发之旅中,更加自信地驾驭这两种强大的工具。🚀


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

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

相关文章

什么是 Java 集合,Java 集合有几类?

Java集合(Java Collections)是Java编程语言中一组用于存储和操作数据的框架。它提供了一种便捷的方式来管理和操作数据集合,无论是数组还是其他数据结构。Java集合框架被设计为通用的、可扩展的,并且具有高性能。它为开发人员提供…

a-table导出excel.xlsx文件,含合并表头处理

1、安装 npm install xlsx // 0.15.62、封装tableExport.js import {utils, writeFile } from xlsxexport function tableExport(tableDom, name) {const dom = document.querySelector(.ant-table-fixed-left);const parentDom = dom.parentNodeparentDom?.removeChild(d…

Windows如何启动和停止etw事件监听

Windows如何启动和停止etw事件监听 关于Etw ETW是Event Tracing for Windows的简称,它是Windows提供的原生的事件跟踪日志系统。由于采用内核(Kernel)层面的缓冲和日志记录机制,所以ETW提供了一种非常高效的事件跟踪日志解决方案…

查表法处理sin,cos,tan函数-360到360度的值

1、把处理函数放到sincostan.h头文件中 /*********************************公式计算********************************/ /* 1.诱导公式 sin(-a)-sin(a) cos(-a)cos(a) sin(π2-a)cos(a) cos(π2-a)sin(a) sin(π2a)cos(a) cos(π2a)-sin(a) sin(π-a)sin(a) cos(π-a)-cos(a)…

解决Linux CentOS 7安装了vim编辑器却vim编辑器不起作用、无任何反应

文章目录 前言一、解决vim不起作用(卸载重新安装)1.重新安装vim2.测试vim是否能正常使用 二、解决vim: error while loading shared libraries: /lib64/libgpm.so.2: file too short报错三、解决vim编辑器不能使用方向键和退格键问题 remove vim-common …

线上线下收银一体化,新零售POS系统引领连锁门店数字化转型-亿发

在市场竞争日益激烈的背景下,没有哪个商家能够永远屹立不倒。随着互联网技术的快速发展,传统的线下门店面临着来自电商和新零售的新型挑战。实体零售和传统电商都需要进行变革,都需要实现线上线下的融合。 传统零售在客户消费之后就与商家失…

Java 为什么设计成 “String” 不能用 “==” 比较值?

Java中的String是一种特殊的对象类型,用于表示字符串。在Java中,String对象的创建和比较是一个重要的话题,其中,操作符在比较String对象时有着特殊的行为。为了了解Java为什么设计成String不能用比较值,需要深入探讨Ja…

数据结构八:线性表之循环队列的设计

上篇博客,学习了栈,我们可以知道他也是一种线性表,遵从先进后出的原则,在本节,我们进一步学习另一种线性表—队列。就像饭堂里排队打饭的的队伍,作为一种先进先出的线性表,他又有哪些特别之处呢…

公网ip申请ssl仅260

现在很多网站都已经绑定域名,因此使用的都是域名SSL证书保护网站传输信息安全,而没有绑定域名只有公网IP地址的网站想要保护传输信息安全就要申请IP SSL证书。IP SSL证书也是由正规CA认证机构颁发的数字证书,用来保护用户的隐私以及数据安全&…

FLUKE万用表17B+的电压档最大内阻

项目中遇到一个测量兆欧级别电阻两端电压的问题,发现按照上图中的电路搭建出来的电路测得的电压为8.25V左右,按理说应为9V才对,后来想到万用表测量电压档不同的档位会有不同内阻,测量的电阻应远小于万用表电压档内阻才有效。本次测…

Creo Assembly “Save As“时,为什么关联的Drawing无法Save As

问题描述: Creo Assembly 进行“另存为”,勾选了“Copy Drawings”。但操作结果是,该Assembly相关联的Drawing没有被“另存为”。 原因分析: 查看Workspace,发现该Assembly a.asm相关联的Drawing为b.drw&#xff0…

【软测学习笔记】Linux入门Day02

🌟博主主页:我是一只海绵派大星 📚专栏分类:软件测试笔记 📚参考教程:黑马教程❤️感谢大家点赞👍收藏⭐评论✍️ 目录 1、history 查看历史命令 2、ln 链接 3、grep 查找文件内容 4、find …

帕金森患者锻炼的小妙招

亲爱的读者朋友们,大家好!在这个阳光明媚的一天,我们要和大家分享一份特别的健康礼赞——专为帕金森患者量身定制的锻炼方案。让我们一起走进帕金森患者的世界,了解他们如何通过科学的锻炼方法,改善身体状况&#xff0…

【前端】表格合并如何实现?

简言 介绍实现表格合并的一种方法。 表格合并 表格合并操作是一个比较复杂的操作,它主要分为以下步骤: 获取选中区域选择合并显示的单元格实现合并操作。 我们就逐一实现这三步,最后实现一个较完整的合并操作。(不考虑边界情…

区块链交易所开发

在当今数字化时代,区块链技术以其独特的去中心化、安全性和透明性,正在逐步改变我们的生活。其中,区块链交易所作为连接区块链技术与广大投资者的桥梁,其开发与发展备受关注。本文将从技术进步与市场需求两个维度,探讨…

【Jenkins】持续集成与交付 (八):Jenkins凭证管理(实现使用 SSH 、HTTP克隆Gitlab代码)

🟣【Jenkins】持续集成与交付 (八):Jenkins凭证管理(实现使用 SSH 、HTTP克隆Gitlab代码) 1、安装Credentials Binding、git插件2、凭证类型及用途3、(用户名和密码类型)凭证的添加和使用3.1 用户密码类型3.2 测试凭证是否可用3.3 开始构建项目3.3 查看结果(进入Jenk…

mySQL商城项目实战 (终)(全部表)(1-88张)

本章无sql语句,直接放转出的sql文件。 88张表结果如图! 资源在已经与文章绑定, 在navicat工具中,执行以下步骤 在新建的数据库中右键,点击【运行sql文件】,运行绑定的资源,之后您就可以在您的navicat中看到我建好的8…

Django orm高级用法以及查询优化

基础查询 #全表查询 Author.objects.all() #<QuerySet [<Author: Author object (4)>, <Author: Author object (1)>, <Author: Author object (10)>, <Author: Author object (8)>, <Author: Author object (5)>, <Author: Author objec…

Kafka 3.x.x 入门到精通(08)——对标尚硅谷Kafka教程

Kafka 3.x.x 入门到精通&#xff08;08&#xff09;——对标尚硅谷Kafka教程 5. Kafka优化5.1 资源配置5.1.1 操作系统5.1.2 磁盘选择5.1.3 网络带宽5.1.4 内存配置5.1.5 CPU选择 5.2 集群容错5.2.1 副本分配策略5.2.2 故障转移方案5.2.3 数据备份与恢复 5.3 参数配置优化5.4 数…

【c++】mutable是一个关键字,用于指定一个类成员可以在一个const成员函数中被修改。

mutable是一个关键字,用于指定一个类成员可以在一个const成员函数中被修改。通常,当一个成员函数被声明为const时,这意味着这个函数不能修改它所属的对象。然而,有时候你可能需要在一个const成员函数中修改某个成员变量。这时,你就可以使用mutable关键字。webrtc的StunReq…