TCP 為什麼沒有基於 UDP 實現?
TCP 協議基於 IP 實現,對 IP 的要求主要在於包傳遞和地址路由;在 IP 之上 TCP 自己實現了埠、重傳、順序保證、滑動窗口、流量控制等高級功能。
UDP 同樣基於 IP 實現,對 IP 的要求也是包傳遞和地址路由;同時自己實現了埠和很少的其它功能(OOB 消息等)。
可以看到 TCP 實現的功能實際上是 UDP 的一個超集,為什麼 TCP 沒有選擇實現為一種 reliable UDP 或類似的、基於 UDP 的會話層協議,而是直接基於 IP 實現?
看上去,TCP是UDP的一個超集,而其實,不是,UDP有一些很重要的功能,是TCP實現不了的。舉兩個例子,比如授時協議,就必須通過不面向連接的UDP來實現,因為面向連接的TCP有重傳機制,因為重傳的因素會增加時間計算的誤差。另外,當我們需要使用廣播數據的時候,TCP也是沒有辦法實現的,傳輸層協議,不面向連接的UDP才能支持廣播。
TCP沒有是基於UDP進行,如@陳碩 所說,確實TCP出現得比UDP早,這應該是一個很重要的原因。
另外一個原因,是我看到@狼大人 在@TonySeek 的評論裡面的回復想到的。我們在討論網路結構層次的時候,往往有一個誤區,就是很容易把兩種不同的標準混為一談了。我們都知道,網路的分層有分五層的有分七層的,五層的分法是人們在建設互聯網的時候,工程實踐的做法,而七層的分法,是OSI的分法。
OSI對於網路的描述和實際是有脫節的,看看就行,不可全信。比如說,按照OSI的分法,HTTP是應用層協議,而HTML則應該是一種表示層協議,但是,下層的HTML數據卻是封裝在上層的HTTP數據報文裡面的。
按照RFC-1122 1.1.3的描述,傳輸層(或者叫運輸層,Transport Layer)的主要任務,是為應用程序提供端到端(end-to-end)的通信服務。在這個描述下,UDP是完全應該劃分為傳輸層協議的,一點誤差都沒有。
對於UDP,我認為這完全是把IP層的功能,原封不動的引入傳輸層,僅僅增加了埠和校驗,並沒有其他任何的功能(恕我真的不知道OOB消息是什麼)。和RFC-768中所說的一樣,僅僅為應用程序發送消息和數據,提供了一種最小化的協議機制(a minimum of protocol mechanism)。和TonySeek所的那樣,叫做UDP也很可能是因為這個原因。我不認同 TCP 是 UDP 超集的說法。雖然功能上是如此,但畢竟所處層次不同。
我覺得真正問題所在是:為什麼要存在 UDP。TCP 在傳輸層提供了可靠性,而 UDP 並沒有提供這種保證。使用 UDP 和直接使用 IP 數據報傳送數據在功能上沒有區別,那為什麼還要設計這樣一個只包層皮的協議?我認為這是為了給應用層提供一個統一的傳輸層外觀,即在我們不需要 TCP 提供有狀態連接的時候,不必跳過傳輸層直接面向網路層設計應用協議。這有點類似於我們設計軟體的時候,如果要編寫一批 Wrapper 去包裝一些對象,有時會寫一個 DummyWrapper,它和其他 Wrapper 實現一樣的介面,但什麼也不做,只是把傳入的參數再返回回去。這個 DummyWrapper 和 UDP 一樣,僅僅是一個 facade。
TCP複雜性決定的,TCP在設計之初是為了建立一條可靠穩定的信道,對速度上面沒有什麼要求。但是隨著網路吞吐量的增加,有時候網路可靠性在某些特定的場景下不如傳輸速率來得重要,於是就有了UDP
因為從協議設計的先後上說,是先有TCP後有UDP。
你可以看看這個,TCP friendly rate control。這個就是你所想的在UDP上實現的TCP。早年在學術界還是有很多人研究這個東西的。
UDP 一共就8個位元組的頭部。 除了大家都有的埠長度校驗碼,沒有什麼可以被TCP利用的。
這樣TCP為什麼還要「基於」UDP,有什麼要好處?
說UDP是TCP的超級簡化版倒還可能說得通。
另外UDP還有帶外數據?
手頭沒有相關歷史書籍資料可供查詢。
一個可能的理由是:避免依賴關係帶來的單點故障。
下層實現一旦出問題,上層應用不可避免跟著崩潰。
看到一大堆回答壓根沒有回答到點子上,實在忍不住上來回答下。
先不管樓主說的「超集」這個描述對不對,樓主實際上問的是tcp為什麼不基於udp實現。
真正的原因其實很簡單,udp為了提高可用性,在裡面加了個校驗碼。然並卵,這並不可靠。
如果tcp基於udp實現的話,會比基於ip實現要多一個校驗的過程,每包也會增加兩個位元組,而對於本身就設計成安全連接的tcp而言,這兩個位元組的校驗並沒有什麼意義,只會額外增加開銷。
這是tcp基於ip實現而不基於udp實現的根本技術原因。
另外還有一個歷史原因,tcp其實早於udp出現,改用udp重新實現的話,會導致一大波人要修改自己的代碼,這也是一個重要的原因,有的東西哪怕做得爛,只要用的人多,你就改不動了,比如ipv4,只能打打補丁。
簡單地說,udp是基於消息的,tcp是基於流的,他們之間根本就不是超集的關係。
他們處在同一層,都是運輸層協議,他們都有埠號,而且各自獨立。
他們都基於IP協議,而且TCP協議要早於UDP協議。
一直以為tcp是在udp上面寫的,因為上學做project就是這麼做的,今天受教了
多播/廣播
http is udp implemented via tcp .hahahahhahahha
UDP是面向無連接的服務,支持一對一、一對多、多對一和多對多的通信,報文首部開銷小,只有8位元組(源埠、目的埠、UDP長度和檢驗和),發送數據前不需要建立連接,不需要維持複雜的連接狀態表,減少了開銷和發送前的時延。
UDP是面向報文的,盡最大努力交付,沒有擁塞控制,網路出現擁塞不會是主機的發送速率降低,很適合多媒體(語言、視頻)等實時通信的要求,你很難接受網上聊天的時候對面聊天的人的語音和視頻有數秒的延遲,UDP就能夠保證沒有延遲但圖像或語音有失真(因為不是可靠傳輸會有丟包)。
UDP和TCP都是在IP網路層之上,如果用UDP實現TCP,報文結構不同,可以解決,但真正阻礙的原因是在UDP上實現TCP的演算法(可靠傳輸、流量控制、擁塞控制)會變得很複雜。TCP並不僅僅是一堆數據的外殼,還包括大量複雜的演算法保證TCP的各種特性,與其在UDP上實現,還不如從零開始做。
可以參考這個:
Can TCP be implemented via UDP? http://stackoverflow.com/a/10726333
推薦閱讀:
※為什麼在不同網站查詢到自己的本機公網 IP 不一樣?
※TCP連接中啟用和禁用TCP_NODELAY有什麼影響?
※網路爬蟲相關畢業設計,有什麼比較合適的書籍推薦?
※TCP/IP 和 HTTP 的區別和聯繫是什麼?
※為什麼tcp連接的傳輸速度慢,斷開重新連接後,傳輸速度就變快了呢?