Skip to main content

Network

OSI 七層協議

  • Layer 7 - Application - HTTP/FTP/gRPC
  • Layer 6 - Presentation - Encoding, Serialization , 加密解密
  • Layer 5 - Session - Connection establishment, TLS , 全雙工或者半雙工
  • Layer 4 - Transport - UDP/TCP (port)
  • Layer 3 - Network - IP > Datagram
  • Layer 2 - Data link - Frames, Mac address Ethernet
  • Layer 1 - Physical - Electric signals, fiber or radio waves

Router

  • 路由器
  • 用於切割網段, 定義不同的網路段(連接不同網段)

Socket

Socket 是一種用於在網路上進行通訊的程式設計介面(API)。它可以在不同電腦之間建立連接,使它們能夠進行資料的傳輸。Socket 實際上是一個抽象層,允許應用程式通過它來訪問底層的網路協議,例如 TCP 或 UDP。

在網路應用程式中,Socket 扮演著幾個重要角色:

  • 建立連接:Socket 允許兩個或多個應用程式建立連接,以便在它們之間進行通訊。這個連接可以是單向的或雙向的,取決於應用程式的需求。
  • 資料傳輸:一旦連接建立,Socket 允許應用程式在這些連接上傳送和接收資料。這些資料可以是文本、圖片、音訊等等,具體取決於應用程式的需要。
  • 錯誤處理:Socket 還負責處理在通訊過程中出現的錯誤。這些錯誤可能包括連接失敗、資料丟失或網路中斷等,Socket 會負責處理這些情況並適當地通知應用程式。
  • 關閉連接:最後,當通訊結束時,Socket 負責關閉連接。這樣可以釋放資源並確保沒有未完成的連接在系統中留下。

Layer 2 Protocols

ARP

  • 操作在第二層(資料鏈路層)和第三層(網絡層)之間。它用於將 IP 地址轉換為對應的物理地址(MAC 地址)。
arp -a

Layer 3 Protocols

IP

  • a.b.c.d/x (a.b.c.d are integers) x is the network bits and remains are host

  • Subnet mask is used to determine whether an IP is in the same subnet

  • Private IP 範圍:

    • Class A 10.0.0.0 ~ 10.255.255.255
    • Class B 172.16.0.0 ~172.31.255.255
    • Class C 192.168.0.0 ~ 192.168.255.255
  • 子網裡面可以互相溝通、子網和子網之間需透過 Router 溝通

    10.0.1.1 就不能和 10.0.2.4 溝通 子網之間的通信需要透過路由器(Router)來實現,因為交換器(Switch)主要在同一子網內進行數據傳輸。家用環境中的「路由器」通常內建交換器功能,可以處理子網間的路由以及網內數據交換。

  • IP 如果要進入網路需要有公開 IP,就需要透過 Router 出去。

  • 子網域遮罩

  • DHCP

  • CIDR 表示法

ICMP (In IP)

  • Laryer 3 Protocal
  • 檢測網路是否有通?
  • IP 協定裡的一部分,它用於在網絡設備之間傳遞控制消息。
ping
traceroute
info

*** NAT: 將私有 IP 與公有 IP 做對應、轉換。介接第三層與第四層的「技術」

Layer 4 Protocols

UDP

  • Layer 4 Protocol

  • Stateless

  • 有 Port 的概念

  • Use cases: Video Call、WebRTC、DNS Query

  • 好處:

    • 低延遲:由於 UDP 不進行連接建立、維護或終止,它的延遲比 TCP 更低,非常適合要求實時性的應用,如視頻會議和線上遊戲。
    • 簡單高效:UDP 協議的頭部開銷小,只有 8 個字節,相比 TCP 的 20 個字節(不包括選項),這使得網絡通訊更加高效。
    • 支持廣播和多播:UDP 可以支持廣播和多播,使得同時向多個目標發送數據成為可能,適用於一些特定的應用場景,如實時信息發布。
    • 無連線狀態:UDP 是無連線的,這意味著它不需要在通訊雙方之間建立和維護狀態,這對於那些不需要連線狀態,或者由應用層自己控制狀態的應用來說是有好處的。
  • 壞處:

    • 不可靠傳輸:UDP 不保證數據包的順序、重複或丟失,也不會對丟失的數據包進行重傳,這可能導致應用層需要自行處理這些問題。
    • 無流量控制和擁塞控制:UDP 不進行流量控制和擁塞控制,如果網絡狀態不佳,過多的 UDP 流量可能會導致網絡擁塞,進一步影響數據的傳輸效率。
    • 安全性問題:UDP 較少內建安全特性,比如數據加密和身份驗證,這可能需要應用層或上層協議來補充實現。
    • 無確認機制:由於 UDP 缺乏數據包確認機制,應用程序無法直接知道數據是否成功到達目的地,這在某些對數據傳輸可靠性有較高要求的應用中可能是一個限制。
  • UDP Server Example

import dgram from "dgram";

const socket = dgram.createSocket("udp4");
socket.bind(5555, "127.0.0.1");
socket.on("message", (msg, info) => {
console.log(`message: ${msg} from ${info.address}:${info.port}`);
});

存擋成 xxx.mjs Tip: .mjs 檔案預設支持 import 和 export 語法用於 ECMAScript 模組,而 .js 檔案預設為 CommonJS 模組使用 require 和 module.exports 語法,除非透過配置改為支持 ECMAScript 模組。

nc -u 127.0.0.1 5555

TCP

  • Layer 4 Protocol
  • Standard for transmission control protocol
  • connection & requires handshake
  • stateful
  • TCP 具有 Multiplexing
  • TCP 可以重传丢失的数据段,以确保数据的完整传输。
  • use case: remote shell ,web communication ,database connection
  • Properties:
    • (Receiver) Flow control : TCP 中的一個機制,用來確保發送端不會一次性傳送太多資料給接收端,以避免網路擁塞和資料丟失。
    • (Sender) Congestion Control: TCP 協議中的一個機制,用於監控網路上的擁塞情況,並調整傳輸速率,以避免過多的數據流量導致網路擁塞,保持網路的穩定性和效率。(Two algorithms: Slow Start + Congestion Avoidance)

TCP Connection

  • Connection is a Layer 5 (session)
  • Connection is an agreement between client and server
  • Must create a connection to send data
  • Connection is identified by 4 properties
    • SourceIP-SourcePort
    • DestinationIP-DestinationPort

Layer 7 Protocols

DNS(Domain Name System)

  • 應用層 Layer 7 協議

  • 定義:DNS 是一個用於將網站域名轉換為對應的 IP 地址的分散式命名系統。它充當了網際網路上的「電話簿」,讓計算機可以根據網站域名找到並連接到相應的網站。

  • 運作原理:

  1. 請求發送:用戶在瀏覽器中輸入網站域名。
  2. 本地 DNS 查詢:計算機首先查看本地 DNS 快取,如果沒有找到記錄,則向本地 DNS 伺服器發送請求。
  3. DNS 解析:本地 DNS 伺服器進行 DNS 解析,向其他 DNS 伺服器發送遞歸查詢,逐級尋找目標域名的 IP 地址。
  4. 結果返回:一旦找到目標域名的 IP 地址,本地 DNS 伺服器將結果返回給用戶的計算機,同時將結果保存在本地快取中。
  • 協議層級:在 OSI 模型中,DNS 通常被歸類為應用層協議,因為它主要用於應用程序之間的通信和資訊交換。

  • DNS 解析過程的優化:為了加快域名解析速度,常見的做法是使用本地 DNS 快取,將最近解析的結果保存在本地。一些瀏覽器和作業系統還會使用預先取得的 DNS 結果,以加速域名解析過程。

  • DNS 服務的重要性:DNS 是互聯網基礎設施中至關重要的一部分,它確保了網絡中的各種服務可以被正確定位並訪問。沒有 DNS,用戶將需要記住大量的 IP 地址才能訪問網站,這對於網絡的使用和發展是非常不方便的。

  • 安全性考慮:DNS 的安全性問題也是值得關注的,包括 DNS 劫持、DNS 欺騙等攻擊手法。這些攻擊可能會導致用戶被導向惡意網站或服務。

  • 擴展性與分散式特性:DNS 的分散式設計使得它能夠應對網絡規模的不斷擴大,同時提供高效的解析服務。

    DNS over HTTPS(DoH)和 DNS over TLS(DoT):近年來,隨著對隱私和安全性的關注增加,一些新的 DNS 加密協議被開發出來,以確保 DNS 查詢的私密性。

nslookup , dig

  • DNS Record Settings
    • A
    • MX
    • TEXT
    • CNAME

DNS resolver:

它是 DNS 系統中的一個元件,用於接收和解析由用戶發送的域名查詢請求。 負責向 DNS 系統中的其他伺服器發送請求,以找到該域名對應的 IP 地址。

  • DNS 解析器的角色: DNS 解析器是一個關鍵的元件,它位於網絡中的客戶端設備(例如個人電腦、手機等)或 DNS 伺服器上。當用戶輸入網站的域名時,解析器負責發送 DNS 查詢並處理相應的回應。如果解析器本身無法解析查詢,它將向上層 DNS 伺服器發送遞歸查詢,直到找到對應的 IP 地址。

HTTP

  • 請求 & 回應(status code)

🔸 HTTP/1.1(1997)

  • 基於 TCP 協定(三次握手),每次請求對應一個回應,請求需排隊執行,容易造成 隊頭阻塞(Head-of-line blocking)
  • 引入 keep-alive,讓多個請求可共用同一條 TCP 連線,減少連線開銷,但仍然是 串行傳輸
  • 嘗試使用 管線化(Pipelining) 來提升效率:允許在同一條連線中「連續送出多個請求」,但如果回應順序出錯會導致整體失敗,多數瀏覽器已不再支援。
  • 前端優化技巧(為減少請求次數)
    • 使用 Sprite 精靈圖 將多張小圖片合併成一張。
    • 使用 Data URL(Base64 編碼) 將小圖嵌入 CSS 或 HTML 中。

🔸 HTTP/2(2015)

  • 仍使用 TCP,但在應用層做出重大改進。
  • 核心特色為 多路復用(Multiplexing):同一條連線中可同時傳送多個請求與回應,彼此互不干擾,真正解決了應用層的隊頭阻塞問題
  • 每個請求會被切割為小型的 frame,並加上 stream ID,在同一 TCP 連線中交錯傳輸。
  • 加入 伺服器推送(Server Push) 機制,伺服器可主動推送預期需要的資源,提升載入效率。
  • 不再需要管線化或手動減少請求數,多數過去的前端技巧成為可選而非必要

🔸 HTTP/3(2022)

  • 改用 QUIC 協定(基於 UDP),不再依賴 TCP,解決傳統 TCP 的限制。
  • 握手更快(將 TLS 與連線建立合併),在高延遲或封包丟失環境下表現更好。
  • 同樣支援 多路復用,但不像 HTTP/2 受限於 TCP 的底層隊頭阻塞,整體傳輸效能更高。
  • 特別適合行動裝置與網路變動頻繁的應用場景(如影音串流、即時遊戲、行動網路)。

Session & Cookies

HTTP 是一種 stateless 的協定

Session: 伺服器為這次請求開闢一塊記憶體間,這物件便是 session 物件、結構為 ConcurrentHashMap。並且會同時生成 session-id, 透過 request-header: set-cookie: JSESSIONID=xxxxxx,cookie 的過期時間是在瀏覽器階段結束之前 Cookie: 瀏覽器的一小段記憶空間

分享好文章:

Websocket

  • 定義:WebSocket 是一種在網頁瀏覽器和伺服器之間建立持久、雙向通信的協議。基於 WS 協議,TCP 協議,位於「應用層」Laryer 7
  • 用途:主要用於實現即時通信功能,如聊天應用、線上遊戲、股票報價等。
  • 建立過程:通過標準的 HTTP 握手建立初始連接,然後升級為 WebSocket 連接。
  • 通信方式:提供雙向通信能力,使得伺服器和客戶端可以在不同時間點上互相發送訊息,不需要依賴於客戶端的請求。
  • 資源和帶寬:使用較少的資源和帶寬,因為減少了 HTTP 請求和響應的開銷。
  • API:提供了簡單易用的 JavaScript API,開發者可以輕鬆地在網頁應用程序中使用 WebSocket 進行即時通信。
  • 訊息傳送:使用 send() 方法向伺服器發送訊息,並通過 onmessage 事件處理程序接收伺服器發送的訊息。
  • 參考影片:連結

WebRTC

  • Standard APIs for Web Realtime Communication
  • WebRTC, short for Web Real-Time Communication, is both an API and a Protocol.(Ref)
  • 用途:主要用於實現瀏覽器到瀏覽器之間的視訊通話、音訊通話和檔案共享等即時通信。
  • 通信方式:提供了一種用於在瀏覽器之間建立點對點的通信連接的 API。
  • 傳輸層:除了使用 TCP 協議外,還使用了 DTLS(用於安全性)和 ICE(用於穿越防火牆和 NAT)等技術。
  • 訊息格式:可以包含音訊、視訊、數據等,並且使用 SDP(會話描述協議)進行媒體信息的描述。
  • 總結
    • Media Capture and Streams API: 使網頁裝置能夠存取本地端系統的多媒體串流(影音串流)
    • Peer-To-Peer Connection (P2P): 能夠在沒有中介層的情況下讓瀏覽器之間能夠互相傳遞資料
特性WebSocketWebRTC
定義是一種雙向通信協議,用於在客戶端和伺服器之間建立持久連接。是一種即時通信協議,用於在瀏覽器和其他設備之間實現點對點的音頻、視頻和數據傳輸。
用途主要用於在瀏覽器和伺服器之間進行即時通信,例如聊天應用、遊戲等。主要用於實現瀏覽器到瀏覽器之間的視訊通話、音訊通話和檔案共享等。
傳輸層基於 TCP 協議。除了使用 TCP 協議外,還使用了 DTLS(用於安全性)和 ICE(用於穿越防火牆和 NAT)等技術。
訊息格式原始 WebSocket 協議的訊息格式是文本或二進位數據。但也可以使用子協議(例如 STOMP)進行訊息封裝。WebRTC 的訊息格式可以包含音訊、視訊、數據等,並且使用 SDP(會話描述協議)進行媒體信息的描述。
處理方式主要由 JavaScript API 進行控制。由 JavaScript API 和 WebRTC 原生庫進行控制,例如 WebRTC 库或第三方庫。
支援性目前所有主流瀏覽器均支援 WebSocket。WebRTC 在主流瀏覽器中的支援程度較好,但仍存在一些兼容性問題。
安全性基本上是明文傳輸,但可以通過 TLS/SSL 加密來實現安全傳輸。使用 DTLS 和 SRTP 來實現端對端的安全傳輸。
  • WebSocket V.S WebRTC: WebSocket 主要用於瀏覽器和伺服器之間的即時通信,而 WebRTC 則專注於瀏覽器到瀏覽器之間的實時視訊和音訊通話。WebSocket 更適合一對多的通信模式,而 WebRTC 更適合點對點的通信模式。

TLS

Optimization

MTU、MSS、PMTUD

在網路領域中,MTU、MSS 和 PMTUD 是三個常見的術語,它們分別代表以下概念:

  • MTU(Maximum Transmission Unit):指的是在一個通訊協定中,所能夠傳送的最大封包大小,通常以位元組(bytes)為單位。

  • MSS(Maximum Segment Size):指的是在 TCP 協議中,所能夠傳送的最大分段大小,也就是 TCP 頭部除外的最大資料量。

  • PMTUD(Path MTU Discovery):是一種通過動態探測和設定通訊路徑上的最大傳輸單元(MTU)的方法,以確保在 IP 網路上的資料包不會因為過大而被分段丟失。

概念定義使用範疇
MTU最大封包大小,在通訊協定中所能夠傳送的最大資料量。在網路設定和配置中,特別是在路由器、交換機等網路設備中常見。
MSS在 TCP 協議中,指的是傳送的最大分段大小,通常由接收端和發送端之間的協商決定。在 TCP/IP 通訊中,尤其在調整 TCP 的性能和傳輸效率時重要。
PMTUD是一種通過探測通訊路徑上的最大封包大小的方法,以確保資料包不會因為過大而被分段丟失。主要在 IP 網路中,特別是在通過多個網路節點進行傳輸時,確保資料

Layer 4 and Layer 7 負載平衡

Layer 4 和 Layer 7 負載均衡是兩種常見的負載均衡技術,它們在處理網路流量和分發請求方面有所不同。以下是 Layer 4 和 Layer 7 負載均衡之間的比較:

  • Layer 4 負載均衡: 基於傳輸層(Layer 4)的負載均衡,主要使用 IP 地址和端口信息進行流量分發。 通常使用基於 TCP 和 UDP 的負載均衡器,能夠在不解析應用層協議的情況下對流量進行分發。 負載均衡器僅根據 IP 地址和端口信息來決定請求的路由,而不考慮請求的內容。 優點包括低延遲、高效率和高性能,但缺點是無法進行高級的流量分發和請求路由。

  • Layer 7 負載均衡: 基於應用層(Layer 7)的負載均衡,通常使用 HTTP 請求的詳細信息(如 URL、Cookie、請求方法等)來進行流量分發。 負載均衡器能夠深入解析應用層協議,根據應用層的信息來決定請求的路由和分發策略。 具有較高的智能化和彈性,可以根據請求的內容進行更精細的流量分發和請求路由。 優點包括更靈活的流量分發和更強大的請求路由能力,但缺點是相對於 Layer 4 負載均衡器而言,性能上可能會稍微降低。 總的來說,Layer 4 和 Layer 7 負載均衡都有其特定的應用場景和優缺點。Layer 4 負載均衡器適合對流量進行簡單而高效的分發,而 Layer 7 負載均衡器則更適合根據應用層信息進行精細的流量分發和請求路由。在實際應用中,需要根據具體的需求和場景來選擇適合的負載均衡器。

後端模式

Journey of a request to the Backend

  1. Accept (Layer 4 TCP/UDP)
  2. Read
  3. Decrypt
  4. Parse
  5. Decode
  6. Process

RPC

  • RPC 是一種不需要了解底層網路技術就可以透過網路從遠端電腦程式上請求服務的協定
  • 主要解決分散式系統中服務與服務之間的呼叫問題

有三個角色

  • Registry:將本機服務發布成遠端服務、管理遠端服務
  • RPC Server:提供服務介面定義與服務類別的實現
  • RPC Client:透過遠端代理物件呼叫遠端服務

    有點像實做出訂閱模式的結構...

SSE

  • SSE 單向的:讓 server 可以推送資料給 client 端、基於 HTTP 協議
  • 在開發者工具當中會有個event-stream的 tab
res.set({
"Content-Type": "text/event-stream",
"Cache-Control": "no-cache",
Connection: "keep-alive",
});