深入浅出TCP 与 UDP

简介: 深入浅出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凭借其快速、轻量的优势,在实时通信领域大放异彩。

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


🔐 相关链接

目录
相关文章
|
11天前
|
监控 网络协议 网络性能优化
不再困惑!一文搞懂TCP与UDP的所有区别
本文介绍网络基础中TCP与UDP的区别及其应用场景。TCP是面向连接、可靠传输的协议,适用于HTTP、FTP等需要保证数据完整性的场景;UDP是无连接、不可靠但速度快的协议,适合DNS、RIP等对实时性要求高的应用。文章通过对比两者在连接方式、可靠性、速度、流量控制和数据包大小等方面的差异,帮助读者理解其各自特点与适用场景。
|
21天前
|
存储 网络协议 安全
用于 syslog 收集的协议:TCP、UDP、RELP
系统日志是从Linux/Unix设备及网络设备生成的日志,可通过syslog服务器集中管理。日志传输支持UDP、TCP和RELP协议。UDP无连接且不可靠,不推荐使用;TCP可靠,常用于rsyslog和syslog-ng;RELP提供可靠传输和反向确认。集中管理日志有助于故障排除和安全审计,EventLog Analyzer等工具可自动收集、解析和分析日志。
|
2月前
|
网络协议 网络性能优化 数据处理
深入解析:TCP与UDP的核心技术差异
在网络通信的世界里,TCP(传输控制协议)和UDP(用户数据报协议)是两种核心的传输层协议,它们在确保数据传输的可靠性、效率和实时性方面扮演着不同的角色。本文将深入探讨这两种协议的技术差异,并探讨它们在不同应用场景下的适用性。
71 4
|
2月前
|
监控 网络协议 网络性能优化
网络通信的核心选择:TCP与UDP协议深度解析
在网络通信领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种基础且截然不同的传输层协议。它们各自的特点和适用场景对于网络工程师和开发者来说至关重要。本文将深入探讨TCP和UDP的核心区别,并分析它们在实际应用中的选择依据。
62 3
|
2月前
|
网络协议 算法 网络性能优化
|
2月前
|
网络协议 SEO
TCP连接管理与UDP协议IP协议与ethernet协议
TCP、UDP、IP和Ethernet协议是网络通信的基石,各自负责不同的功能和层次。TCP通过三次握手和四次挥手实现可靠的连接管理,适用于需要数据完整性的场景;UDP提供不可靠的传输服务,适用于低延迟要求的实时通信;IP协议负责数据包的寻址和路由,是网络层的重要协议;Ethernet协议定义了局域网的数据帧传输方式,广泛应用于局域网设备之间的通信。理解这些协议的工作原理和应用场景,有助于设计和维护高效可靠的网络系统。
47 4
|
2月前
|
缓存 负载均衡 网络协议
面试:TCP、UDP如何解决丢包问题
TCP、UDP如何解决丢包问题。TCP:基于数据块传输/数据分片、对失序数据包重新排序以及去重、流量控制(滑动窗口)、拥塞控制、自主重传ARQ;UDP:程序执行后马上开始监听、控制报文大小、每个分割块的长度小于MTU
|
3月前
|
网络协议 前端开发 物联网
TCP和UDP区别?
本文首发于微信公众号“前端徐徐”,详细介绍了TCP和UDP两种传输层协议的核心概念、连接性和握手过程、数据传输和可靠性、延迟和效率、应用场景及头部开销。TCP面向连接、可靠、有序,适用于网页浏览、文件传输等;UDP无连接、低延迟、高效,适用于实时音视频传输、在线游戏等。
74 1
TCP和UDP区别?
|
3月前
|
Web App开发 缓存 网络协议
不为人知的网络编程(十八):UDP比TCP高效?还真不一定!
熟悉网络编程的(尤其搞实时音视频聊天技术的)同学们都有个约定俗成的主观论调,一提起UDP和TCP,马上想到的是UDP没有TCP可靠,但UDP肯定比TCP高效。说到UDP比TCP高效,理由是什么呢?事实真是这样吗?跟着本文咱们一探究竟!
80 10
|
3月前
|
网络协议 网络性能优化 C#
C# 一分钟浅谈:UDP 与 TCP 协议区别
【10月更文挑战第8天】在网络编程中,传输层协议的选择对应用程序的性能和可靠性至关重要。本文介绍了 TCP 和 UDP 两种常用协议的基础概念、区别及应用场景,并通过 C# 代码示例详细说明了如何处理常见的问题和易错点。TCP 适用于需要可靠传输和顺序保证的场景,而 UDP 适用于对延迟敏感且可以容忍一定数据丢失的实时应用。
60 1