# [Week 6] 網路、化學系爆炸了
###### tags: `MCL`
## 工讀相關
* 有發生啥事ㄇ
* 化學系館爆炸了,我的電腦壞掉了
## 網路
電腦之間的資料交換大部分都是透過網際網路,每台電腦上獨一無二的MAC地址就是電腦的唯一地址,傳輸過程中遵循公認的協議(TCP/IP stack)進行編解碼,並借由MAC地址送達指定的目的,下面聊聊網路節點常見的硬體和軟體設備。
1. **網卡**:Mac地址由網卡所負責,代表著一個獨一無二的地址
1. **交換器**:可以將交換器理解為網路口的延長線,能將單個網路口擴充多個網路口,它基於MAC地址判定轉發到哪個設備。
1. **路由器**:負責連結兩個獨立網路的設備,例如連結兩台電腦,或是連結兩群電腦,與交換器的差別是,他是TCP/IP第二層的設備,而路由器是第三層的設備,除了具有交換器的功能之外,能將電腦的MAC地址與IP地址進行映射關係。一般在軟體層面指定目的地電腦是用IP地址而不是Mac地址,IP地址的好處是較方便的快速找到傳送訊息的目標電腦。
1. **防火牆**:控制網路安全和訪問規則的系統,例如阻擋某個ip的任何流量通過,在Linux可以利用iptables建立規則
## OSI model

OSI模型是一種制定網路標準都會參考的概念性架構,依據網路運作方式,OSI模型共切分成7個不同的層級,每級按照網路傳輸的模式,定義所屬的規範及標準。
所謂的OSI,是由國際化標準組織(ISO)針對開放式網路架構所制定的電腦互連標準,全名是開放式通訊系統互連參考模型(Open System Interconnection Reference Model),簡稱OSI模型。
依據網路運作方式,OSI模型共切分成7個不同的層級,每級按照網路傳輸的模式,定義所屬的規範及標準。由具體到抽象的網路傳輸方式層次來看,7層分別為實體層、資料連結層、網路層、傳輸層、會議層、展示層及應用層。
[延伸閱讀](https://ithelp.ithome.com.tw/articles/10000021)
## 通訊協議
我相信很多人都已經有使用過很多 http、tcp、udp 這些東東,但是我相信還是有人應該只是懂的在瀏覽器打個 http 網址而以,然後說這就是通訊協議,某些方面不能說錯,但是我相信你這樣說給一個初學者聽一定很難理解的。接下來咱們來理一理到底什麼是通訊協議。
### 先來理理什麼是協議呢 ? 簡單的用白話文就是:
協議就是 A 與 B 雙方要完成某件事情,所約定好的處理流程。
咱們來舉個例子,假設有位仁兄,雙方住在一間屋子裡面,然後他們只有一把鑰匙,所以這時他們就在思考,一個人已經在房子裡面了,然後另一個回來以後就要敲門,然後在家的人就打開來。
但這時要如何確保敲門的人是室友呢 (先假設看不到外面) ? 如果是壞人敲門你直接開門,那你就準備呵呵呵了,所以 A 與 B 就約定好了一個**確認室友協議**,這個協議如下:
協議想完成事項:確認對方是不是室友
協議標準:
假設 B 在家,A 在外面。
A 敲 3 下門。
B 聽到後,要求 A 說暗語 (你今天真帥)
A 說暗語(你今天真帥)
B 收到後,就開門。
### 最後所謂的通訊協議就是:
所謂的『 通訊協議 』就是網路上 A 與 B 雙方要進行溝通所約定好流程。
## TCP/IP 通訊協議組
### TCP/IP 它是一組協議組,它主要想完成的事情為:
在網路上可以進行端點對端點的溝通
TCP/IP 總共分成了四個層級,如下圖,每個層級都有各別的協議,來幫助完成某件事情。

### 第一層 - 網路介面層 (Link layer)
假設你想要將資料傳輸到對方電腦中,你要做的第一件事情是啥 ?
答案是要將電腦的方式連結起來啊 (光纖或電纜或電磁波),都沒連起來要如何傳輸 ? 通靈嗎 ?
接下來這層級事實上還有做另外一件事情,上面咱們已經將電腦連結在一起以後,這樣基本上可以傳送 0 與 1 的資訊,但是問題這是沒意義的,誰知道你傳這一組 0 與 1 是想表達什麼意思。
在這層有個叫**Ethernet**的協議,它規定了一個**幀 (Frame)**的概念(不是封包喔)。幀基本上的組成如下:
幀 = 表頭 (Head) + 數據 (Data)
表頭基本上就是放某個層級所必須的相關資訊,而數據就是你所要傳輸的東西。
它有以下幾個限制:
* 表頭的長度固定為 18 byte。
* 數據最短為 46 byte 最長為 1500 byte。
* 如果超過這個長度就會分成多個幀。
#### 表頭
在這個層級,它的表頭基本上會放二種資訊:
* 發送者的 MAC 地址
* 接受者的 MAC 地址
BTW 順到一提 MAC 就是每台電腦獨一獨二的位置。
**這裡有一個問題,要如何知道對方的 MAC 地址呢 ?**
這裡簡單的說使用 ARP 協議(它是網路層的東西)可以取得同一子網路的 MAC 地址,那不同的子網路呢? 那就只能丟到 gateway 在來處理囉。
**那另外一個問題,就算知道 MAC 地址後,我要如何將資料丟給它呢?**
答案是使用廣播,就是往這個世界(子網路)的每個人都敲敲門,然後問他這個信上面的地址(MAC)是不是你家的,嗯真的是這樣。
#### 最後總結此層級功用:
1. 定義如何使用物理方式將電腦與電腦連結起來。
2. 定義最基本如何讓某台電腦收到我傳的資料 (MAC 地址與廣播)。
### 第二層 - 網路層 (Network Layer)
在第一層時咱們有提到每一台電腦都有一個獨立 MAC 地址,然後想要找到對方就是使用廣播來找到對方,但是如果每一次發送,都是給世界上每一台電腦那保證一定會天下大亂的,因此才會出現所謂的子網路,只有在子網路內的才會使用擴播。
但這有個問題,咱們 MAC 地址長的如下,共用 48 個位元來與十六進位來表示,前 24 個為廠商編碼,後 24 個為廠商的網卡流水號。
a4-5e-60-d0-bb-ff
**那從 MAC 地址要如何知道他是屬於那個子網路呢 ?**
答案是不可能,因為它就只有上面說的那些資訊,因此這個層級就誕生囉。
#### IP 協議
它提出一個新的地址架構,就是咱們常使用的 IP。
124.108.131.31
IP 協議的細節等等說,你只要知道它有以下二個功能就行:
* 為每一台電腦分配 IP 位置。
* 並且可以知道此位置,是在那個子網路內。
#### 表頭
在這個層級,它的表頭基本上會放二種資訊:
* 來源端 IP 位置
* 目的端 IP 位置
以上兩個資訊主要是為了讓送貨員知道,要送到那個子網路去。
#### 最後總結此層級功用:
定義 IP 地址架構,並且讓送貨員知道要送到那個子網路世界去。
### 第三層 - 傳輸層
誕生源由
第二層咱們已經可以成功的找到目標電腦囉,也可以將資料丟到目標電腦上,但這裡有一個問題要問問。
電腦上有很多要用到網路的應用程式,我怎知道要丟給誰 ?
為了解決這個問題,所以產生了Port的概念,也就是每一個需要用到網路的應用程式都給他個 Port ,只要知道要發到對方電腦上的那個 Port,那就知道會丟到那個應用程式。
Port 基本是由 16 個二進位組成,總共提供 0 ~ 65535 個編碼使用,其中前 0 ~ 1023 已經被系統占用囉。
到裡這一層基本上咱們就能實現應用程式與應用程式的資料交換囉,因為你已經知道確切要傳輸的位置囉。
#### 表頭
在這個層級,它的表頭基本上會放二種資訊:
* 來源端 Port
* 目的端 Port
要讓送貨員知道,要送去那個應用程式。
常用協議 TCP 與 UDP ...有機會再說杯
#### 此層總結
建立應用程式與應用程式的傳輸方式。
所以基本上這一層所新增的最基本的表頭就是 Port,讓我們知道丟到那個應用程式。
BTW 在這個層級發送的東西,就被稱為『封包』
### 第四層 - 應用層
誕生源由
在第三層時,我們已經可以進行應用程式對應用程式的傳輸,但是網路世界的應用程式種類非常的多(ex. 網站、郵件、語音傳輸),假設我們丟的資料分別如下給網站、郵件:
網站:
{
method: POST,
data: ‘babababa’
}
郵件:
{
sender: ‘Mark’,
receiver: ‘Mark II’,
data: ‘HI I am Mark'
}
那我問你,收到這兩個資料者,要如何判斷它是網站用,還是郵件用 ? 有人說用 schema 來知道誰是誰,那如果網站的少了一個欄位怎麼辦 ?
所以呢 ~ 這時咱們就定一個標準,像如果是傳送給網站應用與郵件應用的就會變成如下,其中 http 與 smtp 就是一項標準,每當我們看到 http 時就知道要用什麼格式來解析他囉,並且也知道他是用來做啥的,因為 http 都定義好了。
http
{
method: POST,
data: ‘bababab'
}
smtp:
{
sender: ‘Mark’,
receiver: ‘Mark II’,
data: ‘HI I am Mark'
}
#### 表頭
看個應用的定義。
#### 此層結論
定義各種類型應用的標準,不然誰知道要如何做啥事情 ?
### 從 A 到 B 發送數據的流程
最後咱們來看看實際上從 A 發送一則資料到 B 的實際流程,由於上面有提到在第三層時事實上就可以發送數據到指定的應用程式囉,所以咱們就直接來看看如果直接從第三層發送數據會是如何處理。
1. A 用戶發送了 “Im Deeson” 數據。
1. A 在傳輸層時加入 TCP 表頭 (為了知道傳送到那一個電腦中那個應用)
1. A 在網站層時加入 IP 表頭 (為了要知道傳送到那一個子網站,外加知道上一層是 TCP),然後同時間會使用 ARP 協定,來取得這個 IP 所對應的 MAC 地址,然後帶入下一層。
1. A 在網路介面層(數據連結層)加入 Ethernet 表頭 (為了要知道傳送到那一台電腦,外加知道是用 IPv4 or 6)
1. B 在網路介面層收到,查看 Ethernet 表頭的 MAC 地址是不是我家的。
1. B 在網路層解析 IP 包,也在看看 IP 是不是我家的,並且看看上一層要用 TCP 還是 UDP 解析。
1. B 在傳輸層解析 TCP 包,然後看到 Port 為那個應用程式的,就丟給他

## 網際網路通訊協定第四版 (IPv4
[傳送門啦](https://docs.mcl.math.ncu.edu.tw/books/weekly-meeting/page/week-5-%E7%B6%B2%E8%B7%AF-%28ipv4%29%E3%80%81proxy%E3%80%81vpn)
## 延伸閱讀
[30天之即時網路影音開發攻略(小白本) 系列](https://ithelp.ithome.com.tw/users/20089358/ironman/1923?page=1)