可靠的、面向鏈接的協議(eg:打電話)、傳輸效率低全雙工通訊(發送緩存&接收緩存)、面向字節流。算法
使用TCP的應用:Web瀏覽器;電子郵件、文件傳輸程序。瀏覽器
不可靠的、無鏈接的服務,傳輸效率高(發送前時延小),一對1、一對多、多對1、多對多、面向報文,盡最大努力服務,無擁塞控制。緩存
使用UDP的應用:域名系統 (DNS);視頻流;IP語音(VoIP)。網絡
UDP以其簡單、傳輸快的優點,在愈來愈多場景下取代了TCP,如實時遊戲。計算機網絡
(1)網速的提高給UDP的穩定性提供可靠網絡保障,丟包率很低,若是使用應用層重傳,可以確保傳輸的可靠性。視頻
(2)TCP爲了實現網絡通訊的可靠性,使用了複雜的擁塞控制算法,創建了繁瑣的握手過程,因爲TCP內置的系統協議棧中,極難對其進行改進。server
採用TCP,一旦發生丟包,TCP會將後續的包緩存起來,等前面的包重傳並接收到後再繼續發送,延時會愈來愈大,基於UDP對實時性要求較爲嚴格的狀況下,採用自定義重傳機制,可以把丟包產生的延遲降到最低,儘可能減小網絡問題對遊戲性形成影響。blog
如上圖所示,若是僅僅是2次握手的話,可能出現的問題以下:遊戲
Host A發送的數據包因爲網絡的緣由,出現了滯留,即延時到達了HostB。此時,B覺得HostA發來了請求,因而就向HostA發送確認報文,以創建鏈接。而HostA收到報文後,因爲其沒有向HostB發起創建鏈接的請求,所以不會理睬HostB的確認,也不會向HostB發送數據。而此時的B認爲已經創建起鏈接了,就等待HostA發送的數據,致使HostB的資源白白浪費!資源
另外一種表述:
這個例子很清晰的闡釋了「三次握手」對於創建可靠鏈接的意義。
TCP三次握手之打電話的例子:
A : 你好我是A,你聽獲得我在說話嗎
B : 聽到了,我是B,你聽到我在說話嗎
A : 嗯,聽到了
創建鏈接,開始聊天!
爲何TCP協議終止連接要四次?
一、當主機A確認發送完數據且知道B已經接受完了,想要關閉發送數據口(固然確認信號仍是能夠發),就會發FIN給主機B。
二、主機B收到A發送的FIN,表示收到了,就會發送ACK回覆。
三、但這是B可能還在發送數據,沒有想要關閉數據口的意思,因此FIN與ACK不是同時發送的,而是等到B數據發送完了,纔會發送FIN給主機A。
四、A收到B發來的FIN,知道B的數據也發送完了,回覆ACK, A等待2MSL之後,沒有收到B傳來的任何消息,知道B已經收到本身的ACK了,A就關閉連接,B也關閉連接了。
通俗例子:
A:「喂,我不說了。」A->FIN_WAIT1
B:「我知道了。等下,上一句還沒說完。Balabala…..」B->CLOSE_WAIT | A->FIN_WAIT2
B:」好了,說完了,我也不說了。」B->LAST_ACK
A:」我知道了。」A->TIME_WAIT | B->CLOSED
A等待2MSL,保證B收到了消息,不然重說一次」我知道了」,A->CLOSED