iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 11
3

黑色好看版 - 傳送門


https://ithelp.ithome.com.tw/upload/images/20181026/20089358qML3yaV0Jm.png

正文開始

上一文章中咱們理解了每一層通訊協議大約是在做什麼事情以後,咱們這篇文章中將專門來說明,在傳輸層的兩個協議TCPUDP

為什麼會選這兩個出來說呢 ? 因為在即時影音傳輸的世界中,這兩個協議常常拿出來進行比較(雖然大部份還是 TCP),而且這兩個是所有資料傳輸的基本,不論是要傳輸文字、檔案、語音都一定會透過這兩個來傳送資料,所以這兩個很重要。

這篇文章的主是題就是:

什麼是 TCP 和 UDP 呢? 這協議到底用來做啥的 ?

接下來會就簡單的分成兩個章節:

  • UDP (User Datagram Protocol)
  • TCP (Transmission Control Protocol)

UDP (User Datagram Protocol)


首先我們已經知道協議是用做完成某事件的過程,那 UDP 是想用來做什麼呢 ?

咱們已經知道傳輸層主要是處理應用程式與應用程式如何進行傳輸,而要送到某個應用程式最基本所需要的東西就是 Port。

UDP 就是符合咱們最低需求的東西。

UDP 就是用來傳輸資料到某台電腦中的應用程式 (有沒有收到不用管)

它的封包長的如下。

UDP 封包 = 表頭 + 資料

其中表頭欄位如下,事實上也就只是加上 Port 而以,其中 length 只是用來說明它是資料有多大。

Source Port: 55084
Destination Port: 443
Length: 31 (byte)

UDP 注意事項

  1. UDP 的特點就是射後不理,他不會管對方有沒有收到的 (不可靠傳輸)。
  2. 它有可能會發生到達順序不一致問題。
Ex.

發送方發送:
T1 時間 => UDP A
T2 時間 => UDP B
T3 時間 => UDP C

接受方收到:
T4 時間 => UDP C
T5 時間 => UDP B
T6 時間 => UDP A

TCP (Transmission Control Protocol)


UDP 協議已經可以完成傳輸層最低的需求,那還需要 TCP 做什麼呢 ? 上面有說到 UDP 是不可靠傳輸,因此呢 TCP 誕生的目的就是為了可靠的傳輸,也就是說它是負責任的好人。

TCP 是為了達到可靠性傳輸而誕生出來的。

接下來我們來看一下它的執行過程,基本上分三個部份連線傳輸斷線,全部理解完基本上你就可以理解為什麼它是可靠性傳輸。

TCP 建立連線 (三次握手)

  • A 傳送建立連線訊息給 B,裡面有個包個數字 seq (x)。
  • B 收到後,將這個 x 記錄下來,然後回發個訊息,它包含另一個 seq(y) 與 ack(x+1), x + 1 的目的是因為這樣才能證明是 B 收到 A 的信以後,才回復的)
  • A 收到後,也回應個 ack(y+1) 與 seq(z) ( 同理這樣才能證明 A 是收到 B 寫的 )

https://ithelp.ithome.com.tw/upload/images/20181026/2008935828kHLNtXuX.png

注意,在建立連線時,雙方第一次傳送的 seq 被稱為初始序列號,這在傳送資料時會用到。

TCP 傳送資料

建立完連線以後,就可以開始傳送資料,最基本的型式如下圖。它就是丟一個資料過去,然後回一個 ack。

  • A 發送 seq 為 x 的 1024 byte 的資料給 B
  • B 收到後回個 ack 為 x + 1024 byte 的訊息給 A

這裡就提供了最基本的可靠性,如果一個傳送資料的請求,在一定的時間內沒有回應 ack,則就進行重發。

https://ithelp.ithome.com.tw/upload/images/20181026/20089358jMMPnt5Vc0.png

但是這樣不能說很有效率,所以有另一種型式,基本上就是 A 發送多個請求,然後在回傳一個 ack,然後使用 ack 回傳的編號,就可以知道 B 已經成功了收到多少的資料。

  • A 發送 seq 為 x 的 1024 byte 大小的資料給 B
  • A 再發送 seq 為 x 的 2024 byte 大小的資料給 B
  • B 在回應 ack 中會回傳它收到了 2048 + x (初始序列號)

https://ithelp.ithome.com.tw/upload/images/20181026/200893586ryr4S0FEH.png

TCP 斷線 (四次揮手)

最後斷線的過程如下:

  • A 發送一個斷線訊息給 B
  • B 收到後回發一個 ok 訊息給 A
  • 接下來 B 在發送一個斷線訊息給 A
  • A 收到後再回發一個 ok 訊息給 B ( 這時 B 就正式斷線 )
  • A 大約在 4 分鐘過後才正式斷線 ( 這時 A 就正式斷線,資源才會釋放 )

寫到這裡時事實上我有個疑惑,那就是為什麼 B 要在主動發個斷線訊息給 A 呢 ? 後來調了一下發現,A 發送給 B 斷線時,事實上只是和 B 說 A 不在發送訊息了,但 A 還是可以收訊息,所以 B 也要在發個訊息說不在送訊息了,這時雙方都說不在送訊息後,才正式算斷線。

https://ithelp.ithome.com.tw/upload/images/20181026/20089358QdssDQJC9f.png

結論


本篇文章咱們學習到了兩個傳輸層的協議 TCP 與 UDP。

UDP

它是為了要符合傳輸層最低需求,可以傳送到某個應用程式上的協議,因此它不包證可靠性,但是雖然說不可靠,但是某些高大尚的企業為了追求效能,會使用 UDP 來進行傳輸,然後自已實作一定等級的可靠性機制。

TCP

TCP 是為了達到可靠性傳輸而誕生出來的,但是相對的它比較耗資源,在傳輸資料時都需要先透過三次握手來建立連線,然後才能開始傳輸。

參考資料



上一篇
30-10之通訊協議的基本常識
下一篇
30-12之 RTP/RTCP 傳輸協議
系列文
30天之即時網路影音開發攻略(小白本)30

1 則留言

0
grtert
iT邦新手 5 級 ‧ 2020-02-09 01:01:33

清楚易懂,謝謝分享!

我要留言

立即登入留言