iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 10
3
Software Development

30天之即時網路影音開發攻略(小白本)系列 第 10

30-10之通訊協議的基本常識

黑色好看版 - 傳送門


https://ithelp.ithome.com.tw/upload/images/20181025/20089358VJAH3J4u4V.png

正文開始

在開始進行流媒體通訊協議前,咱們要先來學習什麼是通訊協議,這個東西沒有學習好,雖然你還是可以幹出一個直播服務器,但就只是做出來,但是當你碰到問題時,或是想要追求更高的效能時,一定卡關。

通訊協議的基本常識

接下來本篇文章會分成以下的章節,為了來理解上面的主題:

  • 什麼是通訊協議呢 ?
  • TCP/IP 通訊協議架構。
  • 從 A 到 B 發送數據的流程。

什麼是通訊協議呢 ?


我相信很多人都已經有使用過很多 http、tcp、udp 這些東東,但是我相信還是有人應該只是懂的在瀏覽器打個 http 網址而以,然後說這就是通訊協議,某些方面不能說錯,但是我相信你這樣說給一個初學者聽一定很難理解的。接下來咱們來理一理到底什麼是通訊協議。

先來理理什麼是協議呢 ? 簡單的用白話文就是:

協議就是 A 與 B 雙方要完成某件事情,所約定好的處理流程。

咱們來舉個例子,假設有位仁兄,雙方住在一間屋子裡面,然後他們只有一把鑰匙,所以這時他們就在思考,一個人已經在房子裡面了,然後另一個回來以後就要敲門,然後在家的人就打開來。

但這時要如何確保敲門的人是室友呢 (先假設看不到外面) ? 如果是壞人敲門你直接開門,那你就準備呵呵呵了,所以 A 與 B 就約定好了一個確認室友協議,這個協議如下:

協議想完成事項:確認對方是不是室友

協議標準:
假設 B 在家,A 在外面。

A 敲 3 下門。
B 聽到後,要求 A 說暗語 (你今天真帥)
A 說暗語(你今天真帥)
B 收到後,就開門。

先不管上面的協議是否真的實用,只要知道它就是個協議就好囉。

最後所謂的通訊協議就是:

所謂的『 通訊協議 』就是網路上 A 與 B 雙方要進行溝通所約定好流程。

TCP/IP 通訊協議組


TCP/IP 它是一組協議組,它主要想完成的事情為:

在網路上可以進行端點對端點的溝通

但因為要完成這件事情要完成的工作太多囉,所以將之拆分成幾個層,不同層級專注於解決某項事件,就像咱們在開發專案一些,有時會將他拆分 service 層、model 層與 view 層,每一層都專門處理某件事情。

TCP/IP 總共分成了四個層級,如下圖,每個層級都有各別的協議,來幫助完成某件事情。

https://ithelp.ithome.com.tw/upload/images/20181025/20089358yT7om2CWSM.png

接下來咱們來理一理每一層級要做的事情。

第一層 - 網路介面層 (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 的實際流程,由於上面有提到在第三層時事實上就可以發送數據到指定的應用程式囉,所以咱們就直接來看看如果直接從第三層發送數據會是如何處理。

下圖來源為一篇文章带你熟悉 TCP/IP 协议(网络协议篇二) ,這篇文章是我看過寫的超完整又優質的好文,而且下面這張圖畫的超容易理解,然後我有點懶的在畫一張,我就借來簡單的解說一下,詳細可以去文章中看。

  1. A 用戶發送了 “Im Deeson” 數據。
  2. A 在傳輸層時加入 TCP 表頭 (為了知道傳送到那一個電腦中那個應用)
  3. A 在網站層時加入 IP 表頭 (為了要知道傳送到那一個子網站,外加知道上一層是 TCP),然後同時間會使用 ARP 協定,來取得這個 IP 所對應的 MAC 地址,然後帶入下一層。
  4. A 在網路介面層(數據連結層)加入 Ethernet 表頭 (為了要知道傳送到那一台電腦,外加知道是用 IPv4 or 6)
  5. B 在網路介面層收到,查看 Ethernet 表頭的 MAC 地址是不是我家的。
  6. B 在網路層解析 IP 包,也在看看 IP 是不是我家的,並且看看上一層要用 TCP 還是 UDP 解析。
  7. B 在傳輸層解析 TCP 包,然後看到 Port 為那個應用程式的,就丟給他。

https://ithelp.ithome.com.tw/upload/images/20181025/20089358mNPaXGgMXY.png
圖片來源: 一篇文章带你熟悉 TCP/IP 协议(网络协议篇二)

結論


本篇文章中,咱們學習了以下的重點:

什麼是通訊協議呢 ?

它就是網路上 A 與 B 雙方要進行溝通所約定好流程。

TCP/IP 通訊協議架構

它總共有四層,每一層所要完成的事情如下:

  • 網路介面層:建立實體的連線,讓電腦與電腦間可以連在一起,並且給它個 MAC 來當門牌。
  • 網路層:定義 IP 協定,當要找門牌時,可以先以 IP 知道它是那一國家的。
  • 傳輸層:定義要傳輸到電腦的那一個應用程式。
  • 應用層:定義好每個應用的標準。

從 A 到 B 發送數據的流程

請看上面。

參考資料



上一篇
30-09之別人要如何聽到我的聲音呢 ?
下一篇
30-11之 TCP 與 UDP 協議
系列文
30天之即時網路影音開發攻略(小白本)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
pjchender
iT邦新手 3 級 ‧ 2019-06-25 16:53:03

請問 port 是不是從 0 ~ 65535

馬克 iT邦研究生 4 級 ‧ 2019-06-25 18:10:34 檢舉

嗯對沒錯是 0 ~ 65535 ~ 不好意思打太快了 ~ 我改改……

馬克 iT邦研究生 4 級 ‧ 2019-06-25 18:10:34 檢舉

嗯對沒錯是 0 ~ 65535 ~ 不好意思打太快了 ~ 我改改……

0
magus
iT邦新手 5 級 ‧ 2021-07-28 12:03:17

您好,關於這一段

那另外一個問題,就算知道 MAC 地址後,我要如何將資料丟給它呢?
答案是使用廣播,就是往這個世界(子網路)的每個人都敲敲門,然後問他這個信上面的地址(MAC)是不是你家的,嗯真的是這樣。

廣播的部分只會做一次,除非一直沒有收到ARP Reply,可以參考ARP協定

https://www.pcnet.idv.tw/pcnet/network/network_ip_arp.htm

我要留言

立即登入留言