---
# System prepended metadata

title: '[IM016] How a browser works (3) - TCP/IP model'
tags: [javascript, ironman]

---

# [IM016] How a browser works (3) - TCP/IP model

> **前言**
> 2020 秋天，我將用 30 天的時間，來嘗試回答和網路前端開發相關的 30 個問題。30 天無法一網打盡浩瀚的前端知識，有些問題可能對有些讀者來說相對簡單，不過期待這趟旅程，能幫助自己、也幫助讀者打開不同的知識大門。有興趣的話，跟著我一起探索吧！

![](https://images.unsplash.com/photo-1522542550221-31fd19575a2d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1050&q=80)

## Create connection

在上一篇文章當中提到，當我們在瀏覽器當中輸入網址之後，就會透過各種 DNS server，來幫我們找到目標網站的 IP address。接下來就是要建立通訊連線，讓我們可以獲得目標網站的資源，或是發送更多的請求。

要建立通訊連線也是一件不簡單的事情。在過去沒有電話和網路的時代，遠距離通訊就只能靠信件，首先要先把資訊寫在紙上，然後用信封裝起來，信封上面需要寫著收件人的姓名與地址，接著，就要透過郵政系統，把這筆資訊送到對方手上。至於郵政系統本身，又有許多的規則與規定需要遵守，才能確保郵差能夠將資訊送到對的地方。

即便進入了網路世代，通訊的本質還是差不多，需要將資訊打包，遵守一定的方式與規定，傳遞到對方的手上。在過去有郵政系統，在網路世界，有 ISO 推出的 Open Systems Interconnection model (OSI model) 可以作為參考。

## OSI model

OSI model 是一個概念模型，它建立了一個框架，說明資訊該如何從應用程式、透過網路連線、經過實體的傳輸線，最後來到目標網站或主機。在 OSI model 當中有七層的架構，每一層都有其相對應的 protocols，定義了資訊傳出的規範。

不過 OSI model 只是個概念框架，並沒有說明實際網路連線與傳輸該如何實現。目前實際上真正實現的是 TCP/IP model 所規範的內容。

![](https://img-en.fs.com/community/wp-content/uploads/2017/11/seven-layers-of-OSI-model.png)

## TCP/IP model

相較於 OSI model 的七層架構，TCP/IP model 只有四層，可以說是簡化版的 OSI model。雖然說是簡化，但實際上整體的架構還是不脫 OSI model 的內容。

在下圖可以看到 OSI model 的七層架構，與 TCP/IP 四層架構的對應關係：

![](https://www.researchgate.net/publication/327483011/figure/fig2/AS:668030367436802@1536282259885/The-logical-mapping-between-OSI-basic-reference-model-and-the-TCP-IP-stack.jpg)

在 **Application Layer** 當中的 protocol，定義了應用程式透過網路交換資訊的格式，常見的有 `HTTP`, `HTTPS`, `FTP` (檔案傳輸), `POP3` (接受電子郵件), `SMTP` (發電子郵件), `TELNET`, `SSH` 等等

在 **Transportation Layer** 當中的 protocol，定義了傳輸資料的品質（可靠性與順序性），譬如常見的 `TCP` 與 `UDP` 協議。

而 **Internet Layer** (或 Netword Layer) 當中的 protocol 則定義了資料如何在一個單一網路上傳輸並可以抵達目的地。這裡其實就是靠著先前提到的 IP address 來找到目標位置。

最後的 **Network Layer** 則定義資訊如何透過韌體與硬體間傳遞與接收。

不過在開發網路應用程式的過程當中，我們大部分關注可能都在 Application Layer 的上，因為 Trasportation 與 Internet Layer 的實現，多半直接靠作業系統自動完成，Network Layer 則靠電腦與網路連線設備自動完成。

雖然如此，不過今天還是想來聊聊 Trasnportation Layer 當中的 TCP 與 UDP 協議，瞭解網路連線是如何被建立的。

## TCP vs. UDP

TCP 和 UDP 都是透過同樣的方式傳輸資料，並透過 IP 找到目標。不過兩者因為性質上的差異，所以應用場景也有很大的不同。

TCP 用於需要「可靠通訊」的場景，「可靠通訊」的意思是，資料在傳輸的過程中不會遺漏，而且有正確的順序性。大部分情況下我們都需要 TCP 來保證通訊的可靠性。

相對於 TCP，UDP 有時也被稱作「不可靠的通訊」。這樣我們可能會想，既然不可靠，為什麼我們還會使用 UDP 呢？因為 TCP 為了保證「可靠」，必須依賴相對應的機制，而這些機制會使用較多的資源，並降低傳輸效率。而在某些使用場景，像是網路電話、視訊會議、遊戲等，更看重傳輸速度與即時性，品質方面可以稍微犧牲，因此就可以採用 UDP 的傳輸方式。

另一方面，UDP 可以做到一對多的廣播功能，而 TCP 就只能夠一對一通訊。

## TCP 3-Way handshake & 4-Way handshake

TCP 為了在通訊連線前，確認對方可以準備接收訊號，以及在斷線前，確認對方準備好離線，因此發展出了連線前的 3-way handshake 與離線前的 4-way handshake 機制。簡單說明如下：

**連線前的 3-way handshake**

1. CLIENT: 發送通訊連線請求
2. SERVER: 確認允許連線
3. CLIENT: 確認連線


**離線前的 4-way handshake**

1. CLIENT: 發送通訊斷線請求
2. SERVER: 確認收到斷線請求，並繼續傳送最後的資訊
3. SERVER: 最後的資訊傳送完畢，確認可以斷線
4. CLIENT: 確認斷線

## End

xxxx


## Ref
* [前端三十｜30. [WEB] 從輸入網址列到渲染畫面，過程經歷了什麼事情？](https://medium.com/schaoss-blog/%E5%89%8D%E7%AB%AF%E4%B8%89%E5%8D%81-30-web-%E5%BE%9E%E8%BC%B8%E5%85%A5%E7%B6%B2%E5%9D%80%E5%88%97%E5%88%B0%E6%B8%B2%E6%9F%93%E7%95%AB%E9%9D%A2-%E9%81%8E%E7%A8%8B%E7%B6%93%E6%AD%B7%E4%BA%86%E4%BB%80%E9%BA%BC%E4%BA%8B%E6%83%85-49341bcf6aff)
* [UDP vs TCP: What are they and how do they differ?](https://www.comparitech.com/blog/vpn-privacy/udp-vs-tcp-ip/)


***
> **TD**
> Be curious as astronomer, think as physicist, hack as engineer, fight as baseball player
> 
> [More about me](https://tsungtingdu.github.io/profile/)
> 
> *"Life is like riding a bicycle. To keep your balance, you must keep moving."*

***

###### tags: `ironman` `javascript`