Internet Protocol Suite(網路協定)

前言

礙於面試時常被問「網路協定」,也惡補二專、碩班有聽沒有懂的網路知識,希望紀錄下來學以致用(避免下次再被問倒?)

當我在google搜尋「API 教學」時,無意間看到網路基礎TCP/IP這篇文章,但仍覺得沒有完全看懂,也就順藤摸瓜找到從傳紙條輕鬆學習基本網路概念

首先,我腦中的網路大概是這個形式

UserRequest
但是實際上,你在Browser(瀏覽器)中輸入URL(網址)時,Browser會向DNS(網域名稱系統)查詢對應的IP。這時Browser才會向Server發出Resquest
UserToDNS

汝非魚焉知魚之樂?

然而,在如深似海的公開網路中,如何知曉Server是否「真的」收到你的Resquest?這時我們需要一個共通的共識「Three-Way Handshake(三方交握)」

ThreeWayHandshake
這個共識可以確定:
  1. User「知道Server有收到訊息」 -> Response
  2. Server「知道User有收到訊息」 -> Roger

這個共識就是TCP協定,可以確保雙方瞭解另一方接收狀況。

代溝的嚴重性

雖然確定Server有收到訊息,但內容沒有統一的格式,導致傳訊息都看心情來寫、收訊息一團亂,沒有辦法非常直觀地找到需要的資訊。因此,我們需要說好使用哪一種協定、協定的規格是什麼?舉例來說,我向Server發送Request時特別指定使用「Http協定(80 port)」,並依照協定的規範撰寫訊息。

HTTP

在Http協定中,將內文區分header與body
Client to Server:
header包含action(請求動作)與IP(目標地址),而body則包含其他東西
其中action使用這些代表User向Server請求的動作

  1. GET: 取得資訊
  2. POST: 新增內容
  3. DELETE: 刪除內容
  4. PUT: 更新內容

Server to Client:
header包含status(狀態)與IP(目標地址),body則包含Client請求的內容
其中status使用這些數字代表Server回覆User的結果

  1. 200 OK: 成功接收
  2. 400 Error: Bad Requset錯誤請求(詳述錯誤內容)
  3. 404 Error: Not Found找不到資源

如此一來,雙方既可以保證收到對方的訊息,也有一個正式的撰寫規範。
當然,一個Server可以同時有好幾種服務,舉凡FTP(21 port)、Https(443 port)等等。這些port(埠)分別代表不同的服務,但有些特殊的Server(或是這是你專屬的Server)可以自己指定port代表哪些服務。

相隔兩地的4樓住戶

現在,我們可以來說IPS是如何將通訊過程分成4 layer(層)架構的

TCP/IP 4 Layer
由最下層開始說, Network Access(連接層): 決定你們是傳紙條還是刻在石板(再丟給對方?) Internet(網路層): 決定收/發方地址的形式,現在主流是IPv4,就是大家常見的192.168.0.1 TranSport(傳輸層): 決定是否確保接收,如TCP有點類似雙掛號的概念,而UDP則像急件 Appliction(應用層): 決定內容的格式,像是匯款單上的數字就一定是大寫等等

當然,Client與Server之間並非一定使用哪種協定,而是看實際使用的狀況去決定。例如在live直播時,你並不會想要收到Server的每一幀畫面,即使漏掉幾幀畫面也不影響大局,最重要的是看到即時的畫面,這時我們就會使用UDP協定取代前面所述的TCP「Three-Way Handshake」。UDP相對TCP更快速,但並不保證可以成功接收每一則訊息。

結語

最後,其實我以前學的網路協定是7 layer的IOS模型,礙於七層太難解釋,未來有機會再做研究(?)
但下一個目標是實作HTTP協定。