LWIP的IP 協議棧

IP 協議棧

下面的分析把上文對 IPv4 概念的說明與 lwIP 中的具體實現代碼對應起來,便于將理論與實現對照理解。分析覆蓋:輸入處理、路由與轉發、輸出與報文構建、分片/重組、校驗和與各種配置點(hook、選項、統計等)。


目錄(快速導航)

  • ip4_input:接收與分發流程
  • ip4_route / ip4_forward:路由與轉發決策
  • ip4_output_if / ip4_output:報文構建與發送
  • 校驗和(inet_chksum、CHECKSUM_GEN_IP_INLINE)
  • 分片(ip4_frag)與重組(ip4_reass)
  • 輔助邏輯:廣播/組播、DHCP 鏈路層地址接收、HOOKs、統計計數器

1. 接收流程(ip4_input)

對應代碼函數:ip4_input(struct pbuf *p, struct netif *inp)

主要步驟:

  • 基本驗證:
    • 檢查版本 IPH_V(iphdr) == 4,否則丟棄(并記錄錯誤)。
    • 計算首部長度 iphdr_hlen = IPH_HL_BYTES(iphdr),總長度 iphdr_len = lwip_ntohs(IPH_LEN(iphdr)),并用 pbuf_realloc/檢查 p->tot_len,防止長度不一致。
  • 校驗和:
    • 在 CHECKSUM_CHECK_IP 啟用且 netif 支持時,調用 inet_chksum(iphdr, iphdr_hlen) 檢查 IP 首部。
  • 地址拷貝與 netif 匹配:
    • 將 src/dest 拷貝到 ip_data.current_iphdr_*,調用 ip4_input_accept() 判斷本接口是否接受(檢查網卡是否 up、是否和本機 IP 匹配、廣播/回環等)。
    • 對組播,若啟用 IGMP,會查 igmp_lookfor_group() 決定是否接受。
    • 若 netif==NULL,且 IP_ACCEPT_LINK_LAYER_ADDRESSING 條件下,若目標為 DHCP 客戶端端口,也會接受(允許鏈路層尋址的 DHCP 報文)。
  • 源地址合法性檢查:
    • 拒絕源地址為廣播或組播的包(RFC 1122 要求)。
  • 非本機包處理:
    • 如果 netif == NULL(不是給本機),在啟用 IP_FORWARD 時調用 ip4_forward(),否則丟棄。
  • 分片處理:
    • 檢測 IP_MF 或偏移不為 0,即是分片,調用 ip4_reass()(若啟用 IP_REASSEMBLY)進行重組;若不啟用,直接丟棄。
  • IP 選項:
    • 若 IP_OPTIONS_ALLOWED == 0 且存在選項(除 IGMP router-alert 的特殊允許),則丟棄。
  • 分發到傳輸層:
    • pbuf_remove_header(p, iphdr_hlen) 將 payload 調到傳輸層頭部。
    • 根據 IP_PROTO 調用 udp_input/tcp_input/icmp_input/igmp_input 或 raw_input/返回 ICMP 不可達。
  • 清理與統計:
    • 使用 IP_STATS/MIB2 增加相應統計。

要點:

  • lwIP 在 ip 層只檢查 IP 首部檢驗和(傳輸層有自己的校驗),并在每個路由器處重新計算首部校驗和(因為 TTL 會被減 1)。
  • pbuf 是 lwIP 的緩沖結構,ip4_input 會對 pbuf 做裁剪(pbuf_realloc)和頭部移動(pbuf_remove_header)。
    在這里插入圖片描述
    ip數據報格式。

在這里插入圖片描述


2. 路由與轉發(ip4_route / ip4_forward)

  • ip4_route(const ip4_addr_t *dest)
    • 線性遍歷 netif 列表,檢查 netif 是否 up、link up 且有地址;用 ip4_addr_netcmp 與 netmask 比較判斷是否同網段。
    • 對多播有 ip4_default_multicast_netif 的支持(LWIP_MULTICAST_TX_OPTIONS)。
    • 若沒有找到合適的 netif,會嘗試 netif_default(并記錄 rterr)。
  • ip4_forward(struct pbuf *p, struct ip_hdr *iphdr, struct netif *inp)
    • 首先用 ip4_canforward() 檢查地址是否允許轉發(不轉發廣播、多播、實驗地址、回環等)。
    • 禁止轉發鏈路本地地址(RFC3927)。
    • 查找下一跳 netif = ip4_route_src(src, dest)(可能有源地址路由 hook)。
    • 防止在輸入 netif 上再次發出(可由 IP_FORWARD_ALLOW_TX_ON_RX_NETIF 控制)。
    • TTL–,若變為 0 則丟棄并發送 ICMP Time Exceeded(不對 ICMP 報文回復 ICMP)。
    • 增量更新首部校驗和(不必完全重算)。
    • 處理分片:若 p->tot_len > netif->mtu:
      • 若允許分片(DF 未置位)且 IP_FRAG 啟用,則調用 ip4_frag()。
      • 否則發送 ICMP Destination Unreachable (Fragmentation Needed)。
    • 最后調用 netif->output(netif, p, dest) 將數據放到鏈路層。

要點:

  • 轉發功能可選(IP_FORWARD 宏)。嵌入式通常按需啟用。
  • 增量校驗和更新是性能優化(僅因為 TTL 字段改變)。

3. 發送與報文構建(ip4_output_if / ip4_output)

對應函數:ip4_output_if_src / ip4_output_if / ip4_output

主要流程:

  • ip4_output():高層入口,先通過 ip4_route_src 找到合適 netif,然后調用 ip4_output_if()。
  • ip4_output_if():判斷是否需要生成 IP 首部(dest != LWIP_IP_HDRINCL)。
    • 若需要生成:
      • 可能插入 IP 選項(IP_OPTIONS_SEND),并把 pbuf 前面擴展出選項區與 IP_HLEN(pbuf_add_header)。
      • 填寫 IP 字段:版本、頭長、TOS、長度(p->tot_len)、標識(ip_id++)、偏移(0)、TTL、協議、源/目的地址。
      • 計算并填寫首部校驗和(支持 inline 計算或 inet_chksum,受 CHECKSUM_GEN_IP_INLINE、CHECKSUM_GEN_IP、NETIF_CHECKSUM_GEN_IP 控制)。
    • 若 dest == LWIP_IP_HDRINCL:p 已包含 IP 頭,直接使用 p->payload。
  • 回環與多播處理:
    • 若目標是本機地址或 loopback,則調用 netif_loop_output。
    • 若 IP_FRAG 啟用且 p->tot_len > netif->mtu,則調用 ip4_frag() 分片發送。
  • 最后調用 netif->output(netif, p, dest)。

要點:

  • ip_id 是靜態全局 u16_t,用于 IP 標識字段(RFC791 建議各實現可自有策略)。
  • LWIP 支持用戶提前構造 IP 頭(LWIP_IP_HDRINCL),或由棧自動構建。
  • netif->output 負責把 IP 包封裝到鏈路層(通常最終會調用 etharp_output 或底層驅動)。

4. 校驗和實現細節

  • IP 首部校驗和:
    • 接收時:CHECKSUM_CHECK_IP 宏控制是否在 netif 啟用硬件/軟件校驗時檢查;使用 inet_chksum(iphdr, iphdr_hlen)。
    • 發送時:CHECKSUM_GEN_IP 或 CHECKSUM_GEN_IP_INLINE 控制是否內聯計算校驗和或調用 inet_chksum。
    • LWIP_CHECKSUM_CTRL_PER_NETIF 允許 per-netif 配置是否生成/檢查校驗和。
  • 傳輸層校驗和(TCP/UDP)由各層自己計算/檢查。

要點:

  • 每次路由器處理需要修改 TTL,會相應更新首部校驗和(代碼用增量方式更新,避免重算)。

5. 分片(ip4_frag)與重組(ip4_reass)

分片發送:ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest)

  • 只在發送端且 netif->mtu 小于 p->tot_len 時觸發(并受 IP_FRAG 宏控制)。
  • 要點:
    • 不支持 IP options(IPH_HL_BYTES 必須等于 IP_HLEN)。
    • 以 8 字節為單位分片(nfb = (mtu - IP_HLEN)/8)。
    • 使用 pbuf_alloc / pbuf_alloced_custom 等機制,創建每個片的 pbuf 鏈(有的配置使用 PBUF_REF 避免復制)。
    • 每個片設置偏移量(IP_OFFMASK + IP_MF),設置長度、首部校驗和,并調用 netif->output 發送。
    • 若內存不足返回 ERR_MEM。

分片重組:ip4_reass(struct pbuf *p)

  • 僅在 IP_REASSEMBLY 啟用時存在。
  • 使用 struct ip_reassdata 鏈表保存正在重組的報文,每個報文鏈由多個 pbuf(頭部被替換為 ip_reass_helper 結構)串聯。
  • 關鍵點:
    • ip_reass_enqueue_new_datagram:為新報文分配 ip_reassdata。
    • ip_reass_chain_frag_into_datagram_and_validate:插入并檢測重疊、缺片、排序;計算是否已全部接收。
    • ip_reass_pbufcount 控制系統內排隊 pbuf 總量(避免資源耗盡)。
    • 超時機制 ip_reass_tmr(每 IP_TMR_INTERVAL 調用一次,過期則清理并可能發送 ICMP Time Exceeded)。
    • 成功重組時把 pbuf 鏈拼接、恢復 IP 頭并返回完整 pbuf。

要點:

  • 重組在接收端進行(端系統處理),路由器不重組。

  • 若發生重疊或資源不足,會丟棄分片/報文并統計相應錯誤。

  • 支持策略:IP_REASS_FREE_OLDEST 在隊滿時釋放最舊報文以給新報文空間。
    在這里插入圖片描述

  • 何時發生分片

    • 當要發送的 IP 數據報(包括 IP 首部)比下一跳鏈路的 MTU 大時,源主機或轉發主機必須將數據報分片以適應 MTU。
    • 如果 IP 頭部的 DF(Don’t Fragment)位被置位,則不能分片,若超過 MTU 則應產生 ICMP Destination Unreachable(Fragmentation Needed)。
  • 分片的單位與偏移量

    • IPv4 分片偏移量(Fragment Offset)單位是 8 字節(64 位)。因此,除首/尾片外每個分片的數據長度必須是8的整數倍(除非是最后一個分片)。
    • lwIP 中計算每片數據塊數: nfb = (netif->mtu - IP_HLEN) / 8;實際每片數據字節數 = nfb * 8。
  • 發送端(ip4_frag)的關鍵步驟(對應源碼要點)

    • 不支持帶 IP option 的數據報(在 lwIP ip4_frag 中要求 IPH_HL_BYTES == IP_HLEN)。
    • 計算要分的片數并循環:
      • 為每片準備 pbuf:在不同配置下使用 PBUF_RAM(復制數據)或用 PBUF_REF / pbuf_alloced_custom 來引用原始 pbuf 的數據以避免拷貝(節省內存/CPU)。
      • 設置每片的 IP 首部字段:
        • 將原始首部復制到每個片的首部位置(除某些字段外保持一致)。
        • 設置長度(片的總長度 = IP_HLEN + 片數據長度)。
        • 計算并設置分片偏移量(以 8 字節為單位)和 MF(更多片)位:除最后一片外 MF=1,最后一片 MF=0。
        • 計算 IP 首部校驗和(受 CHECKSUM_GEN_IP / CHECKSUM_GEN_IP_INLINE / NETIF_CHECKSUM_GEN_IP 控制)。
      • 調用 netif->output(netif, rambuf, dest) 逐片發送,然后釋放 rambuf(注意硬件可能異步使用)。
    • 返回 ERR_OK 或在內存不足時返回 ERR_MEM。
  • 接收端重組(ip4_reass)的關鍵步驟(對應源碼要點)

    • 入口:當接收到分片(IPH_OFFSET 中含有 MF 或 offset != 0)時,ip4_input 調用 ip4_reass。
    • 結構與隊列:
      • 用 struct ip_reassdata 鏈表保存待重組的報文(每個 ip_reassdata 保留原始第一個片的 IP 頭副本、timer、pbuf 鏈等)。
      • 為每個已接片在 pbuf 的 IP 首部處放置一個小的 helper 結構(ip_reass_helper),記錄該片在整體報文中的 start/end 偏移以及指向下一個片的指針。
    • 入隊與插入驗證(ip_reass_chain_frag_into_datagram_and_validate):
      • 將新片按 start 偏移排序插入鏈表(在正確位置插入或追加)。
      • 檢查重疊(可選,受 IP_REASS_CHECK_OVERLAP 控制):若重疊或重復片可選擇丟棄。
      • 檢查“洞”(missing fragments):若鏈中有間隙則標記為未完成(valid = 0)。
      • 若見到最后一片(MF==0),并且鏈上沒有洞,則認為重組已完成。
    • 資源與防護
      • 使用 ip_reass_pbufcount 跟蹤已占用 pbuf 數量,并限制最大排隊 pbuf(IP_REASS_MAX_PBUFS)。
      • 當達到上限時,可通過 IP_REASS_FREE_OLDEST 策略釋放最舊報文以騰出空間(實現中有此可選行為)。
      • 超時機制:ip_reass_tmr 每 IP_TMR_INTERVAL(一般 1s)遞減重組項 timer,超時后釋放并(如果已接到第一個片)發送 ICMP Time Exceeded。
    • 成功重組
      • 將所有片的 pbuf 鏈按順序拼接:對于除第一片外每個片調用 pbuf_remove_header(r, IP_HLEN) 隱藏其 IP 首部,然后用 pbuf_cat 把它們追加到第一個 pbuf。
      • 恢復第一個 pbuf 的原始 IP 首部(從 ipr->iphdr 拷貝),設置總長度、將偏移設為 0,校驗和重算(若需要)。
      • 從重組隊列中移除并釋放 ip_reassdata,更新 ip_reass_pbufcount,返回完整的 pbuf 鏈給上層處理。
    • 失敗情形
      • 如果出現重疊(并被配置為拒絕)、內存不足、或超時,丟棄分片并相應更新統計;在某些情形會發送 ICMP(例如超時發送 Time Exceeded,或 DF 導致分片失敗則轉發端會觸發 ICMP)。
  • 路由器與終端的區別

    • 路由器不應(且在 lwIP 默認實現中不)對通過它的分片進行重組:重組工作放在目的主機(端系統)上。路由器只轉發分片(除非路由器自身就是目的主機)。
    • 因此分片可以在路徑上的不同鏈路被再次分片(分片的再分片),最終端系統負責按偏移裝配回原始數據報。
  • 安全與性能注意事項

    • 分片可被濫用用于逃避檢測或觸發 DoS(大量未完成的重組會耗盡內存)。建議:
      • 限制 IP_REASS_MAX_PBUFS(或直接禁用 IP_REASSEMBLY,當能保證上層不依賴分片時)。
      • 啟用 IP_REASS_FREE_OLDEST 或短重組超時以減少資源占用窗口。
      • 嚴格處理重疊片(拒絕或按策略合并)。
    • 分片/重組會增加延遲并消耗內存與 CPU,能避免時盡量通過 Path MTU Discovery(PMTUD)或盡量發送小包減少分片需求。
  • 示例

    • 原始 IP 數據段:3980 字節(不含 20 字節 IP 頭),通過 MTU=1500 的鏈路。
    • 每片能承載的數據 = 1500 - 20 = 1480 字節(且為8字節倍數)。
    • 分片方案:
      • 分片 1:數據長度 1480,偏移 0,MF = 1,總長 1500(含 20 字節頭)。
      • 分片 2:數據長度 1480,偏移 1480/8 = 185,MF = 1,總長 1500。
      • 分片 3(最后片):數據長度 = 3980 - 1480 - 1480 = 1020,偏移 = 185 + 185 = 370,MF = 0,總長 = 1020 + 20 = 1040。
    • 目的主機收到三片后根據偏移(0, 185, 370)拼接成完整 3980 字節數據并交給傳輸層。
  • 實踐建議(對 lwIP 配置)

    • 如果內存充足且需要接收任意分片:啟用 IP_REASSEMBLY,合理增大 IP_REASS_MAX_PBUFS 并啟用 IP_REASS_FREE_OLDEST(以減輕洪泛)。
    • 對于路由器/網關:通常關閉重組(路由器不必重組)并啟用轉發(IP_FORWARD),確保 DF/MTU/ICMP Path MTU 策略正確。
    • 若鏈路 MTU 可變或緊張:優先使用 PMTUD 或在上層限制 MSS/MTU,減少 IP 分片發生。

(上述流程直接映射至 lwIP 源碼中的 ip4_frag、ip4_reass、ip_reass_tmr、ip_reass_chain_frag_into_datagram_and_validate、ip4_input 等函數)


6. 組播、廣播與 DHCP(鏈路層尋址)

  • 代碼中對組播做了專門處理:
    • ip4_input 在 dest 為 multicast 時會對 IGMP 做額外檢查(igmp_lookfor_group)。
    • ip4_route 支持 ip4_default_multicast_netif(LWIP_MULTICAST_TX_OPTIONS)。
  • 將鏈路層尋址包(例如 DHCP Server->Client reply)在 netif down 時仍能接收:
    • IP_ACCEPT_LINK_LAYER_ADDRESSING 宏及 IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT 的擴展允許接受目的 IP 不匹配的 UDP 包(通常用于 DHCP)。
    • 當 netif==NULL 并檢測到 UDP 且目標端口為 DHCP 客戶端端口時,強制接受。

7. Hook 與可配置項(可擴展點)

代碼中暴露多個 hook / macro 以便定制:

  • LWIP_HOOK_IP4_INPUT:在 ip4_input 開始時可「吃掉」包(返回非 0 則視為已處理)。
  • LWIP_HOOK_IP4_ROUTE_SRC / LWIP_HOOK_IP4_ROUTE:可自定義路由選擇(包括基于源地址的路由)。
  • LWIP_HOOK_IP4_CANFORWARD:自定義能否轉發判斷。
  • LWIP_NETIF_LOOPBACK / NETIF_FLAG_BROADCAST / NETIF_CHECKSUM_* 等編譯時選項影響行為。

8. 統計與調試

  • 大量 IP_STATS_*、MIB2_STATS_INC 用于統計收發、錯誤、轉發、碎片、重組等信息,便于監控與調試。
  • IP_DEBUG / IP_REASS_DEBUG 等宏用于運行時打印調試信息(lwIP 的 LWIP_DEBUGF)。

9. 關聯要點匯總

  • IP 地址與路由選擇:理論上 IP 地址指定主機身份;實現上由 ip4_route() 根據 netif 和 netmask 找到發送接口。
  • TTL 防止循環:在 ip4_forward 中 TTL 每跳減 1,TTL 歸 0 時發 ICMP 超時(icmp_time_exceeded)。
  • 分片單位與重組:
    • 理論:分片以 8 字節為單位;實現:nfb = (mtu - IP_HLEN) / 8,偏移以 8 字節單位設置。
    • 重組僅在接收端完成:ip4_reass 使用鏈表與 helper 結構保存片段。
  • NAT:用戶文中描述 NAT 工作方式(修改源 IP:port 并維護轉換表)屬于應用/路由器層,lwIP core 沒有內置完整 NAT 實現,這種功能通常由路由器軟件/OS 層實現(lwIP 可以作為設備上的 IP 層基礎)。
  • 校驗和策略:IP 首部在每跳必須驗證,發包時根據配置選擇內聯或函數計算;傳輸層還會做更廣泛的校驗(TCP/UDP 校驗和)。
    在這里插入圖片描述

10. 常見調整建議

  • 若設備作路由器:打開 IP_FORWARD、IP_FRAG、IP_REASSEMBLY;注意內存(IP_REASS_MAX_PBUFS)與安全(不要盲目接受鏈路層包)。
  • 若網卡有硬件校驗:啟用 LWIP_CHECKSUM_CTRL_PER_NETIF 并為 netif 配置 NETIF_CHECKSUM_*,可節約 CPU。
  • 對內存敏感:禁用 IP_REASSEMBLY 或啟用 IP_REASS_FREE_OLDEST,慎重設置 IP_REASS_MAX_PBUFS。
  • 若需要高性能:啟用 CHECKSUM_GEN_IP_INLINE,避免重復拷貝(使用 PBUF_REF / custom pbufs)。

11. 參考源碼位置

  • 輸入/輸出主入口:ip4_input、ip4_output、ip4_output_if、ip4_output_if_src
  • 轉發/路由:ip4_route、ip4_forward、ip4_canforward
  • 分片/重組:ip4_frag、ip4_reass、ip_reass_tmr、ip_reass_chain_frag_into_datagram_and_validate
  • 輔助:ip4_addr_isbroadcast_u32、ip4addr_aton、ip4addr_ntoa_r 等地址工具

12. 小結

將理論與lwIP實現對照可以看出:IP 協議棧在嵌入式實現中需要在功能完備與資源受限之間做折中。lwIP 提供了豐富的編譯時配置點(碎片、重組、校驗和、路由 hook 等),可以根據設備角色(終端/路由器/網關)調整。理解 ip4_input/ip4_output/ip4_frag/ip4_reass 這幾個核心函數,能幫助定位大多數網絡問題(丟包、碎片、路由錯誤、校驗失敗、DHCP/組播交互等)。

在這里插入圖片描述
核心思路:驗證 → 匹配本機/多播/廣播 → 是否需轉發 → 是否為分片 → 重組或直接分發到上層協議(UDP/TCP/ICMP/IGMP)或丟棄/回復 ICMP。

  • 關鍵處理步驟(按圖自下而上)

    1. ethernet_input() 把以太網幀交給 ip4_input()(若是 IPv4)。
      關聯源碼:ethernet_input、netif 層。
    2. ip4_input() 首部驗證(版本、首部長度、校驗和、總長度)和源/目的地址基本檢查。
      失敗:丟棄并更新統計/可能發送 ICMP。
    3. 判斷是否 IPv4(圖中 “IPv4?”)。不是則由上層其它處理或丟棄。
    4. 檢查目的地址是否為本機(ip4_addr_isloopback / 本機 IP / 多播 / 廣播)。
      • 是本機:繼續處理(進入分片重組或上層協議)。
      • 否且 netif==NULL:不是給本機——進入轉發邏輯或丟棄(取決于 IP_FORWARD)。
    5. netif==NULL 分支:對于非廣播/多播目標且啟用轉發,調用 ip4_forward() 轉發;對廣播通常不轉發(直接丟棄或本地處理視實現)。
    6. 分片檢測:若 IP 標志或偏移表明為分片(MF 或 offset!=0),調用 ip4_reass() 做重組。
      • 重組成功:交給上層協議處理。
      • 重組失敗或超時:釋放并可能發送 ICMP(Time Exceeded 等)。
    7. 分發到上層:根據 IP 協議字段發到 udp_input、tcp_input、icmp_input、igmp_input 或 raw_input;未知協議通常丟棄或統計錯誤。
  • 特別注意點

    • 分片在目的端重組:路由器不重組(轉發即可),重組邏輯在 ip4_reass。
    • 多播與 IGMP:多播包可能需要額外的 IGMP 檢查(igmp_lookfor_group)。
    • 廣播處理:通常不轉發到其它網段;交給本機所有接口的廣播機制或丟棄。
    • netif==NULL 表示該包在本機沒有匹配的接口(即目標不是本機地址),需要考慮是否轉發。
    • 未知上層協議會被丟棄(或由 raw/pcap/probe 鉤子捕獲)。
  • 常見后續動作(實現/調試相關)

    • 出錯會更新 IP_STATS/MIB2 并在啟用的情況下打印調試信息。
    • 轉發時若需分片且 DF=1,會觸發 ICMP Destination Unreachable (Fragmentation Needed)。
    • 重組資源受限會導致丟棄,應檢查 IP_REASS_MAX_PBUFS、重組超時策略等。
  • 源碼映射(快速索引)

    • 入口/驗證/分發:ip4_input
    • 重組:ip4_reass、ip_reass_tmr
    • 轉發/路由:ip4_forward、ip4_route、ip4_canforward
    • 發送到上層:udp_input / tcp_input / icmp_input / igmp_input

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/96544.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/96544.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/96544.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

高并發短信網關平臺建設方案概述

本方案涵蓋了架構設計、技術選型、核心功能、高可用保障以及實施路徑,旨在構建一個能夠應對千萬級日吞吐量、穩定、安全、可擴展的現代短信網關平臺。 高并發短信網關平臺建設方案 一、 項目概述與目標 1.1 項目背景 為滿足公司業務(如用戶注冊、登錄、交易驗證、營銷通知…

阿里云服務-開啟對象存儲服務及獲取AccessKey教程

(1)阿里云OSS簡介 (2)打開阿里云網址:阿里云登錄 - 歡迎登錄阿里云,安全穩定的云計算服務平臺 點擊“立即開通” (2)開通成功后,充值任意金額 頂欄選擇“費用”|“充值…

[特殊字符] 高可用高并發微服務架構設計:Nginx 與 API Gateway 的協同實踐

一、Nginx 和 Gateway 的關系:是替代還是協作? 不是替代關系,而是協作關系。 1. Nginx 的角色(通常在最外層) 反向代理 & 負載均衡:將前端請求分發到多個后端服務或網關實例。 靜態資源服務&#xf…

解碼LLM量化:深入剖析最常見8位與4位核心算法

解碼LLM量化:深入剖析8位與4位核心算法 大型語言模型(LLM)的性能日益強大,但其龐大的體積和高昂的計算成本構成了部署的主要障礙。模型量化,作為一種將高精度浮點權重(如16位)映射到低位寬整數&…

提問:溫度不改變 logits 與概率的排名,為何還會影響模型輸出?

你此前圍繞溫度的核心困惑始終是:“溫度不改變 logits 與概率的排名,為何還會影響模型輸出?” 以下總結將緊扣這一困惑,并重點補充核采樣(Top-p)在其中的作用,明確溫度與核采樣如何共同影響輸出…

【文獻閱讀】Lossless data compression by large models

1. 中華人工智能研究中心,鄭州。 2. 鵬程實驗室,深圳。 3. 上海數學與交叉學科研究所,上海。 4. 中國科學院計算技術研究所,北京。 5. 寧波人工智能產業研究所,寧波。 6. 滑鐵盧大學計算機科學學院,加拿大安…

注意力機制:捕獲長距離依賴關系的革命性技術

本文由「大千AI助手」原創發布,專注用真話講AI,回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我,一起撕掉過度包裝,學習真實的AI技術! ? 1. 注意力機制概述:為什么需要關注"長距離依賴&qu…

PHP如何使用JpGraph生成柱形圖?

PHP使用JpGraph庫生成各類統計圖形具有顯著優勢,該庫作為專業的PHP圖表生成工具,能夠高效創建包括折線圖、餅圖、散點圖在內的多種數據可視化圖形,其核心價值在于提供了豐富的圖形定制能力和簡潔的API接口。JpGraph通過純PHP實現,…

免費的端口映射工具 ChmlFrp

免費的端口映射工具 ChmlFrp 前言:之前我寫過一篇關于cloudflare tunnel的使用教程,ChmlFrp是一個類似的工具,也可以用來進行內網穿透 我的博客對應文章地址 1.注冊賬號 注冊地址 點擊這個鏈接前往官網注冊一個賬號,過程簡單&…

遙感領域解決方案丨涵蓋:高光譜、無人機多光譜、空天地數據識別與計算

一:AI智慧高光譜遙感實戰:手撕99個案例項目、全覆蓋技術鏈與應用場景一站式提升方案在遙感技術飛速發展的今天,高光譜數據以其獨特的光譜分辨率成為環境監測、精準農業、地質勘探等領域的核心數據源。然而,海量的波段數據、復雜的…

中科米堆CASAIM自動化三維測量設備測量汽車殼體直徑尺寸

隨著新能源汽車產業向輕量化與高集成度發展,殼體作為電池組和電驅系統的核心承載部件,其孔位加工精度直接影響裝配密封性及結構強度,傳統人工測量方式已難以滿足現代化生產需求。自動化三維測量設備的引入,為汽車殼體直徑尺寸測量…

08.21總結

圓方樹 引入 我們注意到,樹結構相比普通圖具有諸多優良特性。若能將在無向圖上求解的問題轉化為樹結構問題,往往能大幅簡化求解過程。圓方樹正是實現這一轉化的有效工具。 定義 我們稱原圖中的點為"圓點"。通過引入方點并調整邊的關系&#xf…

亞馬遜廣告優化新邏輯:從人工苦力到AI智能的進化之路

"為什么我的廣告花費越來越高,轉化卻越來越差?""如何在海量關鍵詞中找到真正能帶來轉化的黃金詞?""為什么手動調整出價總是跟不上流量變化的速度?""怎樣才能避免因庫存問題導致的廣告權重暴跌…

【51單片機】【protues仿真】基于51單片機水位監測系統

目錄 一、主要功能 二、使用步驟 三、硬件資源 四、軟件設計 五、實驗現象 一、主要功能 1、數碼管顯示當前水位值 2、按鍵設置水位上下限閾值 3、當水位低于下限,啟動蜂鳴器警報并抽水至水位上限停止抽水 4、電機模擬水泵,蜂鳴器,指示…

白名單過濾的文件上傳如何bypass:boot2root靶機之fristileaks

靶機提示 base64解碼提取圖片 文件上傳之apache多后綴名解析漏洞 linpeas dirtycow提權 靶機下載 通過網盤分享的文件:FristiLeaks_1.3.ova 鏈接: https://pan.baidu.com/s/1ZWznp8egNGwnQqwh1gkSZg?pwdwwvp 提取碼: wwvp --來自百度網盤超級會員v8的分享主…

Centos 8 管理防火墻

firewall-cmd 檢查與安裝 在 CentOS 8 上安裝和啟用 firewalld(提供 firewall-cmd 工具)的步驟如下:1. 檢查 **firewalld** 是否已安裝 在安裝前,先檢查系統中是否已安裝: sudo firewall-cmd --version如果返回版本號&…

使用PPT進行科研繪圖過程中常用的快捷鍵

PPT科研繪圖常用快捷鍵速查表功能類別快捷鍵功能描述基礎操作與選擇Ctrl A全選幻燈片上的所有對象。Ctrl D快速復制選中的對象,并自動保持等間距排列。Shift Click多選多個對象。Ctrl G將選中的多個對象組合成一個整體。Ctrl Shift G取消組合。Ctrl 拖動復制…

`strchr` 字符串查找函數

1) 函數的概念與用途 strchr 是 C 標準庫中的一個基礎但極其重要的字符串處理函數,它的名字來源于"string chracter"(字符串字符)。這個函數的功能非常明確:在字符串中查找特定字符的第一次出現位置。 可以將 strchr 想…

Redis 678

Redis 8 是當前的最新穩定版(截至 2024 年中),它在 Redis 7 的基礎上帶來了更多重要改進。我們來對這三個主要版本進行一次全面的功能和性能對比。 核心演進脈絡 Redis 6 (2020):多線程時代的開創者。解決了網絡 I/O 瓶頸&#xf…

【大白話解析】 OpenZeppelin 的 Address 庫:Solidity安全地址交互工具箱?(附源代碼)

?? 一、這個文件是干嘛的?—— Address.sol 是個“工具箱” 你可以把這個 Address.sol文件理解為一個 ??“工具箱”??,里面裝了一堆??專門用來安全地跟別的地址(賬戶或合約)打交道的工具函數??。 在區塊鏈世界里,地址(address)可以是: ??外部賬戶(EOA)…