tcp和udp的區別和使用場景,傳輸層的兩個協議—— TCP和UDP有各自的應用場景。
TCP為應用層協議提供可靠傳輸,發送端按順序發送,接收端按順序接收,其間如果發生丟包、亂序由TCP負責重傳和排序。下面是TCP的應用場景。
(1)客戶端程序和服務器端程序需要多次交互才能實現應用程序的功能。例如,接收電子郵件使用的是POP3,發送電子郵件使用的是SMTP,傳輸文件使用的是FTP,在傳輸層使用的是TCP。
(2)應用程序傳輸的文件需要分段傳輸,例如,使用瀏覽器訪問網頁,網頁中的圖片和HTML文件需要分段后發送給瀏覽器;又如使用QQ傳文件,在傳輸層也是選用TCP。
如果需要將發送的內容分成多個數據包發送,這就要求在傳輸層使用TCP在發送方和接收方建立連接,實現可靠傳輸、流量控制和避免擁塞。
例如,從網絡中下載一個500MB的電影或下載一個200MB的軟件,這么大的文件需要拆分成多個數據包發送,發送過程需要持續幾分鐘或幾十分鐘。在此期間,發送方將要發送的內容一邊發送一邊放到緩存中,將緩存中的內容分成多個數據包,并進行編號,按順序發送。這就需要在發送方和接收方建立連接,協商通信過程的一些參數(如一個數據包較大有多少字節等)。
如果網絡不穩定造成某個數據包丟失,發送方必須重新發送丟失的數據包,否則就會造成接收到的文件不完整,這就需要TCP能夠實現可靠傳輸。如果發送方發送速度太快,接收方來不及處理,接收方還會通知發送方降低發送速度,甚至停止發送。
TCP還能實現流量控制,因為Internet中的流量不固定,流量過高時會造成網絡擁塞(這一點很好理解,就像城市上下班高峰時的交通堵塞一樣),在整個傳輸過程中,發送方要一直探測網絡是否擁塞來調整發送速度。TCP還有擁塞避免機制。
發送方的發送速度由網絡是否擁塞和接收方接收速度兩個因素控制,哪個速度低,就用哪個速度發送,如圖所示。
圖 TCP示意圖
有些應用程序通信使用TCP就顯得效率低了。例如,有些應用的客戶端只需向服務器端發送一個請求報文,服務器端返回一個響應報文就可以完成其功能。這類應用如果使用TCP發送3個數據包建立連接,再發送4個數據包釋放連接,只為了發送一個報文,就很不值得,這時干脆讓應用程序直接發送。如果丟包了,應用程序再發送一遍即可。這類應用,在傳輸層就使用 UDP。
UDP的應用場景如下。
(1)客戶端程序和服務器端程序通信,應用程序發送的數據包不需要分段。如域名解析,DNS協議使用的就是傳輸層的UDP,客戶端向DNS服務器發送一個報文請求解析某個網站的域名,DNS服務器將解析的結果通過一個報文返回給客戶端。
(2)實時通信。這類如QQ或微信語音聊天,或視頻聊天的應用,發送方和接收方需要實時交互,也就是不允許較長延遲,即便有幾句話因為網絡堵塞沒聽清,也不允許使用TCP等待丟失的報文,等待的時間太長了,就不能愉快地聊天了。
(3)多播或廣播通信。如學校多媒體機房,老師的計算機屏幕需要分享給教室里的學生計算機,在老師的計算機上安裝多媒體教室服務器端軟件,在學生的計算機上安裝多媒體教室客戶端軟件,老師的計算機使用多播地址或廣播地址發送報文,學生的計算機都能收到。這類應用在傳輸層使用UDP。
知道了傳輸層兩個協議的特點和應用場景,就很容易判斷某個應用層協議在傳輸層使用什么協議了。現在判斷一下,QQ聊天在傳輸層使用的是什么協議,QQ傳文件在傳輸層使用的是什么協議?
如果使用QQ給好友傳輸文件,這個過程會持續幾分鐘至幾十分鐘,肯定不是使用一個數據包就能把文件傳輸完的,需要將要傳輸的文件分段傳輸。在傳輸文件之前需要建立會話,在傳輸過程中實現可靠傳輸、流量控制、避免擁塞等,這些功能需要在傳輸層使用TCP來實現。
使用QQ聊天,通常一次輸入的聊天內容不會有太多文字,使用一個數據包就能把聊天內容發送出去,并且聊完第一句,也不定什么時候聊第二句,發送數據不是持續的,發送QQ聊天的內容在傳輸層使用UDP。
可見根據通信的特點,一個應用程序通信可以在傳輸層選擇不同的協議。