当前位置: 首页 > news >正文

[网络协议篇] UDP协议

文章目录

  • 1. 简介
  • 2. 特点
  • 3. UDP数据报结构
  • 4. 基于UDP的应用层协议
  • 5. UDP安全性问题
  • 6. 使用udp传输数据的系统就一定不可靠吗?
  • 7. 基于UDP的主机探活 python实现

1. 简介

User Datagram Protocol,用户数据报协议,基于IP协议提供面向无连接的网络通信服务。特点:简单不可靠面向数据报。 UDP协议位于ISO网络模型的传输层

2. 特点

特点解释:

  • 无连接: 两台主机在使用UDP进行数据传输时,不需要建立连接,只需要知道对方端的IP和端口号即可把数据发送过去。
  • 不可靠:UDP协议没有确认重传机制,如果因为网络故障导致报文无法发到对方,或者对方接收到了报文,但是传输过程中乱序了,对方检验失败后把乱序的包丢了,UDP协议层也不给应用层任何错误反馈信息。
  • 面向数据报:以数据报文为单位一个个发出去,然后一个个接收的,导致上面的应用层无法灵活控制数据的读写次数和数量。

3. UDP数据报结构

image.png

  • 源端口号: 发送方的端口,用于唯一确认发送方主机的一个进程。 大小范围1-65535
  • 目的端口: 接收方的端口,用于唯一确认接收方主机的一个进程。大小范围1-65535
  • UDP长度:一个UDP报文所能传输的最大长度是64K,包含UDP首部。
  • UDP校验和: 为了确保数据包在传送过程中,数据检测数据是否被篡改和丢失的一种手段。通过二进制补码求和进行校验,校验和的内容包括:
    • 伪首部(IP数据包的一部分):源IP地址(32位),目的IP地址(32位),保留字段(8位, 0), 协议号(8位, 指定为17,代表udp)UDP长度(16) UDP数据报的总长度,包括头部和数据
    • UDP首部:源端口号、目的端口号、长度字段、校验和字段(初始值为0)
    • UDP数据: 实际传输的应用层数据。

端口和应用程序的关系: 1. 主机运行的一个进程可以绑定多个端口号。2.一个主机的某一个端口只能被一个进程所绑定。 可以推导出一个主机上的端口可以唯一确认主机上的一个进程,

4. 基于UDP的应用层协议

  • DNS协议: 域名解析协议, 域名 => IP.
  • DHCP协议:动态主机配置协议, 为设备动态分配IP地址、网关、DNS服务器等网络参数。
  • NTP协议: 用于同步网络中的设备时钟。
  • SNMP协议: 用于网络设置的监控和管理,如路由器、交换机等。
  • RIP协议: 路由信息协议,是一种距离向量路由协议,用于在网络设备间交换路由信息。

上述协议的几个明显的特点:

  • 传输数据一般都比较小。
  • 对速度要求较高,延迟时间低
  • 不需要或者无法进行连接.(例如dhcp初次启动时,设备根本就没有ip地址)
  • 由于网络问题丢失数据也不会非常严重,重新发起请求即可。

如果实际开发需求中,如果你的需求任务满足上述几种要求时,可以考虑使用udp去实现。

5. UDP安全性问题

  • 易受攻击性问题(微造身份):udp本身是无连接的,数据包在发送之前不需要建立连接,攻击者可以轻易伪造源地址发送UDP数据,进行IP欺骗攻击。
  • 反射攻击和放大攻击:
    • udp反射攻击: 攻击者伪造受害者的 IP 地址,向网络上的其他服务器发送大量UDP 请求。由于很多服务器会自动回复请求,这些回复数据将被发送到受害者的地址,从而导致大量流量集中到受害者一侧,形成 DDoS 攻击。
    • udp放大攻击:基于udp的应用层协议(DNS,NTP)返回的响应包含较大的数据包。攻击者利用伪造的 IP 地址发送小请求,目标服务器返回的大量数据包会直接被发送给受害者,放大了攻击效果。
  • udp未加密传输: 数据以明文形式传输,容易被窃听。中间人可以劫持udp流量,监听内容,进行功能流量重放等攻击手段。
  • 利用防火墙漏洞传输有害信息: UDP 是无连接的协议,某些情况下可以绕过防火墙的状态检测。攻击者可以通过精心设计的数据包,穿透防火墙,访问内部的网络资源。

6. 使用udp传输数据的系统就一定不可靠吗?

先说结论: 虽然udp本身不提供可靠性保证,但在实际应用中,通过应用层协议的设计,可以使得基于UDP的通信具备可靠性

常见例子:

  • DNS: 通过使用超时重传机制来保证查询的可靠性。
  • TFTP: 通过应用层的确认和重传机制来保证文件传输的可靠性。
  • RTP(用于传输音视频的协议): 通过结合RTCP提供的一些保障机制,例如 序列号和时间戳、丢包检测、RTCP反馈。来实现可靠传输。

7. 基于UDP的主机探活 python实现

实现原理:当向目标发送一个UDP数据包之后,目标是不会发回任何UDP数据包的。不过如果目标主机处于活跃状态,但是目标端口是关闭状态时,会返回一个ICMP数据包,这个包的含义是unreachable.如果目标主机处于不活跃状态,这时接收不到任务响应数据。

挑选目标主机的目标端口也是一个比较重要的步骤。一般思路是设置不太可能被开放端口,例如65535这种不常用的端口。我下面这个脚本通过随机数去生成一个目标端口,不一定适用所有情况,可以根据要扫描网段或机器的环境设置目标端口。

from scapy.layers.inet import *
from optparse import OptionParser
import nmap
import sys
"""
发送udp数据包
"""def main():usage = "Usage: %prog -i <ip adress>"parse = OptionParser(usage=usage)# 获取网段地址parse.add_option("-i", "--ip", type="string", dest="IP", help="specify the IP address")options, args = parse.parse_args()# checkif options.IP is None:parse.print_help()sys.exit(1)if "-" in options.IP:start = int(options.IP.split("-")[0].split(".")[3])end = int(options.IP.split("-")[1])ipPrefix = ".".join(options.IP.split(".")[:3])for i in range(start, end + 1):Scan(ipPrefix + "." + str(i))else:Scan(options.IP)def sent_udp_message(address):ip = IP()udp = UDP()r = (ip / udp)r[IP].dst = addressr[UDP].dport = random.randint(1024, 65535)a = sr1(r)a.display()"""
通过UDP探测包探测主机存活
"""
def Scan(ip):dport = random.randint(1, 65535)try:packet = IP(dst=ip) / UDP(dport=dport)response = sr1(packet, timeout=10, verbose=0)if response:if int(response[IP].proto) == 1:print(ip + " is up")else:print(ip + " is down")else:print(ip + " is down")except Exception as e:print(e)"""借助nmap实现udp探测
"""
def NmapScan(targetIp):nm = nmap.PortScanner()try:result = nm.scan(hosts=targetIp, arguments="-PU")state = result["scan"][targetIp]["status"]["state"]print("[{}] is [{}]".format(targetIp, state))except Exception as e:print(e)if __name__ == "__main__":main()

相关文章:

[网络协议篇] UDP协议

文章目录 1. 简介2. 特点3. UDP数据报结构4. 基于UDP的应用层协议5. UDP安全性问题6. 使用udp传输数据的系统就一定不可靠吗&#xff1f;7. 基于UDP的主机探活 python实现 1. 简介 User Datagram Protocol&#xff0c;用户数据报协议&#xff0c;基于IP协议提供面向无连接的网…...

关系型数据库(1)----MySQL(初阶)

目录 1.mysql 2.mysqld 3.mysql架构 1.连接层 2.核心服务层 3.存储引擎层 4.数据存储层 4.SQL分类 5.MySQL操作库 6.MySQL数据类型 1. 数值类型 2. 日期和时间类型 3. 字符串类型 4. 空间类型 5. JSON数据类型 7.MySQL表的约束 1. 主键约束&#xff08;PRIMARY…...

计算机毕业设计Python+大模型租房推荐系统 租房大屏可视化 租房爬虫 hadoop spark 58同城租房爬虫 房源推荐系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 用到的技术: 1. python…...

深度学习技术演进:从 CNN、RNN 到 Transformer 的发展与原理解析

深度学习的技术演进经历了从卷积神经网络&#xff08;CNN&#xff09;到循环神经网络&#xff08;RNN&#xff09;再到 Transformer 的重要发展。这三个架构分别擅长处理图像、序列数据和多种任务的特征&#xff0c;标志着深度学习在不同领域取得的进步。 1. 卷积神经网络&…...

Lua中的goto语句

软考鸭微信小程序 过软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 在Lua编程语言中&#xff0c;goto语句是一种跳转语句&#xff0c;用于将程序的执行流程无条件地转移到程序中的另一个位置。这个位置由一个标签&#xff08;…...

【rust实战】rust博客系统2_使用wrap启动rust项目服务

如何创建一个使用warp框架的rust项目1.使用cargo 创建项目 cargo new blog 2.添加warp依赖 1.cd blog 2.编辑Cargo.toml文件 添加warp 和 tokio 作为依赖项 在[dependencies]中添加 [package] name "blog" version "0.1.0" …...

【实战案例】Django框架使用模板渲染视图页面及异常处理

本文基于之前内容列表如下&#xff1a; 【图文指引】5分钟搭建Django轻量级框架服务 【实战案例】Django框架基础之上编写第一个Django应用之基本请求和响应 【实战案例】Django框架连接并操作数据库MySQL相关API 视图概述 Django中的视图的概念是一类具有相同功能和模板的网…...

设置K8s管理节点异常容忍时间

说明 每个节点上的 kubelet 需要定时向 apiserver 上报当前节点状态&#xff0c;如果两者间网络异常导致心跳终端&#xff0c;kube-controller-manager 中的 NodeController 会将该节点标记为 Unknown 或 Unhealthy&#xff0c;持续一段时间异常状态后 kube-controller-manage…...

什么样的JSON编辑器才好用

简介 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也便于机器解析和生成。随着互联网和应用程序的快速发展&#xff0c;JSON已经成为数据传输和存储的主要格式之一。在处理和编辑JSON数据…...

ArkUI自定义TabBar组件

在ArkUI中的Tabs&#xff0c;通过页签进行内容视图切换的容器组件&#xff0c;每个页签对应一个内容视图。其中内容是图TabContent作为Tabs的自组件&#xff0c;通过给TabContent设置tabBar属性来自定义导航栏样式。现在我们就根据UI设计的效果图来实现下图效果&#xff1a; 根…...

pair类型应用举例

在main.cpp里输入程序如下&#xff1a; #include <iostream> //使能cin(),cout(); #include <utility> //使能pair数据类型; #include <string> //使能string字符串; #include <stdlib.h> //使能exit(); //pair类型可以将两个相同的或不同类…...

数字 图像处理算法的形式

一 基本功能形式 按图像处理的输出形式&#xff0c;图像处理的基本功能可分为三种形式。 1&#xff09;单幅图像 单幅图像 2&#xff09;多幅图像 单幅图像 3&#xff09;单&#xff08;或多&#xff09;幅图像 数字或符号等 二 几种具体算法形式 1.局部处理邻域对于任一…...

安徽对口高考Python试题选:输入一个正整数,然后输出该整数的3的幂数相加形式。

第一步&#xff1a;求出3的最高次幂是多少 guoint(input("请输入一个正整数:")) iguo a0 while i>0: if 3**i<guo: ai break ii-1print(a)#此语句为了看懂题目&#xff0c;题目中不需要打印出最高幂数 第二步…...

Node.js是什么? 能做什么?

‌Node.js是一个基于Chrome V8引擎的JavaScript运行环境&#xff0c;它使用事件驱动、非阻塞式I/O模型&#xff0c;使得JavaScript能够在服务器端运行。Node.js允许JavaScript脱离浏览器&#xff0c;直接在服务器和计算机上使用&#xff0c;极大地扩展了JavaScript的应用范围。…...

JVM快速入门

1、 JVM探究 面试问题 :谈谈对JVM的理解? java8虚拟机和之前的变化更新?什么是OOM,什么是栈溢出StackOverFlowError?怎么分析?JVM的常用调优参数有哪些?内存快照如何抓取,怎么分析Dump文件?知道吗?谈谈JVM中,类加载器你的认识?2、JVM的位置 3、JVM的体系结构 3.1…...

理解深度学习模型——高级音频特征表示的分层理解

理解深度学习模型可以是一个复杂的过程&#xff0c;因为这些模型通常包含大量的参数和层次。 &#xff08;1&#xff09;复杂性来源&#xff1a; 深度学习模型的复杂性来源于多个方面&#xff0c;包括模型的规模、层次结构、参数数量以及训练数据的复杂性。以下是一些关键点&a…...

【HarmonyOS Next】原生沉浸式界面

背景 在实际项目中&#xff0c;为了软件使用整体色调看起来统一&#xff0c;一般顶部和底部的颜色需要铺满整个手机屏幕。因此&#xff0c;这篇帖子是介绍设置的方法&#xff0c;也是应用沉浸式效果。如下图&#xff1a;底部的绿色延伸到上面的状态栏和下面的导航栏 UI 在鸿蒙…...

数据结构 ——— 树的概念及结构

目录 树的结构以及示意图 树的概念​编辑 树的结构与递归的关系​编辑 树的结构以及示意图 树是一种非线性的数据结构&#xff0c;它是由 n(n>0) 个有限节点组成一个具有层次关系的集合 把这种结构叫做树是因为它看起来像一棵倒挂的树 特点&#xff1a; 有一个特殊的…...

初探Vue前端框架

文章目录 简介什么是Vue概述优势MVVM框架 Vue的特性数据驱动视图双向数据绑定指令插件 Vue的版本版本概述新版本Vue 3Vue 3新特性UI组件库UI组件库概述常用UI组件库 安装Vue安装Vue查看Vue版本 实例利用Vue命令创建Vue项目切换工作目录安装vue-cli脚手架创建Vue项目启动Vue项目…...

Lucas带你手撕机器学习——岭回归

岭回归&#xff08;Ridge Regression&#xff09; 一、背景与引入 在进行线性回归分析时&#xff0c;我们常常面临多重共线性的问题。多重共线性指的是自变量之间高度相关&#xff0c;这会导致回归系数的不稳定性&#xff0c;使得模型的预测能力降低。传统的线性回归通过最小…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...