標籤:

為什麼新開發的可靠傳輸協議都是基於UDP協議?

今天,在這裡介紹一下為什麼很多新的可靠傳輸協議(比如QUIC、KCP、Fasp、UDT)都是基於UDP協議的,它的技術原因在哪裡?

下面這個圖,是大學裡面計算機網路必教的內容,OSI的7層模型和TCP/IP協議棧的5層模型。其中傳輸層的主要代表協議為TCP協議和UDP協議。

新開發的一些傳輸協議,比如google的QUIC、aspera的FASP、開源的UDT,為什麼都是基於UDP,而不是基於IP協議呢?甚至於IETF在2000年新制定的SCTP協議標準,標準本身是基於IP協議的,當放到實際互聯網來運行時,標準特意增加一個UDP的隧道封包協議,見IETF RFC UDP Encapsulation of SCTP Packets for End-Host to End-Host Communication。

有人說,因為UDP發包快,這些協議為了跑快一點,所以用UDP協議。有人說,UDP可以廣播,所以用UDP協議。

眾說紛紜,到底為什麼這些協議到了我們現實使用的Internet上時,都是使用UDP協議。揭曉答案,因為現實Internet環境中,有大量的NAT網路設備,為了適應兼容這些已經在網路中到處運行NAT網路設備,新的協議必須使用UDP協議來作為承載層。

首先介紹NAT,NAT是Network Address Translation的縮寫,翻譯成中文是「網路地址轉換」或者「網路地址翻譯」

維基中文:https://zh.wikipedia.org/wiki/%E7%BD%91%E7%BB%9C%E5%9C%B0%E5%9D%80%E8%BD%AC%E6%8D%A2

維基英文:en.wikipedia.org/wiki/N

1990年代中期,NAT是作為一種解決IPv4地址短缺以避免保留IP地址困難的方案而流行起來的。網路地址轉換在很多國家有廣泛的使用。所以NAT就成了家庭和小型辦公室網路連接上的路由器的一個標準特徵,因為對他們來說,申請獨立的IP地址的代價要高於所帶來的效益。

在一個典型的配置中,一個本地網路使用一個專有網路的指定子網(比如192.168.x.x或10.x.x.x)和連在這個網路上的一個路由器。這個路由器佔有這個網路地址空間的一個專有地址(比如192.168.0.1),同時它還通過一個或多個網際網路服務提供商提供的公有的IP地址(叫做「過載」NAT)連接到網際網路上。當信息由本地網路向網際網路傳遞時,源地址從專有地址轉換為公用地址。由路由器跟蹤每個連接上的基本數據,主要是目的地址和埠。當有回復返迴路由器時,它通過輸出階段記錄的連接跟蹤數據來決定該轉發給內部網的哪個主機;如果有多個公用地址可用,當數據包返回時,TCP或UDP客戶機的埠號可以用來分解數據包。對於網際網路上的通信,路由器本身充源和目的。

流行在網路上的一種看法認為,IPv6的廣泛採用將使得NAT不再需要,因為NAT只是一個處理IPv4的地址空間不足的方法。

大家都見過和用過NAT盒子,每個人家裡的上網撥號路由器就是一個典型的NAT網路設備,這個設備除了用來上網以外,完成了你的內網電腦的IP地址(比如192.168.0.x)轉換為一個IPv4公網地址。

那這個NAT設備與傳輸協議有什麼關係呢?我們來看一下IP報文的頭部,

其中的8位協議欄位,是用來表示IP報文承載的上層傳輸協議類型,當IP報文裡面的內容是TCP報文時,這個值為6,當IP報文裡面的內容是UDP報文時,這個值為17,當IP報文裡面的內容是SCTP報文時,這個值為132。這個8bit的欄位,用滿的話理論上可以支持255種協議。

前面說了,NAT網路設備是用來完成網路地址轉換工作的,因此NAT設備必須要能夠認識並理解對應的協議,不幸的是,大部分普通NAT設備只認識TCP和UDP這兩種傳輸協議,就連IETF RFC標準規定好的SCTP傳輸協議,普通的NAT設備都不認識。不認識就意味著,當你使用SCTP協議從一個內網向公網發送報文時,你的SCTP報文會被你的NAT網路設備丟棄,連接無法建立,通信無法進行。

但是聰明的計算機從業者很快發現,UDP和IP層並無本質區別,都是提供包發送服務,既然在IP層上面去定義自己的新協議有NAT網路設備的兼容問題,那我在UDP報文之上去做就好了,所有的NAT網路設備都必然支持UDP協議的地址轉換。

因此,所有的新的可靠傳輸協議,都是基於UDP報文進一步封裝後進行開發的。

附件提供google QUIC的協議設計論文,原版出自static.googleusercontent.com,考慮到很多同學訪問外比較慢,這裡附上一份。


推薦閱讀:

為什麼 ssh root@163.com 或者 ssh root@zhihu.com 都沒有反應?
epoll非阻塞伺服器,在20k並發測試結束產生大量establish狀態假連接,可能原因?
TCP連接中a連b和b連a是一碼事嗎?
基於UDP實現的可靠傳輸協議(比如uTP),與TCP協議相比有什麼優缺點?
一個TCP連接能傳輸的最大數據量是不是2的32次方,就是4GB?

TAG:網路協議 | TCP |