本文介绍: User Datagram Protocol,简称 UDP ,又称用户数据报协议和 TCP 一样,位于网络传输层用于处理数据包UDP 最大的特点是无连接UDP 传输速度快UDP 数据传输可靠不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的可靠性应用层负责支持一对一通信,也支持一对通信许多关键互联网应用程序使用 UDP如 DNS 域名系统服务、TFTP 简单文件传输协议、DHCP 动态主机设置协议 等。

Node.js 网络通信(二)02-构建UDP服务——UDP简介 & UDP三种传播方式-单播、广播、组播 & UDP一对通信场景 & dgram模块用于构建UDP服务之Socket方法事件

第3章 构建 UDP 服务

在这里插入图片描述

内容安排:

UDP 简介

TCP 和 UDP

在这里插入图片描述

TCP和UDP: 都是数据传输方式的协议.比如说我要给你钱, 我是以手把手的方式拿给你呢还是快递的方式寄给你呢.

UDP TCP
连接 连接 面向连接
速度 无需建立连接速度较快 需要建立连接,速度较慢
目的主机 一对一,一对 仅能一对
带宽 UDP 报头较短,消耗带宽更少 消耗更多的带宽
消息边界
可靠性
顺序 无序 有序

注:事实上,UDP协议的这种乱序性基本上很少出现,通常只会在网络非常拥挤的情况下才有可能发生。

什么时候用 TCP,什么时候用 UDP?

UDP 的三种传播方式

1、UDP 单播

在这里插入图片描述

2、UDP 广播

在这里插入图片描述

3、UDP 组播

在这里插入图片描述

UDP 一对通信场景

单播传输(Unicast):在发送者和每一接收者之间实现点对点网络连接。如果一台发送者同时给多个接收者传输相同的数据,也必须相应的复制多份的相同数据包。如果有大量主机希望获得数据包的同一份拷贝时,将导致发送者负担沉重、延迟长、网络拥塞;为保证一定的服务质量需增加硬件带宽

广播(Broadcast):是指在IP子网广播数据包,所有在子网内部主机都将收到这些数据包。广播意味着网络向子网一个主机投递一份数据包,不论这些主机是否乐于接收该数据包。所以广播的使用范围非常小,只在本地子网有效通过路由器网络设备控制广播传输。在网络中的应用较多,如客户机通过DHCP自动获得IP地址的过程就是通过广播来实现的。但是与单播和多播相比,广播几乎占用子网内网络的所有带宽

组播:组播解决单播和广播方式效率低的问题。当网络中的某些用户需求特定信息时,组播源(即组播信息发送者)仅发送一次信息,组播路由器借助组播路由协议为组播数据包建立树型路由,被传递信息在尽可能远的分叉路口才开始复制分发网上视频会议网上视频点播特别适合采用多播方式。

1、单播面对 “一对多”

在这里插入图片描述

2、广播面对 “一对多”

在这里插入图片描述

3、组播面对 “一对多”

在这里插入图片描述

Node 中的 dgram 模块

Node我们提供了 dgram 模块用于构建 UDP 服务。

使用该模块创建 UDP 套接字非常简单,UDP 套接字一旦创建,既可以作为客户端发送数据,也可以作为服务器接收数据。

const dgram = require('dgram')
const socket = dgram.createSocket('udp4')

Socket 方法

API 说明
bind() 绑定端口和主机
address() 返回 Socket 地址对象
close() 关闭 Socket 并停止监听
send() 发送消息
addMembership() 添加组播成员
dropMembership() 删除组播成员
setBroadcast() 设置是否启动广播
setTTL() 设置数据报生存时间
setMulticastTTL() 设置组播数据报生存时间

Socket 事件

API 说明
listening 监听成功触发,仅触发一次
message 收到消息触发
error 发生错误触发
close 关闭 Socket 时触发

使用 Node 实现 UDP 单播

服务端

const dgram = require('dgram')

const server = dgram.createSocket('udp4')

server.on('listening', () => {
  const address = server.address()
  console.log(`server running ${address.address}:${address.port}`)
})

server.on('message', (msg, remoteInfo) => {
  console.log(`server got ${msg} from ${remoteInfo.address}:${remoteInfo.port}`)
  server.send('world', remoteInfo.port, remoteInfo.address)
})

server.on('error', err => {
  console.log('server error', err)
})

server.bind(3000)

客户端

const dgram = require('dgram')

const client = dgram.createSocket('udp4')

// client.send('hello', 3000, 'localhost')

client.on('listening', () => {
  const address = client.address()
  console.log(`client running ${address.address}:${address.port}`)

  client.send('hello', 3000, 'localhost')
})

client.on('message', (msg, remoteInfo) => {
  console.log(`client got ${msg} from ${remoteInfo.address}:${remoteInfo.port}`)
})

client.on('error', err => {
  console.log('client error', err)
})

client.bind(8000)

使用 Node 实现 UDP 广播

服务端

const dgram = require('dgram')

const server = dgram.createSocket('udp4')

server.on('listening', () => {
  const address = server.address()
  
  console.log(`server running ${address.address}:${address.port}`)
  
  server.setBroadcast(true) // 开启广播模式
  
  server.send('hello', 8000, '255.255.255.255')

  // 每隔2秒发送一条广播消息
  setInterval(function () {
    // 直接地址 192.168.10.255
    // 受限地址 255.255.255.255
    server.send('hello', 8000, '192.168.10.255')
    // server.send('hello', 8000, '255.255.255.255')
  }, 2000)
})

server.on('message', (msg, remoteInfo) => {
  console.log(`server got ${msg} from ${remoteInfo.address}:${remoteInfo.port}`)
  server.send('world', remoteInfo.port, remoteInfo.address)
})

server.on('error', err => {
  console.log('server error', err)
})

server.bind(3000)

客户端

const dgram = require('dgram')

const client = dgram.createSocket('udp4')

client.on('message', (msg, remoteInfo) => {
  console.log(`client got ${msg} from ${remoteInfo.address}:${remoteInfo.port}`)
})

client.on('error', err => {
  console.log('client error', err)
})

client.bind(8000)

使用 Node 实现 UDP 组播

服务端

const dgram = require('dgram')

const server = dgram.createSocket('udp4')

server.on('listening', () => {
  const address = server.address()
  setInterval(function () {
    server.send('hello', 8000, '224.0.1.100')
  }, 2000)
})

server.on('message', (msg, remoteInfo) => {
  console.log(`server got ${msg} from ${remoteInfo.address}:${remoteInfo.port}`)
  server.send('world', remoteInfo.port, remoteInfo.address)
})

server.on('error', err => {
  console.log('server error', err)
})

server.bind(3000)

客户端

const dgram = require('dgram')

const client = dgram.createSocket('udp4')

client.on('listening', () => {
  const address = client.address()
  console.log(`client running ${address.address}:${address.port}`)

  client.addMembership('224.0.1.100')
})

client.on('message', (msg, remoteInfo) => {
  console.log(`client got ${msg} from ${remoteInfo.address}:${remoteInfo.port}`)
})

client.on('error', err => {
  console.log('client error', err)
})

client.bind(8000)

原文地址:https://blog.csdn.net/weixin_44867717/article/details/131218933

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_50284.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注