在開始進行流媒體通訊協議前,咱們要先來學習什麼是通訊協議,這個東西沒有學習好,雖然你還是可以幹出一個直播服務器,但就只是做出來,但是當你碰到問題時,或是想要追求更高的效能時,一定卡關。
通訊協議的基本常識
接下來本篇文章會分成以下的章節,為了來理解上面的主題:
我相信很多人都已經有使用過很多 http、tcp、udp 這些東東,但是我相信還是有人應該只是懂的在瀏覽器打個 http 網址而以,然後說這就是通訊協議,某些方面不能說錯,但是我相信你這樣說給一個初學者聽一定很難理解的。接下來咱們來理一理到底什麼是通訊協議。
先來理理什麼是協議
呢 ? 簡單的用白話文就是:
協議就是 A 與 B 雙方要完成某件事情,所約定好的處理流程。
咱們來舉個例子,假設有位仁兄,雙方住在一間屋子裡面,然後他們只有一把鑰匙,所以這時他們就在思考,一個人已經在房子裡面了,然後另一個回來以後就要敲門,然後在家的人就打開來。
但這時要如何確保敲門的人是室友呢 (先假設看不到外面) ? 如果是壞人敲門你直接開門,那你就準備呵呵呵了,所以 A 與 B 就約定好了一個確認室友協議
,這個協議如下:
協議想完成事項:確認對方是不是室友
協議標準:
假設 B 在家,A 在外面。
A 敲 3 下門。
B 聽到後,要求 A 說暗語 (你今天真帥)
A 說暗語(你今天真帥)
B 收到後,就開門。
先不管上面的協議是否真的實用,只要知道它就是個協議就好囉。
最後所謂的通訊協議就是:
所謂的『 通訊協議 』就是網路上 A 與 B 雙方要進行溝通所約定好流程。
TCP/IP 它是一組協議組,它主要想完成的事情為:
在網路上可以進行端點對端點的溝通
但因為要完成這件事情要完成的工作太多囉,所以將之拆分成幾個層,不同層級專注於解決某項事件,就像咱們在開發專案一些,有時會將他拆分 service 層、model 層與 view 層,每一層都專門處理某件事情。
TCP/IP 總共分成了四個層級,如下圖,每個層級都有各別的協議,來幫助完成某件事情。
接下來咱們來理一理每一層級要做的事情。
假設你想要將資料傳輸到對方電腦中,你要做的第一件事情是啥 ?
答案是要將電腦的方式連結起來啊 (光纖或電纜或電磁波),都沒連起來要如何傳輸 ? 通靈嗎 ?
接下來這層級事實上還有做另外一件事情,上面咱們已經將電腦連結在一起以後,這樣基本上可以傳送 0 與 1 的資訊,但是問題這是沒意義的,誰知道你傳這一組 0 與 1 是想表達什麼意思。
在這層有個叫Ethernet
的協議,它規定了一個幀 (Frame)
的概念(不是封包喔)。幀基本上的組成如下:
幀 = 表頭 (Head) + 數據 (Data)
表頭基本上就是放某個層級所必須的相關資訊,而數據就是你所要傳輸的東西。
它有以下幾個限制:
在這個層級,它的表頭基本上會放二種資訊:
BTW 順到一提 MAC 就是每台電腦獨一獨二的位置。
這裡簡單的說使用 ARP 協議(它是網路層的東西)可以取得同一子網路
的 MAC 地址,那不同的子網路呢? 那就只能丟到 gateway 在來處理囉。
答案是使用廣播
,就是往這個世界(子網路)的每個人都敲敲門,然後問他這個信上面的地址(MAC)是不是你家的,嗯真的是這樣。
定義如何使用物理方式將電腦與電腦連結起來。
定義最基本如何讓某台電腦收到我傳的資料 (MAC 地址與廣播)。
在第一層時咱們有提到每一台電腦都有一個獨立 MAC 地址,然後想要找到對方就是使用廣播來找到對方,但是如果每一次發送,都是給世界上每一台電腦那保證一定會天下大亂的,因此才會出現所謂的子網路,只有在子網路內的才會使用擴播。
但這有個問題,咱們 MAC 地址長的如下,共用 48 個位元來與十六進位來表示,前 24 個為廠商編碼,後 24 個為廠商的網卡流水號。
a4-5e-60-d0-bb-ff
那這裡有個問題想問一下 ~
答案是不可能,因為它就只有上面說的那些資訊,因此這個層級就誕生囉。
它提出一個新的地址架構,就是咱們常使用的 IP。
124.108.131.31
IP 協議的細節我就懶的說,你只要知道它有以下二個功能就行:
在這個層級,它的表頭基本上會放二種資訊:
以上兩個資訊主要是為了讓送貨員知道,要送到那個子網路去。
定義 IP 地址架構,並且讓送貨員知道要送到那個子網路世界去。
第二層咱們已經可以成功的找到目標電腦囉,也可以將資料丟到目標電腦上,但這裡有一個問題要問問。
為了解決這個問題,所以產生了Port
的概念,也就是每一個需要用到網路的應用程式都給他個 Port ,只要知道要發到對方電腦上的那個 Port,那就知道會丟到那個應用程式。
Port 基本是由 16 個二進位組成,總共提供 0 ~ 65535 個編碼使用,其中前 0 ~ 1023 已經被系統占用囉。
到裡這一層基本上咱們就能實現應用程式與應用程式的資料交換囉,因為你已經知道確切要傳輸的位置囉。
在這個層級,它的表頭基本上會放二種資訊:
要讓送貨員知道,要送去那個應用程式。
下篇文章會詳細說明。
建立應用程式與應用程式的傳輸方式。
所以基本上這一層所新增的最基本的表頭就是 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 的實際流程,由於上面有提到在第三層時事實上就可以發送數據到指定的應用程式囉,所以咱們就直接來看看如果直接從第三層發送數據會是如何處理。
下圖來源為一篇文章带你熟悉 TCP/IP 协议(网络协议篇二) ,這篇文章是我看過寫的超完整又優質的好文,而且下面這張圖畫的超容易理解,然後我有點懶的在畫一張,我就借來簡單的解說一下,詳細可以去文章中看。
圖片來源: 一篇文章带你熟悉 TCP/IP 协议(网络协议篇二)
本篇文章中,咱們學習了以下的重點:
它就是網路上 A 與 B 雙方要進行溝通所約定好流程。
它總共有四層,每一層所要完成的事情如下:
請看上面。
請問 port
是不是從 0 ~ 65535
?
嗯對沒錯是 0 ~ 65535 ~ 不好意思打太快了 ~ 我改改……
嗯對沒錯是 0 ~ 65535 ~ 不好意思打太快了 ~ 我改改……
您好,關於這一段
“
那另外一個問題,就算知道 MAC 地址後,我要如何將資料丟給它呢?
答案是使用廣播,就是往這個世界(子網路)的每個人都敲敲門,然後問他這個信上面的地址(MAC)是不是你家的,嗯真的是這樣。
”
廣播的部分只會做一次,除非一直沒有收到ARP Reply,可以參考ARP協定