【网络层协议】NAT技术内网穿透
IP地址数量限制
我们知道,IP地址(IPv4)是一个4字节32位的整数,那么一共只有2^32也就是接近43亿个IP地址,而TCP/IP协议栈规定,每台主机只能有一个IP地址,这就意味着,一共只有不到43亿台主机能接入互联网吗?
实际上,由于一些特殊的IP地址(主机号全0代表网络号,主机号全1代表广播地址,127.*用于本地环回测试)的存在,IP地址实际数量要比这个数更小一些,并且IP地址并不是按主机台数分配的,每张网卡都需要配置一个或多个IP地址,这就导致了一个很尴尬的问题:IP地址不够用了!这时候有三种方式来解决:
- 动态分配IP地址:只给接入网络的设备分配IP地址,因此即使同一MAC地址的设备,每次接入网络分配到的IP地址也不一定是相同的。
- NAT(Net Address Transimision):也就是网络地址转换,这是我们今天要重点学习的。
- IPv6:这并不是IPv4的简单升级,两者是互不兼容的协议,用16字节128位的整数表示一个IP地址,理论上能够给沙漠中的每一粒沙子都分配一个IP地址,但目前尚未普及。
私有IP与公网IP
如果一个组织内部组建局域网,IP地址只用于局域网内通信,而不连接互联网,那么理论上可以使用任意的IP地址,但如果想要接入Internet,就必须遵守RFC 1918对于组建局域网的私有IP地址的限制:
- 10.*:前8位是网络号,共16,777,216个地址(大家在学校的时候,IP地址应该都是10开头的)
- 172.16.*到172.31.*:前12位是网络号,共1,048,576个地址
- 192.168.*:前16位是网络号,共65,536个地址(大家在家里的时候,IP地址应该都是192.168开头的)
- 包含在以上范围的,都成为私有IP,其余的则是公网IP
大家可能觉得奇怪,不是要讲解决IPv4地址数量不足的问题吗,怎么扯到了私有IP和公网IP了,事实上,这是NAT技术能解决地址数量不足的一个很关键的要素:如果私有IP地址只在局域网内使用,那么不同局域网就可以出现重复的私有IP了,那么可用的IP数量就大大增加了!
那么问题来了,局域网中的主机怎么和公网进行通信呢?所以NAT技术实际上做的就是:在子网内的主机需要与外网进行通信时,路由器将IP报文首部的IP地址进行替换,经过一次次路由,最终数据包中的源IP地址成为一个公网IP,可以在公网中访问目标公网IP了。
NAT技术
前面提到了路由器将IP报文首部的IP地址替换,那么这个替换过程长啥样呢?让我们接着往下学,首先了解一下关于路由器的一些相关知识:
- 一个路由器可以配置至少两个IP地址,一个WAN口(广域网接口)IP,一个或一个以上的LAN口(局域网接口)IP。
- 路由器LAN口连接的主机都从属于这个路由器的某个子网中。
- 子网内的主机IP地址不能重复,但不同路由器的子网间可以出现重复的IP地址。
- 每个家用路由器实际上又作为运营商路由器子网中的一个节点,并且这样的运营商路由器可能有很多级,最外层的出入口运营商路由器的WAN口IP就是一个公网IP了。
现在再回过头表述一下什么是NAT技术:子网主机需要和外网通信时,家路由器将IP报头首部的源IP地址替换为自己的WAN口IP,这样主机替换,最终数据包中的源IP地址称为一个公网IP。
所以现在我们也就大概能够理解为什么我们的宽带欠费后,运营商可以让我们上不了网了,因为我们的每台主机其实都是在内网中,要想访问公网,那就必须先通过NAT转化为公网IP,而运营商路由器识别出欠费,直接不帮我们进行NAT,也就自然断网了。
通过前面的学习,我们解决了一个问题:局域网内的主机如何向公网的服务器发送请求。但是还有一个很重要的问题:服务器要怎么把响应返回给服务器呢?
按照我们前面的说法,局域网中有那么多的内网主机发送到服务器的请求的IP都是相同的(出入口运营商服务器的WAN口IP),服务器返回请求的目的IP都是运营商出入口NAT路由器,那NAT路由器怎么判定要把数据包交给哪个局域网的主机呢?
这个时候NAPT(网络地址端口转换)闪亮登场了,NAT路由器在进行源IP替换时,会将报文的源IP+port与自己替换的WAN口IP+port的映射关系存到一张转化表里,这很重要,因为:内网IP在局域网中唯一,port在主机上唯一;公网IP在公网中唯一,port在路由器上唯一。两个唯一值存在一张表里,就意味着两者互为键值!建立起这张转换表后,公网就可以访问到内网了!
(这个关联表是由NAT服务器自动维护的,对于TCP,在建立连接时生成表项,断开连接后删除表项)
内网穿透
在学习了NAT技术后,我们就可以开始学习内网穿透了。首先,什么是内网穿透?其实内网穿透就是:一台局域网中的主机,通过一个在公网的主机,访问另一个局域网中的主机。
那么内网穿透的原理是什么呢?其实我们学习了NAT和NAPT后,就非常容易理解了:
当客户机与服务器建立好转换表后,只要服务器1能够给服务器2提供这样的服务:服务器2发来的某个端口的数据全部转发到客户机,就可以实现让服务器2通过公网访问客户机了。
内网穿透的价值在于,可以通过它实现远程办公/跨区域、部门的协作。那么为了更好地理解内网穿透的过程,接下来我们一起来做一个实验!部署实现一下内网穿透~
部署与测试内网穿透
首先,说一下我的实验环境:
- 客户机:Ubuntu 20.04虚拟机(VMware设置为NAT模式)
- 服务器1:阿里云服务器(因为我们需要公网IP)
- 服务器2:Windows上的xterminal(SSH客户端软件)
- 转发功能:通过frp实现的,因为它用起来很简单
frp下载:下载的是linux amd64
Release v0.58.1 · fatedier/frphttps://github.com/fatedier/frp/releases/tag/v0.58.1 简单讲讲实验步骤:
- 在客户机上部署、安装、配置frpc(frp的客户端),然后把本地ssh 22号端口映射到frps的xxx端口(如6000)
- 在云服务器1上部署配置frps(frp的服务器),设置让xxx端口(如7000)与客户机上的frpc进行通信
- 服务器2此时通过云服务器1的7000端口就能访问到客户机的ssh服务了!
我们下载好这个压缩包之后,解压就能得到:
其中frps和frpc分别是frp的服务器和客户端,而.toml文件则是对服务器/客户端的配置信息。
frpc.toml:
- serverAddr和serverPort分别是frps的IP和port
- localPort和remotePort表示将本机的22号端口(ssh专用)映射到frps主机的6000号端口(也可以自己设置)——其实就是frps服务器会将6000号端口收到的请求都转发到frpc的22号端口,收到应答后再转发回给请求方。
frps.toml:
- frps上的配置信息比较简单,只要设置好要与frpc进行通信的端口即可
启动frps:
启动frpc:
值得一提的是,我们直接运行frpc并不会使用.toml文件中的配置,必须加-c选项显式指定。
此时我们可以发现frps这边显示连接成功了(我还配置了nginx,不过步骤类似,所以只和大家说ssh的操作):
接下来我们通过Xterminal来访问云服务器的6000端口,如果和我们设想一样的话,应该就能ssh登录客户机:
可以看到,XTerminal启动后,直接就是在客户机的~下:
我们在这下面新建一个文件,可以看到确实多了个文本文件:
ok,本篇文章到这里也接近尾声了,最后再给大家梳理下流程:服务器1是一台云服务器,有自己的公网IP,服务器2是windows机器用的是内网IP,而客户机是虚拟机用的也是内网IP。frp为我们做的事情是:启动frps(服务器)后,启动frpc(客户端)与frps连接,此时由于内网主机主动通过NAT技术与公网主机建立了连接,那么通过NAPT技术我们就可以实现公网主机访问内网主机了,并且frps会把发到6000号端口的数据都转发到frpc的22号端口,接下来另一台内网主机(ssh客户端)就可以通过访问云服务器的6000号端口来ssh登录客户机了!
相关文章:
【网络层协议】NAT技术内网穿透
IP地址数量限制 我们知道,IP地址(IPv4)是一个4字节32位的整数,那么一共只有2^32也就是接近43亿个IP地址,而TCP/IP协议栈规定,每台主机只能有一个IP地址,这就意味着,一共只有不到43亿…...
【数据分享】2000—2024年我国省市县三级逐年归一化植被指数(NDVI)数据(年平均值/Shp/Excel格式)
之前我们分享过2000-2024年我国逐年的归一化植被指数(NDVI)栅格数据,该逐年数据是取的当年月归一化植被指数(NDVI)的年平均值。!该数据来源于NASA定期发布的MOD13A3数据集!很多小伙伴拿到数据后…...
鸿蒙harmonyOS:笔记 正则表达式
从给出的文本中,按照既定的相关规则,匹配出符合的数据,其中的规则就是正则表达式,使用正则表达式,可以使得我们用简洁的代码就能实现一定复杂的逻辑,比如判断一个邮箱账号是否符合正常的邮箱账号࿰…...
centos7.9镜像源及Python引入ssl问题处理
一、镜像源修改 1. 备份原有的镜像源配置文件 在修改之前,先备份现有的 CentOS-Base.repo 文件: sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2. 编辑镜像源配置文件 使用文本编辑器(如 nano 或 vi)打开 /etc/yum.repos.d/Ce…...
【学Rust写CAD】11 2D CAD可用rust库
使用 Rust 开发 2D CAD 应用时,选择合适的库是关键。以下是一些适合用于 2D CAD 开发的 Rust 库和工具,涵盖图形渲染、几何计算、用户界面等方面: 图形渲染 lyon 简介: lyon 是一个用于 2D 图形渲染的 Rust 库,支持路径填充、描边…...
C#中值类型与引用类型是直观使用示例
一、值类型与引用类型区分 正确理解值类型与引用类型,可以更好的帮助软件开发人员写出性能更好且正确稳定运行的程序: C#值类型与引用类型区别 区别值类型引用类型定义所有继承自【System.ValueType】类型的都是值类型(valueType继承自Syste…...
Spring Cloud之负载均衡之LoadBalance
目录 负载均衡 问题 步骤 现象 什么是负载均衡? 负载均衡的一些实现 服务端负载均衡 客户端负载均衡 使用Spring Cloud LoadBalance实现负载均衡 负载均衡策略 编辑 编辑LoadBalancer原理 服务部署 准备环境和数据 服务构建打包 启动服务 上传J…...
MySQL的数据文件
MySQL的数据文件 mysql的数据都存放在datadir所指的位置,其中包含了mysql中创建的数据库,数据库中包含了表结构(frm文件)、表数据(myd文件)、表索引(myi文件) show variables like %datadir%.frm 存放和表相关的数据信息,主要包括表结构的定…...
【RabbitMQ高级特性】消息确认机制、持久化、发送方确认、TTL和死信队列
🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 一、消息确认机制 消费者确认机制确保消息被正确处理后才从队列中删除。如果消费者处理失败(如业务异常或宕机),Broker 会重新投递消息…...
C# 正则表达式
C# 正则表达式 引言 正则表达式(Regular Expression,简称Regex)是一种用于处理字符串的强大工具,在编程领域有着广泛的应用。C# 作为一种流行的编程语言,也内置了对正则表达式的支持。本文将详细介绍 C# 中的正则表达…...
第十四届蓝桥杯省赛电子类单片机学习记录(客观题)
01.一个8位的DAC转换器,供电电压为3.3V,参考电压2.4V,其ILSB产生的输出电压增量是(D)V。 A. 0.0129 B. 0.0047 C. 0.0064 D. 0.0094 解析: ILSB(最低有效位)的电压增量计算公式…...
23种设计模式-桥接(Bridge)设计模式
桥接设计模式 🚩什么是桥接设计模式?🚩桥接设计模式的特点🚩桥接设计模式的结构🚩桥接设计模式的优缺点🚩桥接设计模式的Java实现🚩代码总结🚩总结 🚩什么是桥接设计模式…...
AI重塑视觉艺术:DeepSeek与蓝耘通义万相2.1的图生视频奇迹
云边有个稻草人-CSDN博客 近年来,深度学习、计算机视觉和生成模型在多个领域取得了突破性进展。其中,DeepSeek与蓝耘通义万相2.1图生视频的结合为图像生成与视频生成技术提供了新的发展方向。DeepSeek作为一个图像和视频生成的工具,能够利用深…...
mac怎么安装pycharm?
安装步骤:1、打开PyCharm官网,在官网首页点击“下载”按钮,选择“MacOS”版本进行下载;2、双击打开安装包,将PyCharm拖动到应用程序文件夹中;3、根据提示进行安装,在第一次运行PyCharm时&#x…...
HTML应用指南:利用POST请求获取城市肯德基门店位置信息
随着新零售业态的快速发展,门店位置信息的获取变得越来越重要。作为快餐服务行业的先锋,肯德基不仅在服务质量上持续领先,还积极构建广泛的门店网络,以支持其不断增长的用户群体。为了更好地理解和利用这些数据,本篇文…...
Java主流开发框架之请求响应常用注释
1.RestController 标记一个类为 REST 控制器,处理 HTTP 请求并直接返回数据(如 JSON/XML),而不是视图(如 HTML),一般是放在类的上边 RestController public class UserController {GetMapping…...
go的参数传递都是值传递,但切片需要注意
根据之前学习python和java的经验,每次学习一门新语言时,一定要搞清楚方法的参数传递是值传递,引用传递还是指针传递。 主要原因就是需要知道,某种类型的数据传递给某个方法后,方法里面对它的修改是否会影响到这个数据本…...
C++菜鸟教程 - 从入门到精通 第五节
一.各种排序 接下来,让我们开始学习排序! 1.选择排序 a.原理简介 选择排序(Selection Sort)是一种简单直观的排序算法。它的基本思想是每次从未排序的部分中选择最小(或最大)的元素,将其放到已排序部分的末尾ÿ…...
同一个局域网的话 如何访问另一台电脑的ip
在局域网内访问另一台电脑,可以通过以下几种常见的方法来实现: 直接通过IP地址访问: 首先,确保两台电脑都连接在同一个局域网内。获取目标电脑的IP地址,这可以通过在目标电脑上打开命令提示符(Windows系…...
[学习笔记]攻防世界-bug
打开场景,提示我们需要登陆 我们先注册一下 注册成功 我们登陆进去 我们点击Manage他提示我们admin才能进入 我们刷新抓包一下试试 Cookie里面除了PHPSESSID,多出来了一个user,看上去是md5加密的,我们尝试解密 这里尝试了好几个网…...
[250324] Kafka 4.0.0 版本发布:告别 ZooKeeper,拥抱 KRaft!| Wine 10.4 发布!
目录 Kafka 4.0.0 版本发布:告别 ZooKeeper,拥抱 KRaft!Wine 10.4 发布! Kafka 4.0.0 版本发布:告别 ZooKeeper,拥抱 KRaft! 近日,Apache Kafka 4.0.0 正式发布!这是一个…...
【赵渝强老师】达梦数据库MPP集群的架构
为了支持海量数据存储和处理等方面的需求,为高端数据仓库提供解决方案,达梦数据库提供了大规模并行处理MPP架构,以极低的成本代价,提供高性能的并行计算。通过使用MPP可以解决以下问题: 需要较高的系统性能支持以支持…...
JWT 鉴权常见知识点及参考答案
JWT 鉴权常见知识点及参考答案 最近在 Go Web 项目当中使用到了 JWT 进行鉴权,因此通过这篇文章对 JWT 的原理及相关的知识点进行总结。 文章目录 JWT 鉴权常见知识点及参考答案JWT 签名算法的详细工作流程一. 签名的生成过程二. 签名的验证过程 1. 什么是 JWT&am…...
洛谷题单入门4-P5729 【深基5.例7】工艺品制作-python
输入格式 第一行三个正整数 w,x,h。 第二行一个正整数 q。 接下来 q 行,每行六个整数 输出格式 输出一个整数表示答案。 三维数组直接标记 class Solution:staticmethoddef oi_input():"""从标准输入读取数据"""w, x, h map(…...
【C语言】内存函数详解
个人主页 文章目录 🏠一、memcpy函数1.函数形式以及功能介绍2.函数的使用3.模拟实现 🚀二、memmove函数1.函数形式以及功能介绍2.函数的使用3.模拟实现 🎡三、memset函数1.函数形式以及功能介绍2.函数的使用 🎉四、memcmp1.函数形…...
使用Python开发自动驾驶技术:车道线检测模型
友友们好! 我是Echo_Wish,我的的新专栏《Python进阶》以及《Python!实战!》正式启动啦!这是专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会…...
HTTP代理的全面解读:什么是HTTP代理?HTTP代理的工作原理
在互联网大潮中,每一个请求和返回数据的背后,都离不开传输协议的支持,而HTTP协议无疑是最熟悉的网络通信基础之一。当我们谈到HTTP代理时,它不仅让浏览网络变得更高效,也为数据采集以及全球性远程任务提供了解决方案。…...
DeepSeek底层揭秘——deepEP
1. 什么是 deepEP? (1) 定义 deepEP (DeepSeek EndPoint) 是 DeepSeek 开源的一款高性能、低延迟的分布式通信库,专为大规模深度学习训练和推理场景设计。它旨在优化分布式计算环境中的通信效率,特别是在节点间数据交换、梯度同步、模型分发…...
内网渗透(CSMSF) 构建内网代理的全面指南:Cobalt Strike 与 Metasploit Framework 深度解析
目录 1. Cobalt Strike 在什么情况下会构建内网代理? 2. Cobalt Strike 构建内网代理的主要作用和目的是什么? 3. Cobalt Strike 如何构建内网代理?需要什么条件和参数? 条件 步骤 参数 4. Cobalt Strike 内网代理能获取什…...
【redis】哨兵:人工恢复主节点故障和哨兵自动恢复主节点故障
文章目录 基本概念人工恢复主节点故障操作流程 哨兵自动恢复主节点故障哨兵集 Redis 的主从复制模式下,⼀旦主节点由于故障不能提供服务,需要⼈⼯进⾏主从切换,同时⼤量的客⼾端需要被通知切换到新的主节点上,对于上了⼀定规模的应…...
【Go 】异常处理
1. Go 语言错误处理基础 Go 语言尽量避免使用异常,推荐使用 返回错误 让调用者处理。Go 语言标准库提供 error 接口:type error interface {Error() string }errors.New("错误信息") 创建错误对象。 package mainimport ("errors"…...
微软纳德拉最新一期访谈
萨提亚纳德拉: 微软的AGI计划与量子突破| 2025.2.20 【文章核心预览:】 1、纳德拉回应AI价格战:效率提升将重塑需求,但关键是能否带动GDP增长至10% 2、微软AI收入130亿美元,4年后目标1300亿,但提醒"…...
WebSocket接入SSL证书
目录 碎碎念解决方法创建 HTTPS WebSocket 服务器创建系统服务启动服务 碎碎念 在访问网站时,使用 HTTPS 非常重要。HTTPS 协议不仅可以确保数据传输的安全性,还可以防止中间人攻击和数据篡改等安全问题。任何没有 SSL 证书的内容都可能会被拒绝访问。因…...
蓝桥杯——嵌入式学习日记
因为lED和LCD共用PC8~PC15引脚,要通过锁存(LE)和(GPIOC->ODR)来避免LED和LCD引脚冲突 修改点: main.c中,GPIO初始化引脚后,LE(PD2引脚低电平锁存,退出透明模式&…...
第七课:Python基础排序算法与比较排序原理深度解析
比较排序算法是算法领域中的经典内容,其核心思想通过元素间的比较操作确定相对顺序。本文将深入探讨冒泡排序的优化策略、选择排序的变种实现、插入排序的典型应用场景,并通过统计比较次数直观展示算法效率差异。 一、冒泡排序的优化策略 传统冒泡排序存…...
项目流程中关键节点的测试类型
一、全流程测试框架图 #mermaid-svg-LmUdhLObstSpThwP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LmUdhLObstSpThwP .error-icon{fill:#552222;}#mermaid-svg-LmUdhLObstSpThwP .error-text{fill:#552222;strok…...
EasyRTC嵌入式音视频通信SDK:WebRTC技术下的硬件与软件协同演进,开启通信新时代
在当今数字化时代,智能设备的普及和人们对实时通信需求的不断增长,推动了嵌入式音视频通信技术的快速发。EasyRTC嵌入式音视频通信SDK凭借其独特的技术特点和应用优势,在嵌入式设备和多平台实时通信领域脱颖而出。 1、轻量级设计与高性能 Ea…...
机器视觉工程师如何看机器视觉展会,有些机器视觉兄弟参加机器视觉展会,真的是参加了?重在参与?
作为机器视觉工程师,参加机器视觉展会不仅是了解行业前沿技术的窗口,也是拓展专业网络、寻找解决方案的重要机会。以下是结合展会信息和工程师视角的综合建议: 一、聚焦技术趋势与创新应用 参与技术论坛与研讨会 展会同期的技术论坛是获取行业洞见的核心渠道。例如: 上海展…...
重温Ubuntu 24.04 LTS
用户调整 # 创建新用户 sudo adduser newusername # 设置新用户的密码 sudo passwd newusername # 将新用户添加到 sudo 组 sudo usermod -aG sudo newusername # 修改ssh访问权限 sudo nano /etc/ssh/sshd_config # 将新用户加入,此时root将无法访问 AllowUsers n…...
新版 eslintrc 文件弃用 .eslintignore已弃用 替代方案
1.进入eslint.config.mjs文件 2.import { defineConfig, globalIgnores } from "eslint/config"; 引入globalIgnores 3.配置 defineConfig([ ... globalIgnores([ "config/*", ".husky", ".local", "public/*", ".…...
优化 SQL 语句方向和提升性能技巧
优化 SQL 语句是提升 MySQL 性能的关键步骤之一。通过优化 SQL 语句,可以减少查询时间、降低服务器负载、提高系统吞吐量。以下是优化 SQL 语句的方法、策略和技巧: 一、优化 SQL 语句的方法 1. 使用 EXPLAIN 分析查询 作用:查看 SQL 语句的执行计划,了解查询是如何执行的…...
数据可视化革命!「图表狐」五大行业新范式:从科研论文到商业决策的AI进化论
图表狐 - AI图表生成工具,在线数据可视化 一、学术研究:突破传统制图范式 案例1 基因测序热图 用户输入: "绘制差异表达基因热图,行标签为GeneA/B/C,列包含正常组5例、癌症组7例,红色标记上调基因(f…...
Jenkins集成Trivy安全漏洞检查指南
要将Jenkins与Trivy集成以实现制品的安全漏洞检查,可以按照以下步骤操作: 安装Trivy 在Jenkins服务器或构建节点上安装Trivy # 使用包管理器(如Debian/Ubuntu) sudo apt-get install -y wget apt-transport-https gnupg lsb-rel…...
git使用钩子文件出现错误
git的钩子文件出现错误 问题打印:解决办法1.删除本地钩子文件2. 恢复commit-msg钩子3.重新提交工程 问题打印: 无法commit 1 个文件: .git/hooks/commit-msg: 行 1: 未预期的符号 < 附近有语法错误 .git/hooks/commit-msg: 行 1: Your browse does …...
SpringBoot 第二课(Ⅱ)配置嵌入式服务器
目录 一、封装类解读 二、注册Servlet三大组件(Servlet、Filter、Listener) 自定义这三个组件 WebConfig MyFilter MyListener HelloController hello1.html hello2.html 三、使用外置的Servlet容器 1.一定要确保打包方式是war包 2.将…...
Python学习笔记(6)
Python学习笔记(6) 第13节课 函数基础1.函数定义与调用2.函数的返回值3.局部变量与全局变量 第13节课 函数基础 对于任何一个知识点,必须讨论的三个问题: (1)它是啥 (2)为啥有它 …...
HarmonyOS Next应用架构设计与模块化开发详解
引言 在HarmonyOS Next开发中,合理的应用架构设计和模块化开发是构建高效、可维护应用的关键。本文将深入探讨HarmonyOS Next应用的架构设计思路,并通过实际代码示例展示如何实现模块化开发。 应用架构设计 HarmonyOS Next应用通常采用分层架构设计&…...
batman-adv 优化:基于信号强度(RSSI)选择链路
batman-adv 优化:基于信号强度(RSSI)选择链路 1. 背景介绍 batman-adv(Better Approach To Mobile Ad-hoc Networking Advanced) 是一种用于无线 Mesh 网络的路由协议。它主要基于 ETX(Expected Transmis…...
计算机二级:函数基础题
函数基础题 第一题 rinput("请输入半径:") c3.1415926*r*2 print("{:.0f}".format(c))输出: Type Error第二题 a7 b2 print(a%2)输出 1第三题 ab4 def my_ab(ab,xy):abpow(ab,xy)print(ab,end"\n") my_ab(ab,2)prin…...
系统思考与心智模式
“问题不是出在我们做了多少,而是出在我们做了什么。” — 赫尔曼凯恩 “一分耕耘一分收获”,这似乎是我们脑海中根深蒂固的心智模式。今天,我在一家餐厅用餐,店员告诉我,打卡收藏可以获得一份小食。没过多久…...