網絡HTTPS協議

Https

HTTPS(Hypertext Transfer Protocol Secure)是 HTTP 協議的加密版本,它使用 SSL/TLS 協議來加密客戶端和服務器之間的通信。具體來說:

? 加密通信:在用戶請求訪問一個 HTTPS 網站時,客戶端(如瀏覽器)和服務器通過 SSL/TLS 握手 來建立一條加密的通道。這個過程包括證書驗證、密鑰交換等步驟,最終生成一個用于加密的會話密鑰。

? 數據加密:一旦加密通道建立,瀏覽器和服務器之間的所有通信數據都會使用對稱加密技術(如 AES)加密。這意味著即使中間人(例如攻擊者)截獲了通信數據,他們也無法輕易解密這些數據,因為沒有會話密鑰。

為什么抓包工具能解密流量?

抓包工具(如 Charles, Fiddler, Wireshark 等)能夠解密 HTTPS 流量,通常是因為它們 充當了一個代理服務器,而這個代理需要安裝在用戶的設備上并且信任其證書。

具體來說:

? 代理模式:這些抓包工具通過設置為用戶的代理(HTTP 或 HTTPS 代理),讓所有的流量首先經過這些工具,然后由工具轉發到目標服務器。

? 證書安裝和信任:抓包工具會在本地生成自己的 中間人證書,并要求用戶安裝該證書到瀏覽器或操作系統的受信任根證書列表中。這樣,抓包工具就可以解密和重新加密數據。

? 解密流量

  1. 用戶請求 HTTPS 網站時,抓包工具充當一個中間人(man-in-the-middle)。

  2. 抓包工具與目標服務器建立 HTTPS 連接(此時它會驗證服務器證書并加密通信)。

  3. 抓包工具與用戶的瀏覽器之間再建立一個 HTTPS 連接(并使用抓包工具自己的證書加密通信)。

  4. 由于用戶信任抓包工具的證書,瀏覽器認為它與真正的服務器建立了加密通道,因此不會警告或報錯。

谷歌瀏覽器的開發者工具(F12)

瀏覽器的開發者工具(如谷歌 Chrome 的 F12)也能抓取 HTTPS 請求,但這并不是因為它解密了流量,而是因為瀏覽器本身 能夠查看請求和響應的元數據

? 瀏覽器在發送 HTTPS 請求時,會將數據加密并發送到目標服務器,但服務器的響應會被加密并發送回瀏覽器。此時,瀏覽器解密響應并顯示在開發者工具中。

? 所以,當你在 開發者工具的 Network 面板 查看請求時,你看到的是 瀏覽器已解密后的數據,而不是中間人攻擊的結果。這里的流量是瀏覽器自己解密的,目的是供開發者查看。

請求

發送了一個簡單的 HTTP POST 請求,但在背后會涉及到一些額外的網絡層級的操作,包括 TCP 三次握手四次揮手,還有 SSL/TLS 握手 的過程。這些操作會稍微增加請求的延遲。

TCP 三次握手(Three-Way Handshake)

當你發出一個 HTTP POST 請求時,它首先會建立一個 TCP 連接。TCP 是一個面向連接的協議,所以在客戶端與服務器之間建立連接時,會經過三次握手:

  1. 客戶端 -> 服務器:客戶端發送一個 SYN(同步)包來請求建立連接。

  2. 服務器 -> 客戶端:服務器響應一個 SYN-ACK(同步-確認)包,表示它準備好與客戶端通信。

  3. 客戶端 -> 服務器:客戶端再發送一個 ACK(確認)包,表示連接建立成功。

這三次握手完成后,客戶端和服務器之間就可以開始數據傳輸了。

SSL/TLS 握手(建立加密通道)

在 HTTPS(而不是 HTTP)中,所有的 HTTP 請求都會先通過 SSL/TLS 握手 來加密通信。這個過程也需要一定的時間,但它是為了確保通信的安全性。具體過程如下:

  1. 客戶端 -> 服務器:客戶端發送一個包含自己支持的加密算法和其他配置信息的 ClientHello 消息。

客戶端(瀏覽器、curl 或其他工具)會發送一個 ClientHello 消息給服務器,包含:
? 支持的加密算法(如 AES、RSA、ECDHE 等)。
? 支持的 SSL/TLS 版本。
? 隨機數,用于加密密鑰的生成。
? 支持的擴展(例如 SNI,服務器名稱指示)。

加密套件的選擇:不同客戶端會支持不同的加密算法。

? TLS 版本:例如,Chrome 可能會首先嘗試使用最新的 TLS 版本(如 TLS 1.3),而 curl 可能會允許更多的 TLS 版本(如 TLS 1.2 或 1.3)。

? SNI(服務器名稱指示):瀏覽器和工具通常會帶上 SNI 信息來告訴服務器想訪問的虛擬主機名。(例如 Chrome),它會通過多次優化過的策略來減少加密握手的時間和帶寬消耗。例如,Chrome 可能會在一定條件下使用 Session ResumptionTLS 0-RTT 來加速后續請求,避免每次都重新進行握手。

  1. 服務器 -> 客戶端:服務器根據客戶端的請求選擇一種加密算法并發送 ServerHello 消息,并發送自己的證書(包含公鑰)來讓客戶端驗證服務器身份。

回復一個 ServerHello 消息,包含:
? 選擇的加密算法和協議。
? 服務器證書(公鑰)用于加密。
? 隨機數。

  1. 客戶端 -> 服務器:客戶端生成一個 Pre-Master Secret,用服務器的公鑰加密后發送給服務器。然后,客戶端和服務器通過這個 Pre-Master Secret 計算出加密會話密鑰。
?	如果是對稱加密(例如使用 RSA 或 ECDHE),客戶端會使用服務器的公鑰加密一個共享密鑰(pre-master secret)。
?	服務器解密并生成最終的對稱加密密鑰。
  1. 服務器 -> 客戶端:服務器解密這個 Pre-Master Secret,并且確認雙方可以使用相同的會話密鑰進行加密通信。

一旦 SSL/TLS 握手 完成后,數據的加密和解密可以開始,通信將使用 對稱加密(如 AES)進行。

TCP 四次揮手(Four-Way Handshake)

當通信結束時,連接需要關閉。這個過程需要 四次揮手 來完成:

  1. 客戶端 -> 服務器:客戶端發送一個 FIN(結束)包,表示它要關閉連接。

  2. 服務器 -> 客戶端:服務器確認收到 FIN 包,并發送一個 ACK(確認)包,表示連接半關閉。

  3. 服務器 -> 客戶端:服務器發送一個 FIN 包,表示服務器也準備關閉連接。

  4. 客戶端 -> 服務器:客戶端確認收到服務器的 FIN 包,并發送一個 ACK 包,表示連接完全關閉。

每個新的連接都會進行一次握手:如果瀏覽器或工具每次都建立新的連接(沒有復用連接),每次請求都會重新進行 SSL/TLS 握手。

? 連接復用:在 HTTP/2HTTP/1.1 keep-alive 下,多個請求可以復用同一個連接,減少握手的頻率。

http1.1 與http 2

HTTP(Hypertext Transfer Protocol,超文本傳輸協議)是 Web 通信的基礎,目前主要使用的版本有 HTTP/1.1HTTP/2

如果你沒有配置 keepalive_timeout,Nginx 使用默認值:

? keepalive_timeout 默認 75 秒

? keepalive_requests 默認 100 【nginx -T | grep keepalive】

server {listen 443 ssl http2;server_name model.abc.com;ssl_certificate /home/ubuntu/crt_ssl/model.abc.com.crt;ssl_certificate_key /home/ubuntu/crt_ssl/model.abc.com.key;ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305-SHA256';ssl_protocols TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers on;# 配置 `keep-alive`keepalive_timeout 65;   # 65 秒內可以復用 TCP 連接keepalive_requests 100; # 允許 100 次請求復用同一個連接location / {proxy_pass http://localhost:3000;  # Django 后端容器proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}server {listen 443 ssl http2;server_name abc.com;ssl_certificate /home/ubuntu/crt_ssl/abc.com.crt;ssl_certificate_key /home/ubuntu/crt_ssl/abc.com.key;ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305-SHA256';ssl_protocols TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers on;location / {proxy_pass http://localhost:8004;  # Django 后端容器proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}

在這里插入圖片描述

在這里插入圖片描述

HTTP/1.1

HTTP/1.1 是 HTTP 協議的一個改進版本,解決了 HTTP/1.0 存在的一些問題:

? 支持持久連接(Keep-Alive):HTTP/1.0 每次請求都需要建立新的 TCP 連接,而 HTTP/1.1 通過 Connection: keep-alive 允許一個 TCP 連接復用多個 HTTP 請求。【在請求頭有這個keep-alive】

? 支持分塊傳輸(Chunked Transfer Encoding):允許服務器分塊傳輸數據,提高大文件的傳輸效率。

? 增加 Host 頭:HTTP/1.1 允許同一 IP 托管多個網站,因此 Host 頭變為必填項。

FastAPI 默認是基于 Uvicorn 運行的,而 Uvicorn 默認使用的是 HTTP/1.1,但是:

? 如果你用 HTTPS(TLS 加密),并且啟用了 HTTP/2,Uvicorn 也可以支持 HTTP/2。

? 但是如果你是在 Nginx 代理 FastAPI,那么 HTTP/2 主要由 Nginx 負責,FastAPI 依然是 HTTP/1.1。

HTTP/1.1 默認是長連接,即:

? 服務器返回 Connection: keep-alive[ Keep-Alive: timeout=5, max=100,表示 5 秒后關閉連接。]

? 只要客戶端愿意,TCP 連接可以復用,不用每次請求都新建一個連接

? 但是 HTTP/1.1 仍然有隊頭阻塞問題,所以瀏覽器一般會開多個 TCP 連接(每個域名 6-8 個)

HTTP/2

HTTP/2 主要目標是提升 Web 性能,它在 HTTP/1.1 的基礎上做了大量優化,最重要的特性包括:

  1. 多路復用(Multiplexing)

? HTTP/2 通過 “幀”(Frame) 的概念,將 HTTP 請求拆分成多個流(Stream),在一個 TCP 連接中可以同時發送多個請求。 HTTP/2 解決了 HTTP/1.1 在應用層的隊頭阻塞,但仍然依賴 TCP 連接【流式】。如果 TCP 層丟包,會導致整個 HTTP/2 連接受影響。所以 HTTP/3 進一步采用 QUIC 協議,徹底規避了這個問題。

? 這樣就解決了 HTTP/1.1 的隊頭阻塞問題,一個請求的慢速不會影響其他請求。

  1. 頭部壓縮(HPACK)

? HTTP/2 采用 HPACK 算法,對頭部進行哈夫曼編碼(Huffman Coding),避免重復傳輸相同的 Header 信息,大幅減少帶寬消耗。

  1. 服務器推送(Server Push)

? 服務器可以主動將客戶端可能需要的資源推送到瀏覽器,而不需要客戶端先請求,減少延遲。例如,在請求 index.html 時,服務器可以提前推送 CSS、JS 文件

  1. 流優先級控制

? HTTP/2 允許客戶端為請求分配不同的優先級,保證關鍵資源(如 CSS、JavaScript)優先加載,提高頁面渲染速度。

? 依賴 TLS(HTTPS):雖然 HTTP/2 協議本身并不強制加密,但主流瀏覽器要求 HTTP/2 必須 使用 TLS(HTTPS)。

因為 HTTP/2 本身就是長連接!

? HTTP/2 默認復用 TCP 連接,不需要 Connection: keep-alive 這個標識。

? 瀏覽器只要發現服務器支持 HTTP/2,它就會一直復用這個連接,直到服務器主動關閉。

? 因此,在 HTTP/2 響應頭中,你不會看到 Connection: keep-alive

瀏覽器訪問 API 時:如果 HTTP/2 可用,TCP 連接是可以復用的。

? 非瀏覽器環境(比如 Python requests、Postman、curl)

? 默認不會復用,因為每次請求都會重新創建連接。

? 但是如果你使用 HTTP/1.1 且加了 keep-alive,則有可能復用(但這取決于 HTTP 客戶端是否支持)。

? 使用 httpx、requests 這些庫時,你需要手動啟用連接池來復用連接。

連接復用

TCP 連接復用 本質上就是 在一定時間內,瀏覽器或客戶端不會每次都重新建立 TCP 連接(或者 SSL/TLS 握手),而是復用現有的連接進行 HTTP 請求

HTTP/1.1 下,TCP 連接默認是持久連接,也就是:

? 服務器默認不會立即關閉連接

? 瀏覽器會在一段時間內復用這個連接

如果客戶端在 5 秒內發送了新請求,它會直接復用現有 TCP 連接,而不是重新握手。

HTTP/1.1 200 OK
Connection: keep-alive
Keep-Alive: timeout=5, max=100(	?	timeout=5:表示服務器會等待 5 秒,如果客戶端沒有新的請求,就關閉連接。?	max=100:最多允許復用 100 次請求。)

? 瀏覽器的 TCP 連接復用基于 (源 IP, 源端口, 目標 IP, 目標端口) 的四元組

? 只要 源 IP + 源端口 + 目標 IP + 目標端口 不變,連接就能復用。

? 瀏覽器不會復用 已經關閉的 TCP 連接,但會盡可能在 keep-alive 時間內重用它。

? NAT 設備(如家庭路由器) 會將你的內網 IP(如 192.168.1.100:54321)映射到 公網 IP(如 203.0.113.10:34567)

? 服務器只知道 公網 IP + 端口(203.0.113.10:34567),而不知道你的本地 IP。

? NAT 設備會在內存里維護連接表,確保返回的數據包能夠正確映射到你的設備。

題目

1、HTTP/2 多路復用(Multiplexing)是如何避免 HTTP/1.1 的隊頭阻塞(HOL Blocking)的?但為什么仍然可能存在 HOL Blocking?

HTTP/1.1 中,一個 TCP 連接只能串行處理請求:

? 瀏覽器默認最多 6-8 個 TCP 連接,但是每個連接里請求是 串行執行,導致 隊頭阻塞(HOL Blocking)

? 如果前一個請求耗時較長,后續請求 必須等待,即使它們本身處理很快。

HTTP/2 解決方案:

? 引入多路復用(Multiplexing),允許一個 TCP 連接同時處理多個請求和響應,每個請求都分配一個流 ID

? 請求之間不再是嚴格的順序執行,即使前一個請求慢,后面的請求仍然可以并行傳輸。

但 HTTP/2 仍然可能存在 HOL Blocking:

? TCP 層的隊頭阻塞:HTTP/2 仍然是基于 TCP 傳輸的,如果 TCP 層丟包,整個 TCP 連接需要等待丟失的數據包重傳,導致所有 HTTP/2 請求阻塞。

? HTTP/2 不能解決 TCP 層的 HOL Blocking,而 HTTP/3 采用 QUIC(基于 UDP),完全消除了這一問題

2、 服務器是如何驗證復用的連接是否真的來自同一個客戶端?

服務器會使用 TLS 會話恢復(TLS Session Resumption) 機制:

? Session Ticket(TLS 1.2):服務器在第一次握手時生成一個加密票據(Session Ticket),存儲在客戶端,下次請求時客戶端帶上這個票據,服務器就知道它是同一個會話。

? Session ID(TLS 1.2):服務器給每個 TLS 會話分配一個 ID,客戶端后續請求時可以用相同 ID 進行恢復。

? TLS 1.3 采用 PSK(Pre-Shared Key):客戶端和服務器可以在 0-RTT(Zero Round Trip Time)模式下恢復會話。

這意味著:

? 即使 IP 變了,服務器仍然可以識別客戶端是否是同一個會話(只要 Session Ticket 沒有過期)。

? 攻擊者即使偽造 IP 和端口,也無法繞過 TLS 認證。

3、連接復用時,為什么還需要 SYN-ACK?

同一個 TCP 連接在 keep-alive 時間內的請求可以共享,但一旦連接關閉,新的連接仍然需要重新握手(SYN -> SYN-ACK -> ACK)

  1. 客戶端(瀏覽器)建立 TCP 連接

? Client → SYN → Server

? Server → SYN-ACK → Client

? Client → ACK → Server

? TCP 連接建立后,客戶端發送 HTTP 請求:

Client → GET /index.html HTTP/1.1 → Server

如果 keep-alive 生效,連接不會立即關閉

? 服務器返回 Connection: keep-alive,表示 TCP 連接仍然可用。

? 后續請求不會重新握手,直接復用 TCP 連接:

Client → GET /api/data HTTP/1.1 → Server

攻擊者不可能劫持現有的 TCP 連接

? 連接復用是客戶端和服務器維護的,攻擊者無法直接插入現有的 TCP 連接,因為 TCP 連接在 NAT 內部,攻擊者無法獲取 NAT 的端口映射狀態

? NAT 設備有 狀態表,它只允許 真正發起連接的設備 接收服務器的數據。

? 攻擊者無法強行加入 NAT 設備已經維護的連接,除非 NAT 設備本身被攻破。

  1. 攻擊者只能嘗試偽造新的 TCP 連接

? 偽造 IP + 端口并不會讓攻擊者進入原連接,而是必須發起新的 SYN。

? 但服務器發送的 SYN-ACK 不會送到攻擊者手里,而是回到 NAT 設備,導致握手無法完成。

? 這就是TCP 偽造攻擊失敗的核心原因

  1. 即使 TCP 偽造成功,TLS 仍然會保護數據

? 在 HTTPS(TLS)連接里,TCP 連接的建立并不代表攻擊成功,因為攻擊者還需要完成 TLS 握手

? TLS 握手涉及服務器證書、公私鑰加密,攻擊者無法偽造

? 即使攻擊者能劫持 TCP 連接,他仍然無法解密數據

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

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

相關文章

LintCode第1712題 - 和相同的二元子數組

描述 在由若干 0 和 1 組成的數組 A 中,有多少個和為 S 的非空子數組 樣例 1: 輸入:A [1,0,1,0,1], S 2 輸出:4 解釋: 如下面黑體所示,有 4 個滿足題目要求的子數組: [1,0,1] [1,0,1] [1,0,1,0] [0,1,…

【MySQL筆記】庫操作與表操作

🔥個人主頁🔥:孤寂大仙V 🌈收錄專欄🌈:MySQL 🌹往期回顧🌹:【MySQL】認識MySQL 🔖流水不爭,爭的是滔滔不 一、庫操作1.1 顯示數據庫1.2 創建數據庫…

SpringBoot3實戰(SpringBoot3+Vue3基本增刪改查、前后端通信交互、配置后端跨域請求、數據批量刪除(超詳細))(3)

目錄 一、從0快速搭建SpringBoot3工程、SpringBoot3集成MyBatis、PageHelper分頁查詢的詳細教程。(博客鏈接) 二、實現前端與后端通信對接數據。(axios工具) &#xff08;1&#xff09;安裝axios。(vue工程目錄) &#xff08;2&#xff09;封裝請求工具類。(request.js) <1&…

單播、廣播、組播和任播

文章目錄 一、單播二、廣播三、組播四、任播代碼示例&#xff1a; 五、各種播的比較 一、單播 單播&#xff08;Unicast&#xff09;是一種網絡通信方式&#xff0c;它指的是在網絡中從一個源節點到一個單一目標節點對的傳輸模式。單播傳輸時&#xff0c;數據包從發送端直接發…

【實戰】deepseek數據分類用戶評論數據

在平時的工作中&#xff0c;我們會遇到數據分類的情況&#xff0c;比如將一些文本劃分為各個標簽。如果人工分類這塊的工作量將是非常大&#xff0c;而且分類數據的準確性也不高。我們需要用到一些工具來實現。提高效率的同時也提高準確率。 1.示例數據 用戶ID 時間戳 評論場…

技術視角解讀:游戲出海如何借助AWS全球架構突破性能與合規瓶頸

【場景痛點】 某二次元卡牌手游團隊在東南亞市場遭遇聯機延遲投訴率高達37%&#xff0c;日本地區因數據合規問題面臨下架風險。在傳統IDC架構下&#xff0c;運維團隊需要同時管理3個區域的物理服務器&#xff0c;版本更新耗時長達6小時。 【技術架構升級】 通過AWS Local Zones…

【JavaEE】網絡編程socket

1.????前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 親愛的朋友們&#x1f44b;&#x1f44b;&#xff0c;這里是E綿綿呀????。 如果你喜歡這篇文章&#xff0c;請別吝嗇你的點贊????和收藏&#x1f4d6;&#x1f4d6;。如果你對我的…

第16屆藍橋杯單片機4T模擬賽三

本次模擬賽涉及的模塊&#xff1a;基礎三件套&#xff08;Led&Relay&#xff0c;按鍵、數碼管&#xff09; 進階單件套&#xff08;pcf8591的AD模塊&#xff09; 附件&#xff1a; 各模塊底層代碼在文章的結尾 一、數碼管部分 1.頁面1 頁面1要顯示的格式是&#xff1a; …

網絡華為HCIA+HCIP IPv6

目錄 IPv4現狀 IPv6基本報頭 IPv6擴展報頭 IPv6地址 IPv6地址縮寫規范 ?編輯 IPv6地址分配 IPv6單播地址分配 IPv6單播地址接口標識 IPv6常見單播地址 - GUA &#xff08;2 / 3 開頭&#xff09; IPv6常見單播地址 - ULA IPv6常見單播地址 - LLA IPv6組播地…

基于YOLOv8深度學習的智能小麥害蟲檢測識別系統

作者簡介&#xff1a;Java領域優質創作者、CSDN博客專家 、CSDN內容合伙人、掘金特邀作者、阿里云博客專家、51CTO特邀作者、多年架構師設計經驗、多年校企合作經驗&#xff0c;被多個學校常年聘為校外企業導師&#xff0c;指導學生畢業設計并參與學生畢業答辯指導&#xff0c;…

Mac:Maven 下載+安裝+環境配置(詳細講解)

&#x1f4cc; 下載 Maven 下載地址&#xff1a;https://maven.apache.org/download.cgi &#x1f4cc; 無需安裝 Apache官網下載 Maven 壓縮包&#xff0c;無需安裝&#xff0c;下載解壓后放到自己指定目錄下即可。 按我自己的習慣&#xff0c;我會在用戶 jane 目錄下新建…

XSS-labs(反射型XSS) 靶場 1-13關 通關

目錄 前言 XSS漏洞概述 XSS漏洞分類 通關日記 level1 分析 解題 ?level2 分析 解題 方法一&#xff1a;閉合標簽 方法二&#xff1a;閉合雙引號 level3 分析 解題 level4 分析 解題 level5 分析 解題 level6 分析 解題 level7 分析 解體 level8 …

GPT-5 將免費向所有用戶開放?

GPT-5 將免費向所有用戶開放&#xff1f; 硅谷知名分析師 Ben Thompson 最近與 OpenAI CEO Sam Altman 進行了一場深度對談&#xff0c;其中Sam Altman透漏GPT-5將免費向大家發放。 OpenAI 這波操作可不是一時沖動&#xff0c;而是被逼出來的。DeepSeek 這個新秀橫空出世&am…

【雜記二】git, github, vscode等

一、前言 暫時空著... 二、git 2.1 可能的疑問 1. VSCode 項目名和 GitHub 倉庫名是否需要一致&#xff1f; 不需要一致。 VSCode 項目名&#xff08;也就是你本地的文件夾名字&#xff09;和 GitHub 倉庫名可以不一樣。 Git 是一個分布式版本控制系統&#xff0c;它主要關…

數學愛好者寫的編程系列文章

作為一個數學愛好者&#xff0c;我大學讀的專業卻不是數學專業&#xff0c;而是跟計算機有關的專業。原本我對編程一竅不通&#xff0c;平時上課也是在看數學文獻&#xff0c;作業基本靠同學&#xff0c;考試及格就行。不過后來因為畢業的壓力&#xff0c;我還是擁抱編程了&…

FPGA 以太網通信(四)網絡視頻傳輸系統

一、網絡視頻傳輸系統 網絡視頻傳輸系統使用ov5640攝像頭采集數據&#xff0c;通過組件UDP幀將視頻數據實時傳輸給上位機。 ov5640視頻傳輸帶寬 像素分辨率設為640x480&#xff0c;幀率設為60幀&#xff0c;像素格式為RGB565&#xff0c;傳輸帶寬為 640 x 480 x 16bit x 60 fps…

[leetcode]1631. 最小體力消耗路徑(bool類型dfs+二分答案/記憶化剪枝/并查集Kruskal思想)

題目鏈接 題意 給定 n m n\times m nm地圖 要從(1,1) 走到 (n,m) 定義高度絕對差為四聯通意義下相鄰的兩個點高度的絕對值之差 定義路徑的體力值為整條路徑上 所有高度絕對差的max 求所有路徑中 最小的路徑體力值是多少 方法1 這是我一開始自己寫的記憶化剪枝 比較暴力 時…

DeepSeek寫打臺球手機小游戲

DeepSeek寫打臺球手機小游戲 提問 根據提的要求&#xff0c;讓DeepSeek整理的需求&#xff0c;進行提問&#xff0c;內容如下&#xff1a; 請生成一個包含以下功能的可運行移動端打臺球小游戲H5文件&#xff1a; 要求 可以重新開始游戲 可以暫停游戲 有白球和其他顏色的球&am…

webpack使用詳細步驟

項目描述 本項目 webpack 的基本使用。 webpack 官方&#xff1a;https://webpack.docschina.org/concepts/ Element-plus 官方&#xff1a;https://element-plus.sxtxhy.com/zh-CN/ Vue3 官方&#xff1a;https://cn.vuejs.org/ 項目組成明細 每個步驟完成后重新執行 npm run …

【STM32實物】基于STM32的太陽能充電寶設計

基于STM32的太陽能充電寶設計 演示視頻: 基于STM32的太陽能充電寶設計 硬件組成: 系統硬件包括主控 STM32F103C8T6、0.96 OLED 顯示屏、蜂鳴器、電源自鎖開關、溫度傳感器 DS18B20、繼電器、5 V DC 升壓模塊 、TB4056、18650鋰電池、9 V太陽能板、穩壓降壓 5 V三極管。 功能…