# 網路基礎概論 ## 從傳紙條輕鬆學習基本網路概念 其實可以把傳紙條這件事情「分層」來看,意思就是把傳紙條分成不同的層級,每一層都只專注於傳紙條的其中一個面向: ![Image for post](https://miro.medium.com/max/2285/1*58hXSwsixNDxVkbbFKJ-Cg.png) 傳紙條分層 最底下一層就是傳紙條,指的就是「傳遞紙條」這個實體的動作,可是如果只有這層的話,你怎麼知道要把紙條傳給誰?所以中間那層是加上收發地址,才能知道要傳給誰嘛。 有了底下兩層,已經可以傳紙條給任何人了,但沒辦法保證收發是正常的。所以最上面那層代表的是「如何傳送資料」,意思是說你可以使用我們上面提到的機制(三個步驟)來傳紙條,就能夠確保收發正常,但你不想要也可以。 #### 第一集小結 在第一集裡面,我們用了傳紙條當作生活化的範例,主要是想讓大家知道「傳紙條就跟網路傳封包沒兩樣」,想讓大家把這兩個東西對應起來,在思考網路概念時就會比較有畫面。 而我們也把傳紙條與網路進行了「分層」,分層的好處就是可以很明確看到每一層關注的東西都不同,所以只要處理跟那一層有關的事情就好了。 而第一集最後,我們導入了《紙條保證傳得到通訊協定》(TCP),來確保收發正常。能夠確保傳輸正常以後,就有了更多傳紙條的應用出現。 #### 第二集所對應到的網路概念 從第二集訂便當服務的發展過程當中,我們可以很清楚地知道一件事情。 > 想要規模化,就要標準化 在網路世界也是如此,為什麼要有 Protocol?為什麼要有這些規範?因為網路的封包都是由電腦來解讀的,它跟人腦最大的差別在於它是死的。例如說「一個便當」、「乙個便當」、「one 個 bento」,對人類來說很輕易能夠看得懂這三個是在指涉同一個東西,但是對電腦來說,只是三個不同的「字串」,是三個不同的詞,它沒辦法知道這三個其實是一樣的。所以必須制定一套標準,例如說「便當 1」這樣的格式,讓輸入全都符合這一套格式,電腦就只要去解析這一個單一格式就好。 開頭有提到說這個訂便當的服務是建立在《紙條保證傳得到通訊協定》之上,其實除了訂便當以外,還能發展出更多的服務,例如說訂飲料之類的,這些說穿了其實都是「如何應用傳紙條」來建立更多服務。 而這一段故事裡所提到的「訂便當服務」,對應到網路中其實就是我們最常看到的 HTTP([Hypertext Transfer Protocol](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol)): ![Image for post](https://miro.medium.com/max/2398/1*JeiVo68Vy9mtTNjrqPBdbw.png) 網路與傳紙條的分層 這邊會是我們傳紙條模型的最上層,因為確認如何傳送資料以後,就可以發展出更多實際應用。例如說「用紙條談情說愛」是一種傳紙條的應用,「用紙條訂便當」也是,你想拿來做什麼就可以做什麼。 在前面的故事中,我們可以得出底下的傳紙條守則: 1. 標準化內容格式 2. 分為 header 跟 body 3. 用狀態碼標準化結果 4. 用動詞標準化動作 而這四個其實就是 HTTP 通訊協定的內容。 ### TCP/IP 四層模型: ![Image for post](https://miro.medium.com/max/2433/1*BFde4y9sPtLllTZ6OjoKEg.png) > 在「如何傳送資料」這一層裡面,有可以保障收發正常的 TCP,也有不能保障但是效能較好的 UDP,而上層的實際應用可以選擇任何一種。 > > 這邊的圖可能有點小誤導所以要特別說明,圖片並不是說 FTP 建立在 UDP 之上,只是想表達應用這一層有 HTTP 「與」 FTP,傳輸這層有 TCP「與」UDP,而 HTTP 與 FTP 事實上都選擇了以 TCP 作為傳輸方式。 這個模型會把網路分成四層,每一層都關注不同的面向,例如說傳輸層指的就是「你要以什麼方式來傳送資料?」,而應用層是最貼近我們的一層,就是實際應用。這四層關注的對象也可以透過傳紙條的例子來看,會清楚很多。 對我來說,與其去思考「為什麼會有 HTTP?」、「為什麼要這樣分層?」,不如先從傳紙條的例子開始慢慢去想,去想說當服務變大的時候該怎麼辦,當格式不統一的時候該做些什麼,這時候就會發現這些問題的解答,就是 Protocol 出現的原因。 #### 第三集所對應到的網路概念 這一集裡面我們多了許多不同的服務,也產生了對應的服務代碼,這些對應到網路世界裡就是 Port(連線埠,中國翻叫端口)的概念,一台主機上面可以跑很多不同的服務,但你要怎麼區別呢?就是利用 Port(服務代碼)。 就像千千班上一樣,有訂便當、訂飲料還有借籃球,要把紙條傳到「八班:3000」才是訂飲料這個服務。網路也是如此,一台主機上有很多服務,你一定要傳到「Server IP:80」才是 HTTP 伺服器這個服務。 每一種服務都有預設的 Port,例如說 HTTP 是 80,FTP([File Transfer Protocol](https://de.wikipedia.org/wiki/File_Transfer_Protocol))是 21,所以你會發現在使用瀏覽器的時候沒有輸入 Port,因為預設就是 80,所以不用特別填寫。 這可以對應到我們之前的圖表,在最上面一層「實際應用」,可以有不同的應用,例如說訂便當跟訂飲料。網路世界的話則是 HTTP 跟 FTP 這兩個不同的通訊協定。 在傳輸資料的時候有很多種協定可以選擇, TCP 是一種,就是我們故事中的《紙條保證傳得到通訊協定》,還有另外一種叫做 UDP(User Datagram Protocol),就是上面提到的「漏掉訊息沒差,重要的是傳輸即時性」的通訊協定。 --- #### Http status code 狀態碼 用數字表示 reponse 的狀態,通常以開頭的數字做判斷 **1xx :稍等** - 100 Continue:Server 成功接收、但 Client 還要進行一些處理。 **2xx:成功** - 200 OK:成功 - 204 No Content:成功但沒有回傳的內容(當你發出 Delete 的 request) **3xx:重新導向,用戶端瀏覽器必須採取更多動作才能完成要求。** - 301 Moved Permanently:資源「永久」移到其他位置,再下一次發出 request 時,瀏覽器直接到新位置。 - 302 Found(Moved Temporarily):資源「暫時」移到其他位置。 - 304 Not Modified:東西跟之前長一樣,可以從快取拿就好。 **4xx:Client 端錯誤** - 400 Bad Request:請求語法錯誤、或資源太大…等等。 - 401 Unauthorized:未認證,可能需要登入或 Token。 - 403 Forbidden:沒有權限。 - 404 Not Found:找不到資源。 **5xx:Service 端錯誤** - 500 Internal Server Error:伺服器出錯,搶票時很可能發生。 - 501 Not Implemented - 502 Bad Gateway:通常是伺服器的某個服務沒有正確執行。