我有一次發了一個貼,介紹鐳速傳輸協定是基于UDP的可靠傳輸協定,很多人在跟帖裡面質疑我說,“UDP是不可靠的,你在這裡胡說八道”。
今天,在這裡介紹一下為什麼很多新的傳輸協定都是基于UDP協定的,它的技術原因在哪裡?下面這個圖,是大學裡面計算機網絡必教的内容,OSI的7層模型和TCP/IP協定棧的5層模型。其中傳輸層的主要代表協定為TCP協定和UDP協定。
新開發的一些傳輸協定,比如google的QUIC、aspera的FASP、開源的UDT,為什麼都是基于UDP的呢?甚至于IETF在2000年新制定的SCTP協定标準,放到網際網路來運作時,都特意增加一個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 維基英文: https://en.wikipedia.org/wiki/Network_address_translation1990年代中期,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的協定設計論文,原版出自
https://static.googleusercontent.com/media/research.google.com/zh-CN//pubs/archive/46403.pdf,考慮到很多同學通路外比較慢,這裡附上一份。
#quic.pdf#