• IPv6和Ipv4笔记分享
    使用 IPv6 的核心原因是解决 IPv4 地址枯竭问题,同时在性能、安全、管理、扩展性等维度全面优化,适配物联网、5G、云计算等新兴场景的需求。1. 地址空间极大扩展(最核心优点)IPv4 痛点:仅 32 位地址(约 43 亿个),早已分配殆尽,只能通过 NAT(网络地址转换)让多个设备共享一个公网 IP,导致端到端通信受阻。IPv6 优势:128 位地址空间(约 3.4×10³⁸个),相当于给地球每粒沙子分配数万亿个 IP,彻底告别地址短缺。支持 “每台设备一个公网 IP”,无需 NAT 转发,简化网络架构;适配物联网场景(如智能家居、工业传感器),可直接为海量终端分配独立 IP,无需复杂的地址转换策略。2. 路由效率大幅提升,减少网络的延迟IPv4 痛点:公网路由表条目已超百万条,路由器转发时需遍历大量条目,增加延迟和硬件负载。IPv6 优势:地址聚合能力强:IPv6 地址按运营商、区域规划,路由表可大幅精简(预计仅需数万条),转发效率提升 50% 以上;取消广播地址:用 “组播 + 任播” 替代广播,减少网络广播风暴,降低带宽浪费。3. 内置安全机制,无需额外的部署IPv4 痛点:安全依赖第三方协议(如 IPsec),且多为可选配置,多数网络未启用,易受攻击。IPv6 优势:强制集成 IPsec(AH/ESP 协议),天生支持身份认证、数据加密和完整性校验,从网络层保障通信安全;内置隐私保护:支持 “临时 IPv6 地址” 机制,终端可动态切换对外暴露的 IP,防止被追踪。4. 简化网络配置与管理IPv4 痛点:需手动配置 IP 或依赖 DHCP 服务器分配,终端移动时需重新获取地址,管理复杂。IPv6 优势:支持无状态地址自动配置(SLAAC):终端通过路由器广播的前缀信息,自动生成 IPv6 地址,无需 DHCP 服务器;地址结构清晰:IPv6 地址包含网络前缀、接口标识等信息,便于运维人员定位设备位置,故障排查效率提升。5. 原生支持端到端通信,适配新兴场景IPv4 痛点:NAT 会隐藏终端的真实 IP,导致 P2P 通信(如视频通话、文件传输)、远程桌面、游戏联机等场景需额外穿透技术(如 UPnP),稳定性差。IPv6 优势:终端直接拥有公网 IP,无需 NAT 穿透即可实现端到端通信,适配:5G 场景:手机、VR 设备等可直接与云端、边缘节点建立低延迟连接;工业互联网:设备间直接通信,无需中间转发,保障实时控制指令的传输效率。6. 更强的扩展性与未来兼容性IPv4 痛点:协议头字段固定,扩展能力弱,新增功能(如 QoS、移动性支持)需修改协议本身,兼容性差。IPv6 优势:采用 “基本头 + 扩展头” 设计,基本头固定(40 字节),扩展头可按需添加(如路由头、逐跳选项头),支持新增功能时不影响现有设备;原生支持移动 IPv6 协议:终端在不同网络间切换(如手机从家庭 WiFi 切换到 5G)时,IP 地址保持不变,会话不中断,移动性体验更优。7. 降低网络运营成本IPv4 痛点:NAT 设备、DHCP 服务器、地址管理系统等增加了硬件采购和运维成本;地址短缺导致企业需高价购买公网 IP。IPv6 优势:无需 NAT 设备和复杂的地址管理系统,减少硬件投入;地址免费分配,企业无需额外购买公网 IP,长期运营成本降低 30% 以上。总结一下下:IPv4 与 IPv6 核心差异表对比维度IPv4IPv6地址空间32 位(约 43 亿个),已枯竭128 位(约 3.4×10³⁸个),无限量路由效率路由表庞大,转发延迟高地址聚合强,路由表精简安全性依赖第三方协议,可选配置内置 IPsec,强制安全配置复杂度需 DHCP 或手动配置,复杂支持 SLAAC,自动配置端到端通信受 NAT 限制,需穿透原生支持,无需转发适配场景传统 PC、手机(少量设备)物联网、5G、云计算(海量设备)随着 5G、物联网、云计算的普及,IPv4 已成为技术瓶颈,IPv6 是必然的升级方向。目前全球 IPv6 活跃用户占比已超 40%,国内三大运营商也在加速 IPv6 部署,未来所有新设备和网络服务都将基于 IPv6 构建。 
  • [技术干货] 网络I/O阻塞:为什么程序会“卡住“等待?-转载
    一、网络I/O阻塞:数字世界的"堵车"现象想象快递运输: 🚚 你的程序 = 发货仓库🛣️ 网络 = 高速公路📦 数据包 = 运输货车🚧 阻塞 = 高速封路,货车无法移动  二、网络I/O阻塞的四大元凶1. 网络延迟:光速的枷锁  典型延迟场景: 本地网络:1-10ms跨城市:20-50ms跨国通信:100-300ms卫星通信:500ms+2. 带宽限制:数据高速路的车道数连接类型 理论带宽 实际带宽4G移动网络 100 Mbps 20 Mbps家庭宽带 300 Mbps 100 Mbps企业专线 1 Gbps 800 Mbps数据中心 10 Gbps 9.5 Gbps3. 协议握手:繁琐的"安检流程"TCP三次握手过程:   4. 流量控制与拥塞控制  三、阻塞式I/O:程序如何"卡住"1. 阻塞I/O工作流程  2. 阻塞代码示例(Python)import socket   # 创建阻塞socket  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  sock.connect(('example.com', 80))   # 程序在此阻塞,直到连接完成  sock.send(b'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n')   # 程序在此阻塞,直到数据到达  response = sock.recv(4096)  # 卡住!  print("收到响应:", response[:100])  运行本项目python运行 四、阻塞的代价:资源浪费阻塞 vs 非阻塞资源消耗对比  阻塞I/O的致命问题: 每个连接需要独立线程线程上下文切换开销大内存消耗随连接数线性增长CPU大量时间浪费在等待五、突破阻塞:四种I/O模型1. 阻塞I/O(Blocking I/O)  2. 非阻塞I/O(Non-blocking I/O)  代码示例: sock.setblocking(False)  # 设置为非阻塞   try:      data = sock.recv(1024)  except socket.error as e:      if e.errno == errno.EAGAIN:          # 没有数据,先做其他事          do_other_tasks()   3. I/O多路复用(I/O Multiplexing)  epoll工作流程:   4. 异步I/O(Asynchronous I/O)  六、高并发解决方案演进网络服务器模型发展史  七、现代解决方案:突破阻塞的技术1. 事件驱动架构(Event-Driven)  2. 协程(Coroutines)# Python asyncio示例  import asyncio   async def fetch_data():      reader, writer = await asyncio.open_connection('example.com', 80)      writer.write(b'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n')      await writer.drain()  # 非阻塞等待发送完成      data = await reader.read(4096)  # 非阻塞等待数据      print(data[:100])   # 同时处理多个任务  asyncio.run(asyncio.gather(fetch_data(), fetch_data(), fetch_data()))  运行本项目3. 多路复用技术对比技术 最大连接数 时间复杂度 触发方式 平台select 1024 O(n) 轮询 跨平台poll 无限制 O(n) 轮询 Linuxepoll 无限制 O(1) 事件通知 Linuxkqueue 无限制 O(1) 事件通知 BSD/macOSIOCP 无限制 O(1) 事件通知 Windows4. io_uring:Linux最新异步接口 优势: ⚡ 零拷贝数据传输📊 批量操作提交💾 支持所有I/O类型(网络/磁盘等)八、实战:构建非阻塞服务端Python异步HTTP服务器from aiohttp import web   async def handle(request):      # 模拟数据库查询(非阻塞)      await asyncio.sleep(1)      return web.Response(text="Hello Non-Blocking World!")   app = web.Application()  app.add_routes([web.get('/', handle)])   if __name__ == '__main__':      web.run_app(app, port=8080)  Go语言协程示例package main   import (      "net/http"      "time"  )   func handler(w http.ResponseWriter, r *http.Request) {      // 每个请求在独立协程运行      time.Sleep(1 * time.Second) // 模拟I/O操作      w.Write([]byte("Hello from Goroutine!"))  }   func main() {      http.HandleFunc("/", handler)      http.ListenAndServe(":8080", nil) // 可处理数万并发  }  运行本项目go运行九、网络I/O优化黄金法则场景 推荐方案 工具/技术高并发连接 I/O多路复用 + 非阻塞 epoll/kqueue + 事件循环计算密集型 线程池 + 阻塞I/O Java ThreadPool混合型应用 协程 Go goroutine, Python asyncio超高性能场景 用户态协议栈 DPDK, XDP分布式系统 异步RPC gRPC, RSocket十、未来趋势:告别阻塞的新技术1. 内核旁路(Kernel Bypass)  2. QUIC协议:TCP的替代者突破性改进: 0-RTT快速连接多路复用无队头阻塞前向纠错减少重传3. 可编程网络硬件+---------------------+  | SmartNIC            |  | 执行TCP/IP协议栈    |  | 处理加密/压缩       |  | 过滤恶意流量        |  +---------------------+   十一、总结:I/O模型演进图  💡 核心洞见: 网络I/O阻塞本质是等待数据到达传统阻塞模型在高并发场景效率低下多路复用和异步I/O是解决之道协程提供最佳开发体验未来属于用户态网络栈和可编程硬件思考题:为什么游戏服务器通常选择UDP而非TCP?评论区分享你的见解! 🚀 性能挑战:测试你的网络延迟: # Linux/Mac:  ping -c 10 google.com   # Windows:  ping -n 10 google.com  运行本项目 理解网络I/O阻塞,你就掌握了高性能编程的钥匙!现在尝试用非阻塞方式重写你的下一个网络应用吧!————————————————                             版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        原文链接:https://blog.csdn.net/qq_44378083/article/details/150469696
  • [HDC2025] HDC2025抢票攻略:网络优化与设备调优指南
    引言HDC华为开发者大会一票难求?面对抢票,除了拼手速,更是一场网络性能的较量。本文从技术角度出发,教你如何通过优化网络环境和设备配置,最大限度提升抢票成功率!一、网络层优化:低延迟为王物理链路选择有线优先:弃用Wi-Fi直连千兆有线网络,减少无线干扰和握手延迟。5G备用:若必须用移动网络,用花瓣测速找到基站信号强度≥-85dBm的位置。DNS加速使用中国公共DNS(114.114.114.114)等,避免运营商DNS递归查询耗时。Hosts强制解析:提前5分钟通过ping获取HDC官网IP,写入本地Hosts文件(例:xx.xx.xx.xx developer.huawei.com)。协议栈调优禁用IPv6(视具体网络情况决定):若网络环境IPv6支持不完善,可能增加DNS解析耗时。二、设备性能调优浏览器极致配置内核选择:Chrome/Edge等Chromium内核浏览器,禁用所有扩展(广告拦截插件可能误杀抢票请求)。内存预加载:Chrome地址栏输入chrome://flags/#prefetch-resources启用预加载。系统级优化关闭后台进程:通过任务管理器结束非必要进程(尤其占带宽的更新服务、P2P软件)。电源模式:笔记本切换至“最佳性能”,在BIOS里禁用CPU节能(C-States)。硬件加速启用浏览器的硬件加速(chrome://settings/system)。若使用虚拟机抢票,分配独占CPU核心并启用VT-d直通(华为云Flexus X实例开启性能模式深度绑核)。三、硬件设备选型指南(专业级建议)1. 网卡性能榜★★★★★ | 企业级网卡(例如Intel X170)★★★★☆ | 2.5G USB网卡(例如RTL8156B),千兆PCIe网卡(例如I225-V)★★☆☆☆ | 笔记本内置WiFi6网卡,(例如AX201/AX210,仅限5GHz信道纯净环境)⚠️避免使用 | 百兆网卡/USB2.0网卡(带宽瓶颈 )2. 设备类型推荐排序Tier 1 - 企业级设备服务器:华为2288H V5(配置10G网卡)工控机:研华ARK-3532(低延迟中断处理)Tier 2 - 高性能消费级台式机:Intel 12代及以上CPU + 高频内存 (中低端CPU中Intel比AMD运存性能更好,高端例如285K和9800X3D差不多)笔记本:雷电4接口+外接2.5G网卡(需关闭节能模式)Tier 3 - 移动设备手机:华为Mate 70系列(麒麟9020)平板:不建议主战设备(移动端浏览器操作不便)3. 其他加成时钟同步:通过设置同步Internet时间电磁干扰:使用内外双屏蔽网线(Cat6A超六类及以上),磁环过滤USB网卡信号噪声你有哪些抢票黑科技?欢迎在评论区分享实测有效的优化方案!
  • [技术干货] 华为云广域网监控方案:实时拨测DNS/IP/API等可用性
        1 背景概述:在数字化时代,网络和服务的稳定性至关重要,通过拨测功能监控目标对象的可用性,确保业务稳定运行,提升企业效率和用户体验。在数字化浪潮席卷之下,网络与服务的稳定性已成为社会秩序平稳运行的基石。任何网络或服务的突发故障,深度影响社会的整体运作、企业的持续运营以及民众日常生活的品质,其所造成的损失往往难以计量。如2022年12月阿里云香港可用区C的服务中断,故障持续了12个小时以上,对众多依赖其服务的企业日常运营造成了前所未有的挑战与困扰。因此,拨测作为网络性能监控中的关键功能,通过遍布全国的网络探测节点,模拟用户的实际请求来检测目标服务、DNS或IP地址等对象。这种主动式的网络测试能够监控目标对象在不同地理位置和运营商网络环境下的可用性、性能以及用户体验。利用这一功能,不仅可以加快故障识别与定位的速度,还能够帮助企业优化网络资源分配和访问路径,进而提高整体业务效率和用户满意度。本文主要介绍拨测的应用场景和主要功能,所有功能和截图都来自于华为云云监控的拨测产品:广域网质量监控。2 典型场景介绍广域网质量监控主要用于模拟真实用户发送对远端服务器的访问,从而探测远端服务的可用性、网络的连通性等场景。场景一:服务可用性监控从全国不同城市的运营商节点定期检查网站是否可访问,以便于提前预警可能影响业务连续性的风险。同时支持用户对探测结果是否“可用”的自定义断言规则,包含响应延时,状态码,响应 body 的内容匹配等。场景二:网络可用性分析通过使用广域网质量监控功能配置定时PING探测任务,根据需要选择发起探测的不同地域运营商探测节点。(详细请参见:探测点的分布)运行后可以观察到不同地域的运营商线路到目标服务的网络时延情况。帮助决策者制定有效的链路优化和网络产品部署决策,如游戏用户比较关注的运营商链路性能分析等。3 产品介绍概述:广域网质量监控通过遍布全国的互联网终端探测节点,发送模拟真实用户访问的探测请求,帮助用户监控全国各省市运营商机房到客户服务站点的网络连通情况。广域网质量监控归属于华为云监控(CES),使用广域网质量监控,可免费使用CES的视图、告警模块,与云上资源监控深度融合、打通。通过使用不同的网络层协议模拟用户的在线行为来分析互联网服务和网络的表现,并通过分析延迟、丢包率等关键指标优化用户体验。当前支持的监控类型:HTTP、HTTPS、PING、TCP、UDP、DNS。当前支持的监控指标:丢包率、响应时间、HTTP响应码、可用性、可用探测点数量、可用探测点百分比。3.1 能力介绍全方位布局运营商探测点,多元探测按需调控,故障链路可视化呈现,快速定位异常。丰富全面的探测点覆盖:         全国地域内多个运营商拨测探针发现区域性故障;IDC探测点/家宽PC/手机4G5G多类型探测发现特定接入类型故障。按需调频,按量计费:         频率最快可达秒级探测;根据业务敏感度灵活调配探测机制和频率。广域网故障链路可视:         广域网逐跳路径展示,快速诊断异常断点。3.2 如何使用初次体验广域网质量监控?别担心,仅需简单几步。先登录云监控服务 CES,选定 “网络性能监控>广域网质量监控”即可开通。计费按实际使用量计算,清晰透明。快来试试吧!说明:开通广域网质量监控不会产生任何费用,当用户使用广域网质量监控功能时,将按照实际使用量进行计费。广域网质量监控目前在公测阶段,如需开通,请先点击提交工单申请公测(每日审批公测名单)。操作步骤:1、登录云监控服务 CES,点击免费使用,进入CES产品主页。2、在左侧导航栏,选择“网络性能监控 > 广域网质量监控”。3、在首次使用广域网质量监控前,需要单独开通。单击“立即开通”,详情参见:开通广域网质量监控。4、在“开通广域网质量监控”页面,可查看计费模式和计费说明。单击“立即开通”,即可开通。在“开通成功”页面,单击“确定”。3.3 计费标准广域网质量监控支持以下两种计费方式:按需计费 计费方式探测点类型探测点位置单价(元/次)按需计费PC端中国0.001PC端海外0.005包月资源包计费:请参见购买广域网质量监控资源包。 计费方式规格(次/月)总价(元/月)单价(元/万次)资源包计费(包月)3000001万885万40820万160850万4008100万7507.5150万11257.5200万14007 4 总结网络与服务的稳定性占据着举足轻重的地位,拨测技术作为保障网络和服务稳定性的有力武器,助力企业实现主动式监控,全方位洞察服务的可用性、性能瓶颈等问题。通过合理选择分布的探测节点,制定多层次的拨测策略,企业得以构建起一套严密的监测防护网,能够精准捕捉潜在故障。同时,依据拨测数据的深度分析,企业还能对资源配置进行精细化调整,消除冗余,提升效能,实现业务流程的高效流转。最终,为企业呈上更加稳定可靠、流畅便捷的服务。 最后 欢迎大家来体验来自华为云云监控的拨测产品,产品入口:云监控服务 CES
  • [技术干货] 工业交换机与普通交换机的区别
    在现代物联网的建设和发展中,网络设备扮演着重要的角色。交换机作为网络设备中的一种,被广泛应用于各个领域。在工业控制系统中,与普通交换机相比,工业交换机具有独特的特点和功能。本文将从以下几个方面来介绍工业交换机与普通交换机的区别。第一,工作环境的差异。普通交换机通常应用于办公楼、家庭等相对稳定的环境中,而工业交换机则需要适应更恶劣的工业环境。工业交换机能够在极端的温度、湿度、尘土等条件下正常运行,具备更高的抗干扰能力和可靠性。这是由于工业交换机的外壳材料、散热设计、防尘防水等方面进行了特殊工艺处理。第二,通信协议的不同。普通交换机通常采用常见的以太网协议,而工业交换机能够支持更多的工业通信协议,如Modbus、PROFINET、Ethernet/IP等。这使得工业交换机能够和其他工业设备进行无缝衔接,满足工业现场对于实时性、可靠性的要求。第三,网络管理的需求。普通交换机通常只支持基本的网络管理功能,如端口的开启和关闭、VLAN的划分等。而工业交换机则具有更丰富的网络管理功能,如SNMP协议、RSTP协议、QoS等。这些功能可以帮助监控和维护人员更好地管理和调度网络,确保工业控制系统的稳定运行。第四,可靠性要求的不同。普通交换机在传输数据时往往存在丢包、延迟等问题,而工业交换机则具备更高的数据传输可靠性。工业交换机采用的存储转发技术和流控制技术,可以有效地防止数据在传输过程中的丢失和错误。此外,工业交换机还支持环网冗余技术,当网络中某一部分发生故障时,可以自动切换到备份链路,确保网络的可用性。工业交换机与普通交换机在工作环境、通信协议、网络管理和可靠性等方面存在较大的差异。在工业控制系统的构建中,选择适合的交换机类型对于系统的稳定运行至关重要。因此,在实际应用中,我们需要根据需求和环境的特点,选择合适的交换机类型,以确保网络的稳定性和可靠性。
  • [行业资讯] 我国计划 2035 年完成下一代北斗卫星导航系统建设
      据央视新闻报道,中国卫星导航系统管理办公室 11 月 28 日上午在京组织召开纪念北斗卫星导航系统工程建设三十周年座谈会。座谈会上发布了《北斗卫星导航系统 2035 年前发展规划》。  按照计划:  2025 年完成下一代北斗系统关键技术攻关;  2027 年左右发射 3 颗先导试验卫星,开展下一代新技术体制试验;  2029 年左右开始发射下一代北斗系统组网卫星;  2035 年完成下一代北斗系统建设。  按照规划,未来在确保北斗三号系统稳定运行基础上,中国将建设技术更先进、功能更强大、服务更优质的下一代北斗系统。下一代北斗系统以“精准可信、随遇接入、智能化、网络化、柔性化”为代际特征,将为全球用户和其他定位导航授时系统提供覆盖地表开阔空间及近地空间的米级至分米级实时高精度、高完好的导航定位授时服务。  据了解,下一代北斗系统将:  优化星座架构,形成高中低轨混合星座,全面提升时空基准维持精度和自主运行能力,持续提升服务性能;  建设集成高效的一体化地面系统,实现资源弹性调度、数据共享使用、业务连续运行;  覆盖地表至深空的各类用户终端,以及与其他不依赖卫星的定位导航授时手段融合的各类用户终端,实现用户多场景、高精度、智能化使用。
  • 【话题交流】路由与交换技术知识专题——看看大家对路由与交换技术识知多少
    2024.11月 本月话题:路由与交换技术知识专题目前,随着IT技术的不断发展,知识的不断更新迭代,大家讨论讨论说说看看大家对路由与交换技术方面的知识掌握多少,看看大家对目前路由与交换技术的了解以及应用看看谁才是无所不知的万能知识小能手!
  • [问题求助] 本地与多个区域云服务器互联互通,如何解决?
    本地与云服务器互联互通,如何解决?本地与A区云服务通过专线互联,A区云服务器与B区服务器通过云专线互联。B区服务器需要与本地互联(最好直接互联互通,有1000个端口要互通),求问各位专家应该如何操作?
  • [技术干货] 网络:UDP协议-转载
     前言 本文是对UDP协议的知识总结  UDP协议 UDP协议格式如下:  16位源端口号:标识发送数据报的应用程序所在的端口。 16位目的端口号:标识接收数据报的应用程序所在的端口。 16位UDP长度:表示整个UDP数据报的长度,包括UDP头部和数据部分。 16位UDP检验和:表示整个UDP数据报的长度,包括UDP头部和数据部分。 这里我们有几个问题?  报头和有效载荷分离的问题 UDP协议使用固定报头长度(8字节)的方式,来分离报头和有效载荷。  有效载荷向上交付的问题,也就是交给哪个进程? UDP报头字段中16位目的端口号就是标识接受数据报的进程。  怎么确定把报文收全了? UDP协议,对于小于8字节的报文会直接丢弃,毕竟光是UDP报头大小就是8字节;对于大于8字节的报文,会用 16位UDP长度 - 报头大小 = 数据长度 和 16位UDP检验和 的方式来确定报文是否收全。  UDP报头是如何封装的呢? 报头是一个结构化字段,也就是结构体。  如果我们一次接受大量的UDP报文,那操作系统要不要对这些报文进行管理?要进行管理。如何管理?先描述,在组织。内核中,为了管理报文,定义了sk_buff结构体。  知道了上面两个结构体,我们就可以以使用 udp 发送 hello 给127.0.0.1:8888为列子,来了解UDP报头是如何封装的。  定义一个 sk_buff 和 一个缓冲区。刚开始 data 和 tail指向同一个地址。  data指针向前移动5个字节(hello 的长度),也就是开辟了5个字节的空间,然后,将 hello 从用户层拷贝到内核层。  定义一个 struct udphdr 结构体,在将16位原端口号,16位目的端口号,16位UDP长度,16位UDP检验和信息填充。然后,data再前移8个字节,再见报头字段拷贝到缓冲区。  到这里,对报文进行UDP封装就完成了。 以下是 linux-2.6.11.10下的udphdr结构体 和 sk_buff结构体   UDP特点 无连接:知道对端的IP和端口号就直接进行传输,不需要建立链接 不可靠:没有确认应答机制,没有重传机制,如果因为网络故障导致报文无法发到对方,UDP协议也不会给应用层返回任何错误信息 面向数据报:不能够灵活的控制读写数据的次数和数量(应用层交给UDP多长的有效载荷,UDP会加上报头直接发送,不会拆分,也不会合并) UDP的缓冲区 UDP没有真正意义上的发送缓冲区,调用sendto会直接交给内核,由内核将数据传给网络层协议进行后续传输动作 UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报文的顺序和发送UDP报文顺序的一致;如果缓冲区满了,再到达的接收端主机的UDP报文就会被丢弃 基于UDP的应用层协议 NFS:网络文件系统 TFTP:简单文件传输协议 DHCP:动态主机配置协议 BOOTP:启动协议 DNS:域名解析协议 总结 以上就是我对于UDP协议的知识总结 ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/li209779/article/details/142261253 
  • [技术干货] 什么是代理IP_如何建立代理IP池?-转载
     1. 概述 日常浏览互联网时,是否遇到过访问某些网站(如GitHub)非常缓慢?是否遇到过某些网站(如OpenAPI)停止服务?这些问题有时就可以通过使用代理IP来解决。那么,什么是代理IP呢?这篇文章将以通俗易懂的语言,解释关于代理IP的一切,包含概念、作用、代理IP池,以及如何使用它们。  1.1 什么是代理IP? 简单来说,代理IP就是一种中介,帮我们访问互联网资源,而不是直接通过我们自己的IP地址去访问。当我们通过浏览器访问一个网站时,网络请求会包含我们的IP地址,这就是我们在网络上的“身份标识”。然而,有时我们可能不想暴露自己的IP地址,或者访问某些因为地区差异而导致无法直接访问的网络公开信息,此时,代理IP就派上用场了。 举个简单的例子,就懂了:当我们购买二手房,一般都是通过某家房产中介去带头我们查找房源并和原房东取得联系,并不是我们自己查找房源,这里房产中介的作用跟我们访问网络时使用到的代理IP是一样的。  1.2 代理IP的工作原理 我们可以把代理IP想象成一个“中间人”:  向代理服务器发送网络请求。 代理服务器接收到请求后,转而向目标网站发送请求。 目标网站把响应发送给代理服务器。 最后,代理服务器把响应内容传回给我们。 这样,目标网站看到的是代理服务器的IP地址,而不是我们的真实IP地址了,从而大大增强了爬虫操作的匿名性。代理IP是爬虫技术中的重要工具,它可以帮助我们合理地控制请求频率、提高请求效率、减少被目标网站识别和拦截的风险等,是构建高效爬虫系统的重要组成部分。 1.3 爬虫的应用场景 1.3.1 搜索引擎,最大的爬虫 爬虫的最典型应用就是搜索引擎。像我们平时常用的百度、必应、Google等搜索引擎,本质上就是一个超大规模的爬虫系统。这些庞大的爬虫系统全天候24小时会自动访问全球互联网网络,抓取内容,然后交由搜索引擎的索引系统留存处理。等到我们在Google或百度查询某关键词时,就能够从索引系统中找到相关的网站数据并进行展示了。  1.3.2 数据采集,市场分析利器 爬虫在数据采集和分析领域有着广泛的应用。企业可以利用爬虫技术从互联网上收集各种数据,如市场行情、竞争对手的动向、产品信息等,用于商业数据分析、市场调研等。同时,爬虫还可以用于科学研究、舆情分析等领域,为数据分析提供更多的信息来源。  1.3.3 舆情监控,品牌营销手段 舆情监控是企业常用的一种市场调研手段,通过对社交媒体、新闻网站等信息源进行监控和分析,了解公众对企业、产品或服务的舆论趋势。爬虫可以帮助企业及时获取各种网络信息,并进行分析和汇总,快速了解公众对企业的看法,及时处理负面舆情,制定合适的品牌营销策略。  1.3.4 价格监测,全网比价神器 在电商行业,价格是消费者购买产品时非常重要的考量因素。企业可以利用爬虫技术监测竞争对手的价格变化,也可以根据市场行情进行实时调整,以更好地制定价格和促销策略。而消费者也可以利用爬虫技术来监测商品价格的变动,以获取最优惠的购买时机。  2. 代理IP池 2.1 什么是代理IP池? 在上一章中,我们介绍了爬虫的一些常见应用场景,他们有2个共同的特点: 一是数据量巨大,二是需要频繁请求。 从安全性和稳定性等角度来说,一个运营成熟的站点,一般都具有验证机制,比如会限制短时间内来自同一ip地址/ip端的大量请求,严重的时候会直接拒绝来源ip的访问甚至上升到法律层面。   举个很实际的例子:据传,阿里内部网络已经被山姆识别并标记,使用阿里内部网络将无法访问山姆APP。这本质上就是企业的防护手段之一。  综上所述,使用单一的代理IP已经很难满足真实的爬虫需求,特别是在进行频繁的公开网页爬虫或大量数据抓取时,需要大量代理IP来帮助提高爬虫的效率。此时,代理IP池就显得尤为重要。代理IP池一般包含多个代理IP地址,可以按需从中取出使用,即可达到以下几个效果:  负载均衡:分散网络请求,防止单个IP被识别标记而无法进行爬虫任务。 提高稳定性:当某个代理IP不可用时,可以迅速轮换到其他可用的IP。 匿踪效果:通过代理服务器发起来自当地真实的请求,使得数据抓取时不易被检测到真实IP,从而达到匿名保护的效果。 提高效率:通过快速轮换IP地址,短时间内使用多个来源地IP实现大量公开数据抓取。 2.2 手动建立代理IP池 可以手动收集并维护一批代理IP,将它们存储在数组或数据库中,根据需要进行使用。 一个简单的示例代码(Python):  import requests import random  # 创建一个代理IP池 proxy_pool = [     'http://123.123.123.123:8080',     'http://124.124.124.124:8080',     'http://125.125.125.125:8080' ]  # 随机选择一个代理IP使用 proxy = random.choice(proxy_pool) proxies = {     'http': proxy,     'https': proxy }  url = 'http://www.baidu.com'  response = requests.get(url, proxies=proxies) print(response.content) 2.3 使用商用代理IP池 除了自建代理IP池之外,也可以选择跟代理IP池服务商合作,直接使用它们提供的大量代理IP。这些服务有付费和免费的,付费服务通常更加可靠和稳定,根据我实际测试,IPIDEA的代理ip池质量非常好,代理IP很纯净、运行稳定、不限并发、负载也很均衡,非常适合用于爬虫商业化应用开发。而且他们提供最高17.5G的免费测试,用来测试他们代理是否满足你的项目需求,足够了。  3. 获取代理IP并用于实战抓取 3.1 提取IP 完成IPIDEA的账号注册和实名认证之后(根据国家网络安全与个人信息保护的相关法律要求,需进行实名认证),免费测试额度就到账了。  如下图所示(看原文),到API提取页面提取IP。我先测试提取10组代理,格式直接使用txt。点击生成链接,就可以在右侧看到提取代理ip的地址了。 是我通过生成的链接提取到的10组代理ip地址: 3.2 案例实战:代理IP模式抓取亚马逊美国网站商品信息 我们将通过下面这段代码,使用前面获取到的代理IP列表,来抓取亚马逊美国站点关于MacBook的搜索商品信息,作为大数据分析的数据来源。  import requests import time import random from bs4 import BeautifulSoup import pandas as pd  # 代理IP字典 proxies = {     "https": "http://45.43.62.24:19217",     "https": "http://43.159.28.48:19335",     "https": "http://45.43.62.24:19219",     "https": "http://43.159.26.218:19038",     "https": "http://43.159.26.218:19040",     "https": "http://45.43.62.24:19216",     "https": "http://43.159.28.48:19336",     "https": "http://45.43.62.24:19218",     "https": "http://43.159.28.48:19337",     "https": "http://43.159.26.218:19039" }  # 请求头 headers = {     "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",     "Accept-Encoding": "gzip, deflate",     "Accept-Charset": "utf-8" }  def fetch_page_content(url):     response = requests.get(url, headers=headers, proxies=proxies, timeout=10)     return BeautifulSoup(response.text, "html.parser")  def extract_product_details(soup):     product_list = []     for item in soup.select(".s-result-item"):         try:             product_name = item.select_one(".s-line-clamp-2").get_text(strip=True)             product_price = float(item.select_one(".a-price .a-offscreen").get_text(strip=True).replace(",", "").replace("$", ""))             product_list.append({"name": product_name, "price": product_price})         except Exception as e:             continue     return product_list  def scrape_amazon(keyword):     search_url = f"https://www.amazon.com/s?k={keyword}"     soup = fetch_page_content(search_url)     all_products = extract_product_details(soup)     next_page_link = soup.select_one(".s-pagination-container .s-pagination-next a")          while next_page_link:         next_url = f"https://www.amazon.com{next_page_link.get('href')}"         soup = fetch_page_content(next_url)         all_products.extend(extract_product_details(soup))         next_page_link = soup.select_one(".s-pagination-container .s-pagination-next a")              return all_products  if __name__ == "__main__":     search_keyword = "MacBook"     product_data = scrape_amazon(search_keyword)     product_dataframe = pd.DataFrame(product_data)     product_dataframe.to_csv(f"{search_keyword}.csv", index=False) 结果如下图所示,我们就可以根据这些商品信息来进行分析,从而为我们自己的商品营销策略提供数据支撑。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QKWw44Gh-1722519946214)(https://i-blog.csdnimg.cn/direct/68adc667e8be45b680be304f69b8dfb9.png)]  4. 总结 合理使用代理IP不仅可以帮助我们保护隐私,还可以高效完成大量且复杂的爬虫任务。而IPIDEA代理IP池则进一步解决了单一代理IP的局限性,提供了更加稳定和高效的解决方案。无论是日常浏览还是复杂的数据抓取任务,理解并灵活运用代理IP能为我们带来巨大的帮助。但我们在执行爬虫任务时,也要需要遵守法规,遵守网站的使用政策,避免对网站造成不必要的压力或侵犯隐私等问题。 ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/g310773517/article/details/140689163 
  • [技术干货] 【网络】数据链路层-MAC帧-转载
     1.数据链路层 数据链路层是网络协议栈中最底层的内容,而在之前对其他层次的学习让我们知道传输层可以保证数据的可靠性问题,网络层保证数据跨网络转发的路由问题,而数据链路层解决的就是局域网内两台主机间通信的问题。   2.以太网 2.1什么是以太网 以太网属于一种局域网通信技术。  不同局域网所采用的通信技术可能是不同的,常见的局域网技术有以下三种:  以太网:以太网是一种计算机局域网技术,一种应用最普遍的局域网技术。 令牌环网:令牌环网常用于IBM系统中,在这种网络中有一种专门的帧称为“令牌”,在环路上持续地传输来确定一个节点何时可以发送包。 无线LAN/WAN:无线局域网是有线网络的补充和扩展,现在已经是计算机网络的一个重要组织部分。 虽然网络中各个局域网所采用的通信技术可能的不同的,但是IP屏蔽了底层网络的差异,对于网络通信双方的IP层及其往上的协议来说,它们并不关心底层具体使用的是哪种局域网技术。  网络中的路由器会不断去掉数据旧的局域网报头,并添加上新的局域网报头,因此数据在进行跨网络传输时,就算所需跨越的网络采用的是不同的局域网技术,最终也能够正确实现跨越。  (1)以太网通信原理  以太网”不是一种具体的网络,而是一种技术标准,它既包含了数据链路层的内容,也包含了一些物理层的内容。例如,以太网规定了网络拓扑结构,访问控制方式,传输速率等。 以太网中的网线必须使用双绞线,传输速率有10M,100M,1000M等。 以太网中所有的主机共享一个通信信道,当局域网中的一台主机发出数据后,该局域网中的所有主机都能够收到该数据。  比如当局域网中的主机A想要发送数据给主机B时,其实局域网当中的每一台主机都能收到主机A发出去的数据,只不过最终只有主机B会将主机A发来的数据向上进行交付。 局域网当中的其他主机虽然也收到了主机A发出的数据,但经过识别后发现这个数据不是发送给自己的,于是就会直接将该数据丢弃而不会向上进行交付。 (2)数据碰撞  由于以太网中的所有的主机共享一个通信信道,因此在同一时刻只允许有一台主机发送数据,否则各个主机发送的数据就会相互干扰。站在系统的角度来看,这里各个主机所共享的通信信道就是一种临界资源,这个临界资源同一时刻只允许一台主机使用。  对于这个问题,以太网的做法就是先不限制各个主机发送数据的能力,局域网中的每个主机想发数据的时候直接发就行了,但是只要发送出去的数据与其他主机发送的数据产生了碰撞,那就得执行碰撞避免算法。 所谓的碰撞避免算法就是,当主机发送出去的数据产生碰撞时,该主机需要等待一段时间后再进行数据重发,在主机等待的时候就能够就能够尽可能让局域网当中的数据消散。 一个局域网就是一个碰撞域。 (3)交换机  交换机通过维护一个MAC地址表来记录每个端口连接的设备的MAC地址。当数据帧到达交换机时,它会根据目的MAC地址查找MAC地址表,以确定将数据帧转发到哪个端口。这种机制减少了数据帧被错误地发送到多个端口的可能性,从而降低了碰撞的概率。  交换机支持VLAN技术,可以将网络划分为多个逻辑上独立的广播域。每个VLAN内的设备只能与同一VLAN内的其他设备通信,从而减少了广播流量和碰撞的可能性。  (4)令牌环网  令牌环网(Token-ring network)的传输方法在物理上采用了星形拓扑结构,但逻辑上是环形拓扑结构。 令牌环网的通信传输介质可以是无屏蔽双绞线、屏蔽双绞线和光纤等。 令牌环网中各节点间采用多站访问部件(Multistation Access Unit,MAU)连接在一起,MAU是一种专业化集线器,用来围绕工作站计算机的环路进行传输。 在令牌环网中有一种专门的帧称为“令牌”,这个“令牌”会在环路上持续地传输,只有拿到“令牌”的主机才能发送数据,因此发送出去的数据不会发生碰撞。  令牌环网当中的“令牌”就像系统当中用于保护临界资源的互斥锁一样,“令牌”与互斥锁一样也有“忙”和“闲”两种状态,“忙”表示令牌已经被占用,而“闲”则表示令牌没有被占用。 想要发送数据的计算机必须首先检测到“闲”令牌,并将其置为“忙”状态,然后才可以发送数据,这就和申请互斥锁的过程很像。 此外,由于“令牌”在网环上是按顺序依次传递的,因此对于所有入网的计算机而言,它们获取令牌的机会都是相等的,因此不会造成某台主机发送数据的饥饿问题。 2.2MAC帧格式 MAC帧是数据链路层的一种数据数据格式,用于在局域网(以太网)传递数据。   源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。 帧协议类型字段有三种值,分别对应IP协议(0800)、ARP协议(0806)和RARP协议(8035)。 帧末尾是CRC校验码。 (1)MAC帧如何将报头与有效载荷进行分离?  以太网MAC帧的帧头和帧尾都是固定长度的,因此当底层收到一个MAC帧后,直接提取出MAC帧当中固定长度的帧头和帧尾,此时剩下的就是有效载荷了。  (2)MAC帧如何决定将有效载荷交付给上层的哪一个协议?  以太网MAC帧对应的上层协议不止一种,因此在将MAC帧的报头和有效载荷分离后,还需要确定应该将分离出来的有效载荷交付给上层的哪一个协议。  在MAC帧的帧头当中有2个字节的类型字段,因此在分离出报头和有效载荷后,根据该字段将有效载荷交付给对应的上层协议即可。  (3)数据传输过程  假设局域网当中的主机A想要将IP数据报发送给同一局域网当中的主机B,那么主机A封装MAC帧当中的目的地址就是主机B的MAC地址,源地址就是主机A的MAC地址,而帧协议的类型对应就是0800,紧接着就是要发送的IP数据报,帧尾部分对应就是CRC校验。  当主机A将该MAC帧发送到局域网当中后,局域网当中的所有主机都可以收到这个MAC帧,包括主机A自己。  主机A收到该MAC帧后,可以对收到的MAC帧进行CRC校验,如果校验失败则说明数据发送过程中产生了碰撞,此时主机A就会执行碰撞避免算法,后续进行MAC帧重发。 主机B收到该MAC帧后,提取出MAC帧当中的目的地址,发现该目的地址与自己的MAC地址相同,于是在CRC校验成功后就会将有效载荷交付给上层IP层(0800)进行进一步处理。 局域网中的其他主机收到该MAC帧后,也会提取出MAC帧当中的目的地址,但发现该目的地址与自己的MAC地址不匹配,于是就会直接将这个MAC帧丢弃掉。 也就是说,当底层收到一个MAC帧后,会根据MAC帧当中的目的地址来判断该MAC帧是否是发给自己的,如果是发送给自己的则会再对其进行CRC校验,如果校验成功则会根据该MAC帧的帧协议类型,将该MAC交付给对应的上层协议进行处理,如果不是发送给自己的则在数据链路层直接将数据丢弃。  (4)认识MAC地址  MAC地址用来识别数据链路层中相连的节点。 长度为48位,及6个字节,一般用16进制数字加上冒号的形式来表示,例如:08:00:27:03:fb:19。 在网卡出厂时就确定了,不能修改,MAC地址通常是唯一的(虚拟机中的MAC地址不是真实的MAC地址,可能会冲突;也有些网卡支持用户配置MAC地址)。 我们可以通过ifconfig命令来查看我们的MAC地址。   ether:以太。  (5)对比理解MAC地址和IP地址  实际数据在路由过程中会存在两套地址,一套是源IP地址和目的IP地址,还有一套是源MAC地址和目的MAC地址。  IP地址描述的是数据通信总体的起点和终点。 MAC地址描述的是数据通信上的每一个区间的起点和终点。 比如唐僧取经,源IP地址就是东土大唐,目的IP地址就是西天,而源MAC地址就是取经路途上一个区间内的起点,目的MAC地址就是取经路途上一个区间内的终点。  因此数据在路由过程中,源IP地址和目的IP地址可以理解成是不会变化的(但实际上由于NAT技术,源IP地址也是会发生变化的),而数据每进行一跳后其源MAC地址和目的MAC地址都会变化。  (6)认识MTU  MTU(Maximum Transmission Unit,最大传输单元)描述的是底层数据帧一次最多可以发送的数据量,这个限制是不同的数据链路层对应的物理层产生的。  以太网对应MTU的值一般是1500字节,不同的网络类型有不同的MTU,如果一次要发送的数据超过了MTU,则需要在IP层对数据进行分片(fragmentation)。 此外,以太网规定MAC帧中数据的最小长度为46字节,如果发送数据量小于46字节,则需要在数据后面补填充位,比如ARP数据包的长度就是不够46字节的。 (7)认识MSS  由于数据链路层限制了单次数据传输的数据量(MTU),所以为了避免数据在网络层进行IP分片,我们应在传输层对向网络层交付的数据大小加以控制。  我们将TCP的单个数据报的最大报文长度,称为MSS(Max Segment Size)。  TCP通信双方在建立连接的过程中,就会进行MSS协商,最终选取双方支持的MSS值当中的较小值作为最终MSS。  MSS的值实际就是在TCP首部的40字节的选项字段当中的(kind=2)。  最理想的情况下,MSS的值正好就是在数据不会在IP层进行分片的最大长度。  MSS和MTU的关系如下:   3.ARP协议 地址解析协议(Address Resolution Protocol,ARP)协议,是根据IP地址获取MAC地址的一个TCP/IP协议。  3.1为什么有ARP协议? ARP 协议建立了主机 IP 地址 和 MAC 地址 的映射关系。  在网络通讯时,源主机的应用程序知道目的主机的 IP 地址和端口号,却不知道目的主机的硬件地址(MAC地址); 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃; 因此在通讯前必须获得目的主机的硬件地址。 3.2ARP的定位 在TCP/IP四层模型中,网络协议栈自顶向下分为应用层、传输层、网络层和数据链路层。  其中应用层最典型的协议有HTTP、HTTPS和DNS等,传输层最典型的协议有TCP和UDP,网络层最典型的协议就是IP,数据链路层最典型的协议就是MAC帧协议,但实际数据链路层还有两种协议叫做ARP和RARP。   ARP、RARP和MAC帧协议虽然都属于数据链路层的协议,但ARP协议和RARP协议属于MAC帧的上层协议。  也就是说,MAC帧的上层协议不一定就直接是网络层的协议,MAC帧的上层协议有可能也属于数据链路层的协议,但就是位于MAC帧的上层。  网络层当中的ICMP协议和IGMP协议,这两个协议虽然与IP协议都属于网络层,但这两个协议属于IP的上层协议。  3.3ARP协议工作流程  源主机发出 “ARP请求”,询问“IP 地址是 172.20.1.2 的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播)。 目的主机接收到广播的 ARP请求,发现其中的 IP 地址与本机相符,则发送一个 “ARP应答” 数据包 给源主机,将自己的硬件地址填写在应答包中; 每台主机都维护一个 ARP 缓存表,可以用arp -a命令查看。 缓存表中的表项有过期时间(一般为 20 分钟),如果 20 分钟内没有再次使用某个表项,则该表项失效,下次还要发 ARP 请求来获得目的主机的硬件地址。  3.4ARP数据格式  硬件类型指链路层的网络类型,1为以太网。 协议类型指要将什么类型的地址转换为MAC地址,0800为IP地址。 硬件地址长度对于以太网地址为6字节,因为MAC地址是48位的,该字段如果硬件类型为以太网,则填6。 协议地址长度对于IP地址为4字节,因为IP地址是32位的,该字段如果协议类型为IP,则填4。 op字段为1表示ARP请求,op字段为2表示ARP应答。 从ARP的数据格式也可以看出,ARP是MAC帧协议的上层协议,ARP数据格式中的前3个字段和最后一个字段对应的就是以太网首部,但由于ARP数据包的长度不足46字节,因此ARP数据包在封装成为MAC帧时还需要补上18字节的填充字段。  所以根据MAC帧中的类型字段,可以决定将该MAC帧交付给上层的哪一个协议:IP协议、ARP协议还是RARP协议。  4.RARP协议 RARP(Reverse Address Resolution Protocol,反向地址转换协议),是根据MAC地址获取IP地址的一个TCP/IP协议。  也就是说,某些情况下我们可能只知道一台主机的MAC地址,此时要得知该主机的IP地址就可以使用RARP协议。  理论上来说,RARP协议一定比ARP协议简单,因为既然我们已经知道一台主机的MAC地址了,那么我们就已经可以直接向给主机发送消息了,因此我们可以直接发消息询问对方的IP地址就行了。  不了解自我,我们的内心便没有办法得到完全的满足。 —斯瓦米·拉玛 ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/2301_77112634/article/details/141597539 
  • [技术干货] Gazelle网络
     Gazelle是一款高性能用户态协议栈。它基于DPDK(Data Plane Development Kit,数据平面开发工具集)在用户态直接读写网卡报文,共享大页内存传递报文,使用轻量级LwIP协议栈。能够大幅提高应用的网络I/O吞吐能力。专注于数据库网络性能加速,如MySQL、redis等。 高性能 报文零拷贝,无锁,灵活scale-out,自适应调度。 通用性 完全兼容POSIX,零修改,适用不同类型的应用。 单进程且网卡支持多队列时,只需使用liblstack.so,以缩短报文路径。其余场景使用ltran进程分发报文到各个线程。 安装 配置openEuler的yum源,直接使用yum命令安装。 yum install dpdkyum install libconfigyum install numactlyum install libboundscheckyum install libpcapyum install gazelle 使用方法 配置运行环境,使用Gazelle加速应用程序步骤如下:  使用root权限安装ko 根据实际情况选择使用ko,提供虚拟网口、绑定网卡到用户态功能。 若使用虚拟网口功能,则使用rte_kni.ko。 modprobe rte_kni carrier=“on” 配置NetworkManager不托管kni网卡。 [root@localhost ~]# cat /etc/NetworkManager/conf.d/99-unmanaged-devices.conf[keyfile]unmanaged-devices=interface-name:kni[root@localhost ~]# systemctl reload NetworkManager 网卡从内核驱动绑为用户态驱动的ko,根据实际情况选择一种。 #若IOMMU能使用modprobe vfio-pci#若IOMMU不能使用,且VFIO支持noiommumodprobe vfio enable_unsafe_noiommu_mode=1modprobe vfio-pci#其他情况modprobe igb_uio 说明: 可根据机器BIOS配置,查看是否启用IOMMU。 dpdk绑定网卡 将网卡绑定到步骤1选择的驱动。为用户态网卡驱动提供网卡资源访问接口。 #使用vfio-pcidpdk-devbind -b vfio-pci enp3s0#使用igb_uiodpdk-devbind -b igb_uio enp3s0 大页内存配置 Gazelle使用大页内存提高效率。使用root权限配置系统预留大页内存,可选用任意页大小。因每页内存都需要一个fd,使用内存较大时,建议使用1G的大页,避免占用过多fd。 根据实际情况,选择一种页大小,配置足够的大页内存即可。配置大页操作如下: #配置2M大页内存:在node0上配置 2M * 1024 = 2Gecho 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages#配置1G大页内存:在node0上配置1G * 5 = 5Gecho 5 > /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages 说明: cat查询实际预留页个数,连续内存不足时可能比预期少。 挂载大页内存 创建两个目录,分别给lstack进程、ltran进程访问大页内存使用。操作步骤如下: mkdir -p /mnt/hugepages-ltranmkdir -p /mnt/hugepages-lstackchmod -R 700 /mnt/hugepages-ltranchmod -R 700 /mnt/hugepages-lstackmount -t hugetlbfs nodev /mnt/hugepages-ltran -o pagesize=2Mmount -t hugetlbfs nodev /mnt/hugepages-lstack -o pagesize=2M 说明: /mnt/hugepages-ltran和/mnt/hugepages-lstack必须挂载同样pagesize的大页。 应用程序使用Gazelle 有两种使用Gazelle方法,根据需要选择其一。 重新编译应用程序,替换sockets接口 #makefile中添加Gazelle的Makefile-include /etc/gazelle/lstack.Makefile#编译添加LSTACK_LIBS变量gcc test.c -o test ${LSTACK_LIBS} 使用LD_PRELOAD加载Gazelle库 GAZELLE_BIND_PROCNAME环境变量指定进程名,LD_PRELOAD指定Gazelle库路径。 GAZELLE_BIND_PROCNAME=test LD_PRELOAD=/usr/lib64/liblstack.so ./test 配置文件 lstack.conf用于指定lstack的启动参数,默认路径为/etc/gazelle/lstack.conf,配置文件参数如下: 选项 参数格式 说明 dpdk_args --socket-mem(必需) –huge-dir(必需) –proc-type(必需) –legacy-mem –map-perfect -d dpdk初始化参数,参考dpdk说明 –map-perfect为扩展特性,用于防止dpdk占用多余的地址空间,保证ltran有额外的地址空间分配给lstack。 -d参数加载指定so库文件。 listen_shadow 0/1 是否使用影子fd监听。单listen线程,多协议栈线程时使能。 use_ltran 0/1 是否使用ltran 。 num_cpus “0,2,4 …” lstack线程绑定的cpu编号,编号的数量为lstack线程个数(小于等于网卡多队列数量)。可按NUMA选择cpu。 low_power_mode 0/1 是否开启低功耗模式,暂不支持。 kni_switch 0/1 rte_kni开关,默认为0。只有不使用ltran时才能开启。 unix_prefix “string” gazelle进程间通信使用的unix socket文件前缀字符串,默认为空,和需要通信的ltran.conf的unix_prefix或gazellectl的-u参数配置一致。不能含有特殊字符,最大长度为128。 host_addr “192.168.xx.xx” 协议栈的IP地址,也是应用程序的IP地址。 mask_addr “255.255.xx.xx” 掩码地址。 gateway_addr “192.168.xx.1” 网关地址。 devices “aa:bb:cc:dd:ee:ff” 网卡通信的mac地址,需要与ltran.conf的bond_macs配置一致。 app_bind_numa 0/1 应用的epoll和poll线程是否绑定到协议栈所在的numa,默认值是1,即绑定。 send_connect_number 4 设置为正整数,表示每次协议栈循环中发包处理的连接个数。 read_connect_number 4 设置为正整数,表示每次协议栈循环中收包处理的连接个数。 rpc_number 4 设置为正整数,表示每次协议栈循环中rpc消息处理的个数。 nic_read_num 128 设置为正整数,表示每次协议栈循环中从网卡读取的数据包的个数。 mbuf_pool_size 1024000 设置为小于5120000的正整数,表示初始化时申请的mbuf地址池大小,需要根据网卡硬件支持进行合理配置,配置过小会启动失败。 
  • [技术干货] 网络子系统性能调优
     调优思路 本章主要是围绕优化网卡性能和利用网卡的能力分担CPU的压力来提升性能。在高并发的业务场景下,推荐使用两块网卡,减少跨片内存访问的次数。即将两块网卡分别绑定在服务器的不同CPU上,每个CPU只处理对应的网卡数据。高并发场景还可以为网卡选择x16的 PCIe 卡。 二、 介绍 ethtool是一个Linux下功能强大的网络管理工具,目前几乎所有的网卡驱动程序都有对ethtool的支持,可以用于网卡状态/驱动版本信息查询、收发数据信息查询及能力配置以及网卡工作模式/链路速度等查询配置。 安装方式 以CentOS为例,使用如下命令安装: yum -y install ethtool net-tools 使用方式 命令格式:ethtool [参数] 常用参数如下: 参数 说明  ethX 查询ethx网口基本设置,其中x是对应网卡的编号,如eth0、eth1等。  -k  查询网卡的Offload信息。 -K 修改网卡的Offload信息。  -c 查询网卡聚合信息。  -C 修改网卡聚合信息。  -l 查看网卡队列数。  -L 设置网卡队列数。  输出格式:  ethtool -k eth0 Features for eth0: rx-checksumming: on tx-checksumming: on scatter-gather: on tcp-segmentation-offload: on ethtool -l eth0 Channel parameters for eth0: Pre-set maximums: … Current hardware settings: … Combined: 8 ethtool -c eth0 Coalesce parameters for eth0: Adaptive RX: off TX: off … rx-usecs:30 rx-frames:50 … tx-usecs:30 tx-frames:1 参数含义如下: 参数 说明 rx-checksumming 接收包校验和。 tx-checksumming 发送包校验和。 scatter-gather 分散-聚集功能,是网卡支持TSO的必要条件之一。 tcp-segmentation-offload 简称为TSO,利用网卡对TCP数据包分片。 Combined 网卡队列数。 adaptive-rx 接收队列的动态聚合执行开关。 adaptive-tx 发送队列的动态聚合执行开关。 tx-usecs 产生一个中断之前至少有一个数据包被发送之后的微秒数。 tx-frames  产生中断之前发送的数据包数量。 rx-usecs 产生一个中断之前至少有一个数据包被接收之后的微秒数。 rx-frames 产生中断之前接收的数据包数量。 三、 介绍 strace 是Linux环境下的程序调试工具,用来跟踪应用程序的系统调用情况。strace命令执行的结果就是按照调用顺序打印出所有的系统调用,包括函数名、参数列表以及返回值等。  安装方式 以CentOS为例,使用如下命令安装: yum -y install strace 使用方式 命令格式:strace [参数] 常用参数如下:  参数 说明 -T 显示每一调用所耗的时间。 -tt 在输出中的每一行前加上时间信息,微秒级。 -p 跟踪指定的线程ID。 输出格式: 18:25:47.902439 epoll_pwait(716, [{EPOLLIN, {u32=1052576880, u64=281463144385648}}, {EPOLLIN, {u32=1052693569, u64=281463144502337}}, {EPOLLOUT, {u32=1052638657, u64=281463144447425}}, {EPOLLIN|EPOLLOUT|EPOLLRDHUP, {u32=1052673241, u64=281463144482009}}, {EPOLLIN|EPOLLOUT|EPOLLERR|EPOLLHUP|EPOLLRDHUP, {u32=1052636016, u64=281463144444784}}], 512, 1, NULL, 8) = 5 <0.000038> 参数含义如下: 参数 说明 18:25:47.902439 为系统调用发生的时间。 epoll_pwait 为系统调用的函数名。 (716…)  括号内的值为函数参数。 =5 为系统调用的返回值。 <0.000038> 为系统调用的执行时间。 四、 原理 网卡自带的内存和CPU使用的内存进行数据传递时,是通过PCIe总线进行数据搬运的。Max Payload Size为每次传输数据的最大单位(以字节为单位),它的大小与PCIe链路的传送效率成正比,该参数越大,PCIe链路带宽的利用率越高。 Transaction Layer Packet Header  Data Payload ECRC 修改方式 按照进入BIOS界面的步骤进入BIOS,选择“Advanced > Max Payload Size”,将“Max Payload Size”的值设置为“512B”。
  • [问题求助] 接收POST上传的图片保存到服务器时出现格式不对的错误
    从模拟器相册中选择一个JPG图片,通过POST方式上传到服务器,服务器端用servlet负责接收,用servletInputStream输入流接收上传的图片内容,后来发现保存的图片格式不对,不知道哪里出了问题?
  • 网络设置问题
    乾坤终端的设置里面可以增加设置网络功能吗?比如通过代理上网