【Linux网络-NAT、代理服务、内网穿透】
一、NAT技术
1.NAT技术背景
之前我们讨论了,IPV4协议中,IP地址数量不充足的问题
NAT技术当前解决IP地址不够用的主要手段,是路由器的一个重要功能
NAT(网络地址转换,Network Address Translation)是一种用于网络设备(如路由器或防火墙)上的技术,其主要目的是在局域网(LAN)和广域网(WAN)之间转换IP地址,以实现私有地址和公共地址的互通,从而节省公共IP地址资源并提高网络安全性。NAT的应用广泛,尤其在IPv4地址枯竭的情况下更加重要。
NAT主要功能是将内部网络(通常使用私有IP地址)与外部网络(如互联网)连接,通过将私有IP地址映射为公共IP地址,使得内部设备能够访问外部网络,同时保护内部网络不直接暴露于外部。NAT的基本工作机制是将进出数据包中的IP地址进行转换。
- NAT能够将私有IP对外通信时转为全局IP,也就是一种将私有IP和全局IP相互转化的技术方法
- 很多学校,家庭,公司内部采用每个终端设置私有IP,而在路由器或必要的服务器上设置全局IP;
- 全局IP要求唯一,但是私有IP不需要;在不同的局域网中出现相同的私有IP是完全不影响的
2.NAT IP 转换过程

- NAT路由器将源地址 10.0.0.10 替换成全局的IP 202.244.174.37;
- NAT路由器收到外部的数据时,又会把目标IP从202.244.174.37替换回10.0.0.10;
- 在NAT路由器内部,有一张自动生成的,用于地址转换的表
- 当10.0.0.10第一次向163.211.120.9 发送数据时就会生成表中的映射关系
3.NAPT(地址转换表)
那么问题来了,如果局域网内,有多个主机都访问同一个外网服务器,那么对于服务器返回的数据中,目的IP都是相同的。那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候NAPT来解决这个问题了,使用IP+port来建立这个关联关系
NAPT(Network Address Port Translation),也称为网络地址端口转换,是一种NAT(网络地址转换)技术的扩展。NAPT利用端口号在地址转换表(NAPT表)中建立映射,从而允许多个局域网内的私有IP地址共享一个公共IP地址访问外网。

NAPT表的结构
NAPT表用于记录局域网内部的私有IP地址、端口号与外部网络中使用的公共IP地址、端口号的映射关系。NAPT表的典型结构包括以下几项:
- 内部IP地址:局域网内发起请求的私有IP地址
- 内部端口号:局域网内主机使用的本地端口号
- 外部IP地址:NAPT路由器的公共IP地址(通常唯一)
- 外部端口号:NAPT路由器为区分不同内部主机而分配的临时外部端口号
- 目标IP地址和端口号(可选):在一些NAPT实现中,也会记录目标服务器的IP地址和端口号,用于数据包的双向匹配和更高效的路由
NAPT表的核心作用是管理这些映射关系,确保每个内部主机的请求都能被唯一识别。
出站数据包的处理过程
当局域网中的某个设备向外部网络发起请求时,NAPT路由器会执行以下步骤:
- 记录映射关系:NAPT路由器在NAPT表中创建一条记录,保存该设备的私有IP地址和端口号,同时分配一个外部端口号作为映射标识。
- 地址转换:NAPT路由器将数据包的源IP地址替换为自己的公共IP地址,将源端口号替换为分配的外部端口号。
- 更新表记录:如果该内部IP和端口号已经存在映射关系,则使用已有的映射;如果是新的请求,则分配新的外部端口号并更新NAPT表。
例如:
- 主机A的私有IP地址和端口号为
192.168.1.10:12345,在NAPT表中映射为203.0.113.1:50001。 - 主机B的私有IP地址和端口号为
192.168.1.20:23456,在NAPT表中映射为203.0.113.1:50002。
入站数据包的处理过程
当外部服务器将响应数据包返回到NAPT路由器时,NAPT表用于查找原始的内部IP和端口号,以便准确将数据包转发到请求的内部主机:
- 查询NAPT表:NAPT路由器根据接收到的数据包的目的端口号和公共IP地址,在NAPT表中查找相应的内部IP和端口号。
- 地址恢复:路由器将数据包的目的IP地址替换为对应的内部IP地址,将目的端口号替换为原始内部端口号。
- 转发数据包:数据包被转发到相应的内部主机。
例如:
- 返回数据包的目的IP和端口为
203.0.113.1:50001,则路由器查找NAPT表,发现此映射对应于主机192.168.1.10:12345,并将数据包转发给主机A。 - 目的IP和端口为
203.0.113.1:50002的数据包则会被转发至主机192.168.1.20:23456,即主机B。
NAPT的优点
- 节省公共IP资源:多个私有地址可以共享一个公共IP地址,有效缓解了IPv4地址枯竭的问题。
- 隐匿内部网络:外部网络只能看到NAPT路由器的公共IP地址,无法直接访问局域网内的主机,从而增强了网络安全性。
- 灵活性高:可以支持大量的内部主机访问外部网络而不受公共IP数量的限制。
NAPT的缺点
由于 NAT 依赖这个转换表,所以有很多的限制:
- 端到端连接受限:NAPT破坏了IP协议中的端到端通信,使某些基于IP的应用无法正常工作(例如VoIP、视频会议等),通常需要额外的NAPT穿透技术支持。
- 处理开销:由于NAPT路由器需要维护大量的映射关系表,会增加设备的处理负荷,尤其是在高并发情况下。
- 无法从 NAT 外部向内部服务器建立连接。
- 通信过程中一旦 NAT 设备异常,即使存在热备,所有的 TCP 连接也都会断开。
二、代理服务器
代理服务器是一种应用比较广的技术
- 翻墙:广域网中的代理
- 负载均衡:局域网中的代理
代理服务器的功能就是代理网络用户去取得网络信息,代理服务器又分为正向代理和反向代理等;
代理服务器(Proxy Server)是一种中间服务器,用于客户端(如个人计算机)与目标服务器之间的通信。代理服务器在网络请求的过程中充当中介角色,接收客户端的请求后再将其转发到目标服务器,并将返回的数据传递给客户端。代理服务器在网络中具有多种用途,如提高访问速度、增强隐私保护、管理访问权限等。
代理例子:
花王尿不湿是产自日本的一个很经典的尿不湿品牌。张三去日本买尿不湿不方便,但是可以让他在日本工作的表姐去超市买了快递给他。此时超市看到的买家是张三的表姐,张三的表姐就是是 “正向代理”。后来找张三表姐买尿不湿的人太多了,他表姐觉得天天去超市太麻烦,干脆去超市买了一大批尿不湿屯在家里,如果有人来找她代购,就直接把屯在家里的货发出去,而不必再去超市,此时张三表姐就是 “反向代理”。
正向代理用于请求的转发(例如借助代理绕过反爬虫)
反向代理往往作为一个缓存
1.正向代理
正向代理(Forward Proxy)是一种用于客户端和目标服务器之间的代理服务器,通常用于帮助客户端访问特定的外部资源。正向代理可以隐藏客户端的真实IP地址,绕过网络限制,缓存常用内容,加快访问速度。正向代理服务器的客户端是受控的,这种代理的设置通常需要客户端的参与配置

正向代理的工作原理
正向代理位于客户端和目标服务器之间,主要负责将客户端的请求转发给目标服务器,获取响应后再返回给客户端。正向代理的典型工作流程如下:
- 客户端将请求发送给正向代理服务器。
- 正向代理服务器接收请求,并根据配置进行处理,如缓存查找、内容过滤等。
- 正向代理服务器将处理后的请求转发给目标服务器。
- 目标服务器处理请求,并将响应返回给正向代理服务器。
- 正向代理服务器将响应返回给客户端。
功能特点
- 缓存功能:正向代理服务器可以缓存经常访问的资源,当客户端再次请求这些资源时,可以直接从缓存中获取,提高访问速度。
- 内容过滤:正向代理可以根据预设的规则对请求或响应进行过滤,如屏蔽广告、阻止恶意网站等。
- 访问控制:通过正向代理,可以实现对特定网站的访问控制,如限制员工在工作时间访问娱乐网站。
- 隐藏客户端身份:正向代理可以隐藏客户端的真实IP 地址,保护客户端的隐私。
- 负载均衡:在多个目标服务器之间分配客户端请求,提高系统的可扩展性和可靠性。
应用场景
企业网络管理:企业可以通过正向代理实现对员工网络访问的管理和控制,确保员工在工作时间内专注于工作,避免访问不良网站或泄露公司机密。
公共网络环境:在公共场所如图书馆、学校等提供的网络环境中,通过正向代理可以实现对网络资源的合理分配和管理,确保网络使用的公平性和安全性。
内容过滤与保护:家长可以通过设置正向代理来过滤不良内容,保护孩子免受网络上的不良信息影响。
提高访问速度:对于经常访问的网站或资源,正向代理可以通过缓存机制提高访问速度,减少网络延迟。
跨境电商与海外访问:对于跨境电商或需要访问海外资源的企业和个人,正向代理可以帮助他们突破网络限制,顺畅地访问海外网站和资源。
2.反向代理
反向代理(Reverse Proxy)是一种代理服务器技术,主要用于代理外部用户访问内部服务器,将来自客户端的请求转发给后端服务器,并将服务器的响应返回给客户端。反向代理不仅可以隐藏内部服务器的实际IP地址和结构,还可以分担服务器负载、提高访问速度并增强安全性。

基本原理
反向代理服务器位于客户端和Web服务器之间,当客户端发起请求时,它首先会到达反向代理服务器。反向代理服务器会根据配置的规则将请求转发给后端的Web服务器,并将 Web 服务器的响应返回给客户端。在这个过程中,客户端并不知道实际与哪个 Web 服务器进行了交互,它只知道与反向代理服务器进行了通信。
应用场景
- 负载均衡:反向代理服务器可以根据配置的负载均衡策略,将客户端的请求分发到多个后端服务器上,以实现负载均衡。这有助于提升网站的整体性能和响应速度,特别是在高并发场景下。
- 安全保护:反向代理服务器可以隐藏后端Web 服务器的真实IP地址,降低其被直接攻击的风险。同时,它还可以配置防火墙、访问控制列表(ACL)等安全策略,对客户端的请求进行过滤和限制,以保护后端服务器的安全。
- 缓存加速:反向代理服务器可以缓存后端Web 服务器的响应内容,对于重复的请求,它可以直接从缓存中返回响应,而无需再次向后端服务器发起请求。这可以大大减少后端服务器的负载,提升网站的响应速度。
- 内容过滤和重写:反向代理服务器可以根据配置的规则对客户端的请求进行过滤和重写,例如添加或删除请求头、修改请求路径等。这有助于实现一些特定的业务需求,如URL重写、用户认证等。
- 动静分离:在大型网站中,通常需要将静态资源和动态资源分开处理。通过将静态资源部署在反向代理服务器上,可以直接从反向代理服务器返回静态资源的响应,而无需再次向后端服务器发起请求。这可以大大提升静态资源的访问速度。
- CDN(Content Delivery Network,内容分发网络)就是采用了反向代理的原理
反向代理与正向代理的区别
- 代理方向:正向代理代理客户端的请求,使客户端能够访问外部资源;反向代理代理服务器,使得外部客户端访问后端服务器时通过代理完成。
- 应用场景:正向代理主要用于突破访问限制、保护客户端隐私等;反向代理则主要用于负载均衡、隐藏服务器信息、安全防护等。
- 配置方式:正向代理需要客户端配置代理服务器地址,而反向代理对客户端是透明的,客户端只需访问反向代理的地址即可。
3.NAT和代理服务器
路由器往往都具备NAT设备的功能,通过 NAT设备进行中转,完成子网设备和其他子网设备的通信过程.
代理服务器看起来和 NAT设备有一点像.客户端像代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器;服务器返回结果后,代理服务器又把结果回传给客户端.
那么NAT和代理服务器的区别有哪些呢?
- 从应用上讲,NAT 设备是网络基础设备之一(必须的),解决的是 IP 不足的问题。代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙,另外像迅游这样的加速器,也是使用代理服务器。
- 从底层实现上讲,NAT 工作在网络层,直接对 IP 地址进行替换,而代理服务器往往工作在应用层。
- 从使用范围上讲,NAT 一般在局域网的出口部署,代理服务器可以在局域网做,也可以在广域网做,也可以跨网。
- 从部署位置上看,NAT 一般集成在防火墙,路由器等硬件设备上,代理服务器则是一个软件程序,需要部署在服务器上。
三、内网穿透
内网穿透(NAT 穿透或内网映射)是一种技术,用于解决处于内网或防火墙后面的设备难以被外部网络直接访问的问题。该技术通常用于让外网用户通过特定的隧道或端口访问内网中的服务,而不需要改变内网结构或配置。
几个例子
远程办公访问公司内网服务
场景:
公司员工在家办公时,需要访问公司内网中的 ERP 系统或数据库服务,但没有直接的 VPN 通道。
解决方案:
公司可以搭建 frp(Fast Reverse Proxy) 服务,在公司的外网服务器上配置 frp 服务,并在内网服务器上配置 frpc(frp 客户端)。通过 frp 的端口转发功能,将 ERP 系统的端口映射到外网服务器的一个端口上,员工在家访问外网服务器即可实现对公司内网 ERP 系统的访问。这种方法适合需要长期稳定连接的应用
物联网设备远程控制
场景:
一家智能家居公司希望实现外网对家庭物联网设备(如摄像头、温控器等)的远程控制和监控,而这些设备处于家庭路由器内网中。
解决方案:
可以使用中继服务器实现内网穿透。物联网设备会通过 UDP 打洞技术连接到公司的云服务器(例如使用 P2P 协议如 WebRTC),然后外网用户可以通过云服务器发送指令到设备端,实现远程控制。这种方案适合物联网场景,能够确保多台设备的连接稳定性。
游戏服务器的联机功能
场景:
游戏开发者希望让玩家在没有公网 IP 的情况下也能通过 P2P 实现游戏联机(如局域网对战游戏或桌游等)。
解决方案:
使用 UDP 打洞技术,通过中继服务器让玩家间建立 P2P 连接。中继服务器协助交换内网 IP 地址和端口信息,玩家通过 NAT 穿透直接建立连接,适用于联机游戏或低延迟应用场景。
四、内网打洞
内网打洞(NAT Traversal),通常被称为 NAT 穿透 或 打洞技术,是一种让位于不同内网中的设备可以直接建立连接的技术,主要应用于需要点对点(P2P)通信的场景,如文件传输、视频通话、游戏联机等。内网打洞的核心原理是通过中继服务器协调,让两个内网设备可以穿透各自的 NAT 设备或防火墙,从而实现直接通信。
内网打洞的主要原理
NAT 的作用是通过将私有 IP 地址映射为公共 IP 地址来节省 IP 地址资源,但这会导致内网设备无法直接被外网访问。打洞技术可以突破这个限制,使内网设备之间建立直接连接。常见的打洞技术主要包括 UDP 打洞 和 TCP 打洞,其中 UDP 打洞更为常用,因为其对 NAT 穿透更友好。
1. UDP 打洞(UDP Hole Punching)
UDP 打洞是内网打洞最常用的方法。基本过程如下:
- 步骤 1:两台内网设备(设备 A 和设备 B)先分别向一个中继服务器(通常位于外网)发送 UDP 数据包,以建立起与中继服务器的连接。中继服务器会记录它们的 NAT 公网地址和端口信息。
- 步骤 2:中继服务器将 A 的公网地址和端口信息发送给 B,同时也将 B 的公网地址和端口信息发送给 A。
- 步骤 3:设备 A 和设备 B 使用获得的对方公网地址和端口信息,直接向对方发送 UDP 数据包。由于两端的 NAT 设备都已经打开了对这个地址的通信端口,通信请求可以穿透 NAT,实现内网到内网的连接。
这种方法通常用于实时通信场景,且建立连接后延迟较低。
2. TCP 打洞(TCP Hole Punching)
TCP 打洞的过程与 UDP 打洞类似,但由于 TCP 是面向连接的协议,打洞的成功率通常较低。其实现步骤如下:
- 步骤 1:与 UDP 打洞类似,设备 A 和设备 B 首先分别与中继服务器建立 TCP 连接,中继服务器记录它们的公网地址和端口信息。
- 步骤 2:中继服务器将两端的公网信息相互传递,A 和 B 分别使用 TCP 向对方建立连接。
- 步骤 3:由于 TCP 的连接需要三次握手,在某些 NAT 环境中,可能会导致连接建立失败,因此在实际应用中,通常会优先选择 UDP 打洞。
内网打洞的应用场景
- 视频会议和实时语音通话:通过打洞技术,避免通过中继服务器转发流量,减少延迟,提升通话质量。
- P2P 文件传输:在文件传输软件中,打洞技术可以使两个用户直接传输数据,而无需通过中转服务器。
- 联机游戏:实现玩家之间的直接连接,减少延迟,提升游戏体验。
- 物联网设备控制:在智能家居等场景中,通过打洞技术可以实现远程控制和数据传输,避免家庭路由器配置的复杂性。
内网打洞的限制
尽管内网打洞在 P2P 通信中非常有用,但它也存在一些限制:
- 依赖 NAT 类型:对称型 NAT 通常不支持打洞,而全锥形 NAT 支持度较高。
- 连接可靠性:在 NAT 设备频繁重置端口映射的情况下,连接可能会中断。
- 防火墙限制:某些防火墙会阻止未知的连接尝试,从而影响打洞的成功率。
内网打洞的技术实现
常见的内网打洞协议和技术包括 STUN(Session Traversal Utilities for NAT) 和 ICE(Interactive Connectivity Establishment):
- STUN:通过与外部服务器协作,帮助设备发现自身的公网地址和 NAT 类型,并辅助打洞。
- ICE:提供了对多个连接候选地址的检测机制,尝试通过多种网络路径建立 P2P 连接。
打洞工具和实现
- WebRTC:WebRTC 是一个开源框架,广泛应用于网页中的实时通信,它集成了 STUN、ICE 等技术,能够在浏览器中实现 NAT 穿透。
- Libjingle:Google 开发的一个用于 P2P 连接的开源库,包含了 NAT 穿透功能,广泛应用于 Google Talk 和其他实时通信产品中。
内网打洞技术在 P2P 通信中起到了重要作用,通过与中继服务器配合,使内网中的设备能够直接建立连接,降低了对中继的依赖,提高了通信效率。然而,由于 NAT 类型和防火墙策略的多样性,内网打洞的实现仍然具有一定的挑战性。
相关文章:
【Linux网络-NAT、代理服务、内网穿透】
一、NAT技术 1.NAT技术背景 之前我们讨论了,IPV4协议中,IP地址数量不充足的问题 NAT技术当前解决IP地址不够用的主要手段,是路由器的一个重要功能 NAT(网络地址转换,Network Address Translation)是一种…...
Windows 和 Linux 操作系统架构对比以及交叉编译
操作系统与架构兼容性详解 1. 可执行文件格式:PE vs ELF Windows: PE (Portable Executable) 格式 详细解释: PE 格式是 Windows 下的可执行文件标准 包含多个区段(Sections),如代码段、数据段、资源段 文件头包含…...
heapq库的使用——python代码
Python中heapq库的基础使用方法和示例代码,包含详细注释说明: 1. 基本功能 heapq 实现的是最小堆(父节点值 ≤ 子节点值),核心操作包括: 插入元素:heappush(heap, item)弹出最小值:…...
新手村:逻辑回归-理解02:逻辑回归中的伯努利分布
新手村:逻辑回归-理解02:逻辑回归中的伯努利分布 伯努利分布在逻辑回归中的潜在含义及其与后续推导的因果关系 1. 伯努利分布作为逻辑回归的理论基础 ⭐️ 逻辑回归的核心目标是: 建模二分类问题中 目标变量 y y y 的概率分布。 伯努利分布(…...
golang Error的一些坑
golang Error的一些坑 golang error的设计可能是被人吐槽最多的golang设计了。 最经典的err!nil只影响代码风格设计,而有一些坑会导致我们的程序发生一些与我们预期不符的问题,开发过程中需要注意。 errors.Is判断error是否Wrap不符合预期 …...
【干货,实战经验】nginx缓存问题
文章目录 案例背景出现的问题:定位到问题解决方式修改配置修改后的nginx配置 案例背景 有2个服务器A 和B,A是一个动态ip经常变公网ip,B是一个云服务器,公网ip固定. 于是我通过ddns ,找了个域名C,动态解析A服务器上的公…...
分布式理论:CAPBASE理论
1 CAP理论 1.1 简介 CAP也就是Consistency(一致性)、Availability(可用性)、Partition Tolenrance(分区容错性)这三个单词首字母组合。 在理论计算机科学中,CAP定理(CAP theorem&…...
大数据学习(86)-Zookeeper去中心化调度
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
uniapp再次封装uni-nav-bar导航栏组件
<!-- components/custom-nav-bar/custom-nav-bar.vue --> <template><view class"custom-nav" :style"{ backgroundColor: bgColor }"><!-- 状态栏占位 --><view class"status-bar" :style"{ height: statusBar…...
ngx_http_index_t
定义在 src\http\modules\ngx_http_index_module.c typedef struct {ngx_str_t name;ngx_array_t *lengths;ngx_array_t *values; } ngx_http_index_t; 该结构体用于 存储和解析 index 指令中单个索引文件的信息 ,支持静态…...
深入解析Flink Kafka Connector的分布式流数据采集架构与底层实现
目录 1. Flink Kafka连接器的分布式流采集架构 1.1 架构组成 1.2 分布式流模型 2. 数据分区分配策略 3. 为什么重写序列化和偏移量管理 3.1 与Flink分布式架构集成 3.2 与Flink检查点机制集成同时承接多级并行架构 3.3 OffsetsInitializer与细粒度偏移量控制 3.4 与Fl…...
vcd波形转仿真激励
我们使用vivado的ila抓取波形后,常常希望用该波形作为激励参与仿真。稍微复杂的项目中手动输入的工作量巨大,几乎是不可能采取的方式。我的方法是保存ila波形为vcd格式文件,用python解析vcd文件,转换成仿真激励的代码。 python代码…...
【STM32】知识点介绍二:GPIO引脚介绍
文章目录 一、概述二、GPIO的工作模式三、寄存器编程 一、概述 GPIO(英语:General-purpose input/output),即通用I/O(输入/输出)端口,是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、…...
【AI】NLP
不定期更新,建议关注收藏点赞。 目录 transformer大语言模型Google Gemma疫情网民情绪识别 整体框架 baseline构建 模型调参、模型优化、其他模型 数据trick、指标优化、magic feature 数据增强、伪标签、迁移学习 模型融合sklearn中TFIDF参数详解 频率阈值可以去掉…...
Go 代理爬虫
现在注册,还送15美金注册奖励金 --- 亮数据-网络IP代理及全网数据一站式服务商 使用代理服务器,通过 Colly、Goquery、Selenium 进行网络爬虫的基础示例程序 本仓库包含两个分支: basic 分支包含供 Go Proxy Servers 这篇文章改动的基础代码…...
【NLP 43、大模型技术发展】
目录 一、ELMo 2018 训练目标 二、GPT-1 2018 训练目标 三、BERT 2018 训练目标 四、Ernie —— baidu 2019 五、Ernie —— Tsinghua 2019 六、GPT-2 2019 七、UNILM 2019 八、Transformer - XL & XLNet 2019 1.模型结构 Ⅰ、循环机制 Recurrence Mechanism Ⅱ、相对位置…...
在普通用户下修改root用户密码
1 从普通用户切换到root用户 sudo -s 再输入密码。 2 输入passwd ,会提醒你输入当前用户密码,验证后会提醒你输入root用户密码。 3 切换到root用户,使用修改过的密码登陆。 4 成功进入root用户。...
【每日算法】Day 6-1:哈希表从入门到实战——高频算法题(C++实现)
摘要 :掌握高频数据结构!今日深入解析哈希表的核心原理与设计实现,结合冲突解决策略与大厂高频真题,彻底掌握O(1)时间复杂度的数据访问技术。 一、哈希表核心思想 哈希表(Hash Table) 是一种基于键值对的…...
go命令使用
查看配置信息 go env配置go国内源 export GO111MODULEon export GOPROXYhttps://goproxy.cn测试 go install github.com/jesseduffield/lazydockerlatesthttps://github.com/jesseduffield/lazydocker...
深入 SVG:矢量图形、滤镜与动态交互开发指南
1.SVG 详细介绍 SVG(Scalable Vector Graphics) 是一种基于 XML 的矢量图形格式,用于描述二维图形。 1. 命名空间 (Namespace) 命名空间 URI:http://www.w3.org/2000/svg 用途:在 XML 或 XHTML 中区分不同标记语言的…...
SPPAS安装及问题汇总
SPPAS下载地址 文件找不到,可能是MAC的自动化操作问题,解决方案有二: 方案一: 直接查看SPPAS中的readme,运行sppas.command 方案二: 在自动化脚本中添加 export PATH/usr/local/bin:$PATH...
LINUX基础 [三] - 进程创建
目录 前言 进程创建的初次了解(创建进程的原理) 什么是fork函数? 初识fork函数 写时拷贝 fork函数存在的意义 fork调用失败的原因 进程终止 运行完毕结果不正确 main函数返回 库函数函数exit 系统调用接口_exit 进程异常终止 进…...
【day1】数据结构刷题 链表
一 反转链表 206. 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]…...
鼠标在客户区内按下左键和双击右键
书籍:《Visual C 2017从入门到精通》的2.6鼠标 环境:visual studio 2022 内容:【例2.44】鼠标在客户区内按下左键和双击右键 1.创建一个单文档程序 一个简单的单文档程序-CSDN博客https://blog.csdn.net/qq_20725221/article/details/1463…...
c++ map和vector模板类
在这一章中C语法之模板函数和模板类-CSDN博客 我们学习了怎样写模板函数和模板类,接下来我们来学习系统给我们写好的两个模板类:map和vector。 我相信有了上文的基础,能帮助我们更好的理解这些模板类。 map和vector 是C STL(标准模板库) 中的一部分&a…...
hn航空app hnairSign unidbg 整合Springboot
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向分析 学习unidbg补环境。先弄一个…...
Arm Linux ceres库编译
由于工作需要,需在国产化系统上编译ceres库,手上有一块树莓派,就在树莓派上面进行测试编译ceres库,总体来说比较顺利。只出现了一点小问题 参考链接: Ceres中文教程-安装 Ceres官方网站(英文) …...
c++中的四种cast转换
文章目录 前言一、dynamic_cast二、static_cast三、const_cast四、reinterpret_cast总结 前言 C继承并扩展C语言的传统类型转换方式,提供了功能更加强大的转型机制(检查与风险) 转换类型典型用途安全性static_cast相关类型转换(…...
矩阵补充,最近邻查找
矩阵补充,最近邻查找 矩阵补充是向量召回最简单的一种方法,现在不常用,学习矩阵补充是为了更好的理解后面学到的双塔模型 下图,输入用户ID和物品ID后从Eebedding层拿到对应的向量做内积,内积的结果就是矩阵补充 模型…...
gradio调用多个CSS的HTML页
很多博客介绍的gradio读取html和css比较简单,如果要做很细致的前端页面优化,比如丰富的响应式的cssjs,至少要有html多个css,是暂不能实现的。bootstrap、font-awesome、jquery等 方案一当然是直接更换htmlcss为主的部署方式&#…...
