tcp为什么比udp慢_TCP和UDP那些事儿
文章開始之前我們先拋出幾個問題:
大家都說TCP比UDP可靠,是這樣嗎?如果真是這樣,那么TCP的可靠性體現在哪兒或者說TCP的可靠性通過什么手段來保證?
UDP不如TCP可靠,那么為什么數據的傳輸不全采用TCP的方式,非要給UDP“分一杯羹”呢?
UDP
什么是UDP
UDP是一個簡單的傳輸層控制協議,它是無連接的數據報協議。UDP不保證會到達最終目的地,同時它也不保證各個數據報的先后順序跨網絡后保持不變,不保證相同的數據報只到達一次,由此我們可以看出UDP的不可靠性。比起TCP協議的流式特性,每個UDP的數據報都有一個長度,當對端收到數據報,該長度也將傳遞給對端的應用進程。
每個UDP的首部前面會額外的增加一個偽首部,用作傳輸層數據報的差錯校驗。下面我們來剖析一下UDP,看一下它的首部構造:
應用
? ? ? ??DNS域名解析。UDP是一個不可靠的協議,為什么域名解析這么重要的工作不交給TCP來完成而是UDP呢?我們知道TCP在真正開啟數據請求之前要先建立連接,也就是我們常說的三次握手。當然可靠性的建立必然以犧牲其他利益為代價,對于TCP而言,這代價便是時間,UDP在時間的觀念上便更勝一籌,當然完成域名解析一個數據報也足矣,所以使用UDP何樂而不為呢?所以有很多對可靠性沒有嚴格要求而對時效性有極致追求的應用程序,傳輸層就用UDP來實現。
TCP
什么是TCP
TCP是一種面向連接的、可靠的、字節流協議。基于TCP的流式特性,所以這就要求用戶自己來規劃協議,劃定消息邊界。目前常見的方式有三種:
1.在每個要發的數據報之前附加一個數據長度,對端通過阻塞的方式進行讀或寫操作,直至數據結束。
2.設定一個特殊的結束標志,比如HTTP的結束標志"\r\n"。
3.每次發一個固定長度的數據報,對端也每次接收相等長度的數據內容。
同樣的我們也來剖析一下TCP,看一下它的首部:
可靠性的保證
三次握手機制建立連接:首先客戶端會先向服務器發送一個數據請求,也就是SYN分節,該數據包含了數據的初始序列號、接收窗口,擁塞窗口、接收緩存的大小以及相應網卡所支持的最大數據大小等信息,同樣的服務器會針對客戶端的請求做一個相應的回應。接著客戶端會根據服務器的回應也相應的回復一個ack消息,至此連接成功建立。如圖中描述:
流量控制:說流量控制之前我們先講一講信道利用率,我們先來看一張圖片:
其中Td是數據報發送時間,Ta指數據報接收時間,RTT指數據報往返時間。
現在從客戶端B到客戶端A數據包經歷的總時間T = Ta + Td + RTT;其中信道利用率可看似 = Td / T,圖中我們可以看出大量的時間用來等數據包,這樣是不劃算的。有什么比較經濟的做法呢?沒錯,我們可以通過不間斷的發送數據報來進一步提高信道利用率,這就是所謂的滑動窗口技術。
我們來看一張接收窗口的結構圖。
為了便于敘述,我們先將發送方規定為A,接收方為B。
和B一樣,相應的A存在一個接收窗口大小,A的發送窗口大小由A的擁塞窗口大小和B的接收窗口大小共同決定(二者取其較小值),要說明的是發送窗口的大小受不同的網絡環境和接收方的接收緩存大小的影響,也就是說TCP可以根據實際的網絡情況通過動態調整各類窗口的大小來實現對流量的控制。
擁塞避免:擁塞的條件,對資源的需求總和 > 可用資源,相比于流量控制,擁塞現象是多臺客戶機不斷發數據報導致路由器承受太多的負荷甚至死機而造成的網絡擁堵。我們來看一張圖:
我們可以看到沒有擁塞控制的網絡環境是非常危險的,甚至會導致網絡環境徹底癱瘓。那么TCP是怎樣避免這種現象呢?早些年TCP采用慢開始算法來規避這問題,現在更多的是采用快重傳、快恢復的方法。至于這兩種算法的具體介紹有興趣的小伙伴可以自己學習,在此就不再贅述。
本文作者:小組17級成員---陳新
總結
以上是生活随笔為你收集整理的tcp为什么比udp慢_TCP和UDP那些事儿的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 内置模块 增加_模块的内置
- 下一篇: url访问后台数据报404_网络优化40