深入浅出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.hqwc.cn/news/659614.html

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

相关文章

让大模型prompt生成Mermaid流程图

生成内容、总结文章让大模型Mermaid流程图展示: mermaid 美人鱼, 是一个类似 markdown,用文本语法来描述文档图形(流程图、 时序图、甘特图)的工具,您可以在文档中嵌入一段 mermaid 文本来生成 SVG 形式的图形 kimi效果示例: 使用…

常用工具网站

代码生成器: SQL转Java代码生成器 | 不求人导航SQL转Java代码生成器https://codegen.bqrdh.com/

49. 【Android教程】HTTP 使用详解

在你浏览互联网的时候,绝大多数的数据都是通过 HTTP 协议获取到的,也就是说如果你想要实现一个能上网的 App,那么就一定会和 HTTP 打上交道。当然 Android 发展到现在这么多年,已经有很多非常好用,功能非常完善的网络框…

[1671]jsp教材管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 教材管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

【漏洞复现】zookeeper AdminServer 未授权访问漏洞

0x01 产品简介 ZooKeeper 是一个集中式服务,用于维护配置信息、命名、提供分布式同步和提供组服务。ZooKeeper的AdminServer是其管理界面的一部分,通常用于监控ZooKeeper集群的状态和执行一些管理操作。AdminServer提供了Web-based的管理和监控功能&…

# 使用 spring boot 时,@Autowired 注解 自动装配注入时,变量报红解决方法:

使用 spring boot 时,Autowired 注解 自动装配注入时,变量报红解决方法: 1、使用 Resource 代替 Autowired 注解,根据类型注入改为根据名称注入(建议)。 2、在 XXXMapper 上添加 Repository 注解&#xff0…

使用预训练模型构建自己的深度学习模型(迁移学习)

在深度学习的实际应用中,很少会去从头训练一个网络,尤其是当没有大量数据的时候。即便拥有大量数据,从头训练一个网络也很耗时,因为在大数据集上所构建的网络通常模型参数量很大,训练成本大。所以在构建深度学习应用时…

Java字符缓冲区

字符缓冲区是在计算机编程中非常重要的一种数据结构,它主要用于存储和高效地操作字符序列。 在 Java 中,StringBuffer类就是典型的字符缓冲区实现。与String类不同,StringBuffer具有动态可变性,这意味着我们可以在原有的字符序列…

「玻尔曾孙」领衔!超辐射原子,重塑全球精准测时——

超辐射原子能够帮助我们以前所未有的精度测量时间。在哥本哈根大学最近的一项研究中,研究人员开发了一种新的测量时间间隔(秒)的方法,这种方法克服了目前最先进原子钟面临的一些限制。 这一成就有望在多个领域产生深远影响&#x…

Laravel 框架请求生命周期

Laravel 框架请求的生命周期 目录 请求图示 说明 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ 请求图示 说明 ① 所有的请求都是经Web 服务器(Apache/Nginx)配置引导到Laravel 应用的入口public/index.php文件。index.php 加载框架其它部分。 如下图&#xff…

3D看车有哪些强大的功能?适合哪些企业使用?

3D看车是一种创新的汽车展示方式,它提供了许多强大的功能,特别适合汽车行业的企业使用。 3D看车可实现哪些功能? 1、细节展示: 51建模网提供全套汽车行业3D数字化解决方案,3D看车能够将汽车展示得更加栩栩如生&…

硬盘清空了还能恢复吗?一文揭晓正确答案!

“使用电脑时误操作把电脑硬盘清空了,这可怎么办?还有机会恢复里面的数据吗?希望大家帮帮我!” 在日常使用电脑的过程中,硬盘清空是一个可能遇到的问题。一旦硬盘被清空,可能会给用户带来极大的困扰。那么,…