前面兩天從 TCP 在做什麼開始聊起,今天來看看另外一個也很重要的協定 UDP。
UDP 為 User Datagram Protocol 的縮寫,中文翻譯成使用者資料報協定。和 TCP 同屬傳輸層,做的事情其實也是類似的,但 UDP 不保證「可靠性」,那麼你可能會有疑問了,既生瑜何生亮,有了 TCP 為何還要 UDP 呢?
我們先從兩者的差異聊起。
UDP 和 TCP 兩者都有的,就是 Port 連接埠的概念,我們在上一篇TCP 有多可靠中所提到過「兩個設備間的連線可能不只一個,就會需要編號來分開不同的連線」,就是 UDP 和 TCP 共用的概念。
*UDP Connection
但除此之外,UDP 就像是閹割版的 TCP,其它功能幾乎都沒有。
你說 UDP 也有 TCP Checksum 一樣的 Checksum 呀?同樣也可以檢查是否有可能的資料損壞吧?
這樣說沒錯,但是大部分使用 UDP 這個協定來傳輸資料的,對於資料的正確性通常不會那麼在乎,有的應用會利用 Checksum 的特性意思意思檢查一下損壞,但也有不少應用乾脆就「忽略」這塊,在 UDP 官方定義中,是可選擇忽略的(但建立在 IPv6 上的 UDP 還是必選題)。
其餘的壅塞、流量控制啦,UDP 就通通都不管了,它就是打算以最直接的方式把資料送過去,至於對方有沒有收到就沒它的事了,真是個任性的協定。
那麼,這樣犧牲可靠性的 UDP 求的是什麼呢?當然就是即時性了。
大部分建立在 UDP 上的應用都分秒必爭。例如串流影音,每秒 30 個影格的影片,掉了幾格一般人根本看不太出來,若是想每格都呈現出來而改用 TCP 的話,造成的後果可能是影片的 lag,為了等沒收到影格重新傳過來,導致後面的影格無法順暢的播出,絕對不會是觀影者希望的事。更何況是一些直播影片了,隔壁都在歡呼了只有你的螢幕畫面還在轉阿轉。
除了串流影音之外,前面文章常見網路問題:DNS 提到應用層的 DNS,也是基於 UDP 的一種協定,但比較特殊的是現在 DNS 的實做幾乎都同時使用 UDP 和 TCP,剛開始預設用 UDP 快速從網域名稱獲取 IP 位置,但發現不夠穩定時,就切成 TCP 傳輸資料。
TCP 和 UDP 的作用,都是基於 IP 上的兩個 IP 位置之間交換資料,由於 Port 連接埠的概念提出,不同的服務就可以用不同的 Port 來建立連線,如 DNS 用 Port 53、HTTP 用 Port 80 等等,兩個 IP 位置間可以根據 Port 來建立多個連線。
而應用程式採用兩個協定中的哪個,就要看應用的類型了,如果追求可靠性,不希望掉封包的話當然就選擇 TCP;追求即時性的話就犧牲一點可靠性採取 UDP。但凡事也沒有絕對,像是 DNS 一樣,也可以在不同情境下選擇使用 TCP 或 UDP。
傳輸層就淺談到此囉,接著我們聊聊應用層的一些常用協定。