發表文章

目前顯示的是 9月, 2025的文章

網際網路筆記(未完)

這不是上課時記下來的,比較像是一份複習筆記,想到什麼寫什麼,也許會有缺漏,哪天決定重新聽課時可能會依照上課章節整理。   網路架構模型  實體設備 功能 規範 OSI 七層架構 TCP/IP 四層架構 手機、平板、電腦 NAS 應用程式間通訊 HTTP 、 SMTP 、 FTP Application Layer 應用層 Application Layer 應用層   Data 轉譯、加密、壓縮 JSON 、 SSL/TLS 、 UTF-8 Presentation Layer 表現層 同上   建立 / 終止網路連結 NetBIOS 、 RPC Session   Layer 會話層 同上   流量控制、錯誤控制 Data 分段 & 重組 TCP 、 UDP Transport Layer 傳輸層 Transport Layer 傳輸層 路由器 若在同個內網,會繞過 拆解 & 收封包 IP 、 ADR 、路由協議 Network Layer 網路層 Internet Layer 網路互連層 Switch 、網路介面卡 流量與錯誤控制 Ethernet( 以太網 ) 、 MAC Frame Relay Data Link Layer 資料連結層 Link Layer 網路存取層 ...

網際網路筆記:UDP

  UDP 和 TCP 一樣是一種傳輸層的通訊協定,由 RFC 768 定義,一般考試大概不會去翻 RFC 的內容。相較於 TCP,UDP 的結構比較簡單,只管送不管到,所以不像 TCP 有什麼三次握手、四次揮手、壅塞控制、流量控制等,多用於需要低延遲、即時性或廣播。     UDP 的託運單 (Header) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Source Port (來源 Port) Destination Port (目的地 Port) Data 長度 Checksum Data 長度:UDP 報文總長不可能超過 65535 bytes,Data 的長度最多為 65535 bytes - 8 bytes (UDP Header) - 20 bytes (IP Header) = 65507 bytes  Checksum:如果不使用,該欄位為 0;在 IPv4 可用可不用,在 IPv6 中必需使用   UDP 的特性 只要封包有送出,工作就做完了 所以不會有重傳封包這種事,也不管接收端能否接到 每個封包都是獨立的、亦沒有順序 如果有需要封包順序、判斷封包是否丟失、封包是否需要重傳……等功能,還是可以透過應用程式實作出來。 UDP 的應用場景 雖然上面把 UDP 描述得像一個只管做不管質量的工人,但因為 header 小、速度快,若能接受封包少量丟失、或是重傳成本 > 丟失成本時,UDP 還是很實用的。 影音串流 即時通訊 (VoIP, Video Call) 線上遊戲  DNS (Domain Name System)  查詢結果通常只有幾十 bytes,用 TCP 郵票有點大 DHCP(Dynamic Host Configuration Proto...

網際網路筆記:TCP 擁塞控制

圖片
閱讀此篇前,建議先複習  網際網路筆記:TCP 。 在網路傳輸中,TCP 除了提供可靠的資料傳輸,還需要確保網路不會因為過量資料而陷入壅塞——當網路發生壅塞時,就很容易陷入「接收端丟封包->發送端重丟更多封包->封包排隊排更久->接收端丟封包」的惡性循環中,最後變成擁塞崩潰 (Congestion Collapse,1980 年代曾經發生過)。   擁塞控制的核心概念  最後發送Byte - 最後接收Byte <= min(cwnd, rwnd)  cwnd: 擁塞控制窗口 (由網路決定)  rwnd: 接收端的接收窗口 (由接收端 buffer 決定) 只要有丟包或延遲,TCP 就會認為網路壅塞並降低 cwnd。  擁塞控制常見機制 慢啟動 (Slow Start) 用於在傳輸開始時,通過指數級增長 cwnd 直到達到慢啟動閾值 (ssthresh),以此試探出網路負載 擁塞避免 (Congestion Avoidance) 當擁塞窗口達到 ssthresh 後,會從指數增長轉為線性增長,以更平穩地逼近網路 快速重傳 (Fast Retransmit) 在接收到三次重複的 ACK 後(表示資料包遺失)觸發,不必等到計時器過期才重傳 快速恢復 (Fast Recovery) 在快速重傳後,不進入慢啟動階段的情況下,快速調整 cwnd 下面的圖片可以更好理解這四個機制的運作情形    (圖片 reference )                                                                                               ...

演算法筆記:BFS 剝葉子法

  這是什麼?  事先說明「BFS 剝葉子法」是我自己對它的暱稱,它嚴格來說並不能算是一種「演算法」,而是一種常見的設計技巧。 常見的對應名詞:「Topological Trimming(拓撲修剪)」、「Leaf Removal Algorithm(葉子移除演算法)」 ,如果在解題過程中看到這個提示,可以考慮使用這個……design patten? 其核心思想如下: 找到圖中的所有葉子(degree = 1 的節點) 逐層移除這些葉子,並更新剩餘圖的結構 持續進行,直到剩下的節點集合符合目標條件(例如:剩下圖的「中心點」)  資料結構 通常會需要兩個陣列,一個用於紀錄「每個點連到誰」,另一個用於紀錄「每個點連接了幾個」,需要區分有向圖和無向圖。 以 edges = [[1,0],[1,2],[1,3]] 為例,表示 Node 1 和 Node 0、2、3 有連接。  有向圖設計範例: for (int i=0; i<edges.size(); i++) { graph[edges[i][0]].push_back(edges[i][1]); graph[edges[i][1]].push_back(edges[i][0]); degree[edges[i][0]]++; degree[edges[i][1]]++; } for (int i=0; i<degree.size(); i++) { if (degree[i] == 1) q.push(i); }   無向圖設計範例:  for (int i=0; i<edges.size(); i++) { graph[edges[i][0]].push_back(edges[i][1]); degree[edges[i][0]]++; } for (int i=0; i<degree.size(); i++) { if (degree[i] == 1) q.push(i); }     核心架構與實作 統計深度(degree):計算每個節點連接的數量,degree = 1 的節點就是「葉子」 把所有葉子加入 queue 中 移除葉子:移除時,會使那些和葉子接在一起的節點 ...

嵌入式系統學習筆記

圖片
上回聽線上 OS 課時沒一邊聽一邊寫筆記,前兩天想動筆寫一下時,忽然不知該從哪裡開始。 故這次決定每上完一個章節就內化一下寫成筆記。   什麼是嵌入式系統?  被內建在特定裝置中、負責控制或處理專門功能的電腦系統。通常不是用來跑通用應用程式,而是針對單一或少數功能設計。 把計算、軟體能力放到一個產品上,會購買這個產品的原因通常是因為產品的功能,而非系統。  整個系統著重於兩件事:讓我知道世界 & 讓世界知道我。   嵌入式系統的開發 和純軟體開發流程不太一樣的部分: 要閱讀說明手冊,了解板子上針腳的功能 用模擬器模擬軟體運行(寫程式用的電腦與最後運行程式的裝置可能使用不同的指令集) 將程式燒進開發版裡驗證與調整 軟體開發完成後請硬體參考電路圖做精簡與修改 linker & locator linker:把多個程式與 library 合併成一個目標檔,在嵌入式系統上可能會因為 MCU 沒有虛擬記憶體,需要配合規劃。 locator:把執行檔寫到目標機器(開發板)上。   程式撰寫層面的不同: 不會有 GUI 介面 通常是在跑一個無窮迴圈 完全吃掉 CPU 的運算效能 IO 通常會透過周邊裝置(peripherals)專用的特殊 register ,並以 bits 或 bytes 控制(需要使用 bitwise 的方法控制) 使用較多的 bit 控制 (請參見  C 語言筆記:Bit 操作 、 C 語言筆記:保留關鍵字  中的 union)  Timer and Clock 在嵌入式系統設計中,時間控制是關鍵的一環,許多應用上都需要精準的時脈 (clock) 與定時器 (timer)。 Clock 時脈,一個週期性震盪的訊號,通常是方波。它的作用就是像節拍器,決定了系統中所有電路運作的節奏。 clock 來源:  石英震盪器 Crystal Oscillator, XTAL RC 震盪器 Resistor-Capacitor Oscillator 外部時鐘 外掛在晶片腳位 內建在晶片上 在另一個晶片上 / ...