Network Basic
Brief History
網路的歷史最早可以追溯到 1960 年代的美蘇冷戰時期,當時軍方的通訊手段相當脆弱,採用是類似電話的 circuit switch 技術,會在通話時會分配一條專用的通道,而一旦通道中間的某個環節出現問題,整個通訊就無法完成。
為了改善這個問題,美國國防部先進研究中心開始研究新的通訊方式,用來確保在指揮中心或部分線路被摧毀的情況下仍然有辦法維持通訊,這個研究計劃促成了世界上第一個分散式封包交換網路 ARPANET 的誕生。
第一個 ARPANET 網路誕生於 1969 年,它成功串連了四所學校並發送了 "LO" 訊息。
隨著 ARPANET 的發展,各個大學跟機構都發展出了一套專屬於自己的網路,而新的問題也隨之誕生,電腦跟電腦之間已經可以互相通訊了,但不同網路之間卻沒辦法互相通訊。
為了解決這個問題,Vint Cerf 和 Bob Kahn 提出了廣為人知的 TCP/IP 協議,這套機制不需要統一所有電腦的標準,而是透過一套邊界溝通機制,來使不同網路間可以互相溝通。 也就是說,在你的網路內部你要怎麼做都隨便你,但如果要跟其他網路溝通,那就必須遵守這套規定。
有了這套協議之後,整個網路就可以串連起來了,只是早期的網路依然停留在類似於終端機的介面,並不適合一般人使用,直到 1989 年 Tim Berners-Lee 發明了全球資訊網,為網路增加 URL、HTTP、HTML 等標準後,才逐漸發展出了瀏覽器,網路也才正式成為日常生活中的一部分。
Network Model
網路的結構採用的是分層設計的方式。 透過將網路功能劃分為多個層次,每層可以專注於特定的任務,並且只與相鄰的層進行互動,簡化設計和實現過程。 同時,使用者也可以選擇適合自己的協議來實現各種功能,來最大化系統的效能。
現代網路主要有兩種常見的分層模型,分別是 TCP/IP 和 OSI model。
OSI
OSI (Open Systems Interconnection) 模型是一個由 ISO 提出的網路分層模型,總共有七層,分別是 :
- Layer 7 - Application Layer : 提供應用程式使用網路介面的入口
- Layer 6 - Presentation Layer : 編碼轉換、加解密
- Layer 5 - Session Layer : 建立和管理兩台電腦的連線
- Layer 4 - Transport Layer : 負責端對端的網路連線,如重傳
- Layer 3 - Network Layer : 負責將封包送到對的位置
- Layer 2 - Data Link Layer : 負責區域網路內的傳送
- Layer 1 - Physical Layer : 將 0101 的位元轉換成訊號
TCP/IP
TCP/IP 模型是現代網路的主要架構,它將網路功能劃分為四層,分別是 :
- Application Layer : 對應 OSI 中的 5、6、7 層
- Transport Layer : 對應 OSI 中的 4 層
- Internet Layer : 對應 OSI 中的 3 層
- Network Access Layer : 對應 OSI 中的 1、2 層
兩種模型都有各自的優劣勢,區別在於 TCP/IP 主要以實作的角度出發,而 OSI 模型則是先定義了通訊協議需要甚麼,再把它拆解成不同的層。 一般來說,OSI 比較常出現在課本中,現代的協議已經幾乎不會把第五層跟第六層拿出來特別提了。
Layered Architecture
一般來說,我們在討論這個協議是第幾層的時候指的都是 OSI 模型中的數字,如傳輸層指的就是第四層。

Layer 1: Physical Layer
物理層是網路的最底層,它負責將 0101 的位元轉換成適合傳輸媒介 (如電線上的電壓、光纖中的光脈衝) 的訊號形式,並把接收到的訊號轉換回位元。
這部分通常是屬於電機或物理的範疇,涉及到硬體跟材料的部分,對於軟體工程師來說通常不太需要深入了解,一般的網路課本通常也會直接跳過這一層。
Layer 2: Data Link Layer
區域網路 (Local Area Network, LAN) 是一種在有限的地理範圍內連結多台設備的網路,通常是由 Wi-Fi 或是家用路由器所建立的網路,而資料連結層的主要任務就是負責在區域網路之間傳送資料。
資料連結層會將來自網路層的 packet 包裝成 frame,並透過 MAC 地址來識別區域網路中的設備,確保資料能夠正確地傳送到目的地。 MAC 地址是一個全球唯一的標號,由生產公司在製造網卡時固定的,格式通常是六組兩位數的十六進位數字 (例如 00:1A:2B:3C:4D:5E)。
Layer 3: Network Layer
網路的世界是由許多不同的網路組成,每個區域網路內部可以自己管理資料傳輸,但當資料需要跨越不同的網路時,就需要網路層來負責路由。
網路層採用的是 best-effort 的方式,它會依據 IP 盡最大努力把封包傳到目的地,但並不保證資料一定能夠成功抵達。 這樣做的原因是逼不得已,因為網路本身就是不可靠的,無法預測甚麼時候會出狀況,而在網路中追蹤每一條連線更是不可能做到,因此只能將可靠性交給終端來處理。
Layer 4: Transport Layer
由於網路層中提供的是 best-effort 的服務,這意味著資料在傳輸過程中可能會遺失、重複或亂序,為了確保資料一定可以傳送到目的地,傳輸層會負責在兩台主機之間建立端對端的連接,並提供錯誤檢測與修正的機制。
因為有了這層的存在,應用程式不需要再擔心底層網路可能出現的問題,可以專注於處理自己的邏輯。
Layer 7: Application Layer
在有了前面幾層之後,我們已經解決了資料如何在網路中傳輸的問題,最後一層應用層則是直接面向使用者。 它定義了應用程式之間如何交換資料,例如使用 HTTP 協議來傳輸網頁、使用 DNS 來解析網域。
Header
在一開始有提到,網路採用的是 packet switch 的模式,也就是說需要傳送的資料需要被拆成多個封包進行傳送,並且每一層都需要能理解那一層所需要的東西。 因此,除了應用程式需要的資料外,每一層在傳送資料時,會在資料前面加上自己的標頭,當資料到達接收端時,會依照相反的順序將標頭一層層剝除,並根據標頭中的資訊來處理資料。

終端主機會把要傳送的資料一層一層封裝,而每個經過的路由器都會至少將其解開到網路層來獲取 IP 地址,然後再重新封裝送到下一個節點,直到目標主機為止。

Performance
對於網路來說,除了要能確保資料能夠到達指定的電腦之外,最重要的就是要能盡可能的快,而網路的快慢通常會通過下面三個名詞來表示 :
- bandwidth : 指的是在單位時間內能傳輸的資料量,通常以 bps (bits per second) 為單位來表示。頻寬越大,表示網路能夠同時傳輸更多的資料
- propagation delay : 指的是資料從一個節點傳送到另一個節點所需的時間,這個時間主要取決於傳輸媒介的物理特性 (例如光纖的速度) 以及兩個節點之間的距離
- queuing delay : 指的是資料在路由器中等待的時間,當網路流量過大時,封包可能需要在緩衝區中排隊等待傳輸
這裡需要特別注意的是,1kbps 並不是指每秒可以傳送 1KB 的資料,這裡的 1k 指的是 1000 bits,而 1KB 總共有 1024 * 8 bits。
舉例來說,如果我們有一個 1Mbps 的連接,並且需要傳輸一個 1MB 的檔案,假設傳播延遲為 0.1s,且排隊延遲為 0.1s,那麼所需傳輸時間可以這樣計算 :
- 傳輸時間 = 1 MB (1024 * 1024 * 8 bits) / 1 Mbps (1000000 bits per second) = 8.192 s
- 總延遲 = 傳輸時間 + 傳播延遲 + 排隊延遲 = 8.192 s + 0.1 s + 0.1 s = 8.392 s