一、兩者區別
TCP(Transmission Control Protocol):
可靠的、面向連接的協議(eg:打電話)、傳輸效率低全雙工通信(發送緩存&接收緩存)、面向字節流。
使用TCP的應用:Web瀏覽器;電子郵件、文件傳輸程序。
UDP(User Datagram Protocol)
不可靠的、無連接的服務,傳輸效率高(發送前時延小),一對一、一對多、多對一、多對多、面向報文,盡最大努力服務,無擁塞控制。
使用UDP的應用:域名系統 (DNS);視頻流;IP語音(VoIP)。
二、為什么UDP有時比TCP更有優勢?
UDP以其簡單、傳輸快的優勢,在越來越多場景下取代了TCP,如實時游戲。
(1)網速的提升給UDP的穩定性提供可靠網絡保障,丟包率很低,如果使用應用層重傳,能夠確保傳輸的可靠性。
(2)TCP為了實現網絡通信的可靠性,使用了復雜的擁塞控制算法,建立了繁瑣的握手過程,由於TCP內置的系統協議棧中,極難對其進行改進。
采用TCP,一旦發生丟包,TCP會將后續的包緩存起來,等前面的包重傳並接收到后再繼續發送,延時會越來越大,基於UDP對實時性要求較為嚴格的情況下,采用自定義重傳機制,能夠把丟包產生的延遲降到最低,盡量減少網絡問題對游戲性造成影響。
TCP三次握手的過程

二次握手可能導致的問題:
如上圖所示,如果僅僅是2次握手的話,可能出現的問題如下:
Host A發送的數據包由於網絡的原因,出現了滯留,即延時到達了HostB。此時,B以為HostA發來了請求,於是就向HostA發送確認報文,以建立連接。而HostA收到報文后,由於其沒有向HostB發起建立連接的請求,因此不會理睬HostB的確認,也不會向HostB發送數據。而此時的B認為已經建立起連接了,就等待HostA發送的數據,導致HostB的資源白白浪費!
另一種表述:
這個例子很清晰的闡釋了“三次握手”對於建立可靠連接的意義。
TCP三次握手之打電話的例子:
A : 你好我是A,你聽得到我在說話嗎
B : 聽到了,我是B,你聽到我在說話嗎
A : 嗯,聽到了
建立連接,開始聊天!
四次揮手過程
為什么TCP協議終止鏈接要四次?
1、當主機A確認發送完數據且知道B已經接受完了,想要關閉發送數據口(當然確認信號還是可以發),就會發FIN給主機B。
2、主機B收到A發送的FIN,表示收到了,就會發送ACK回復。
3、但這是B可能還在發送數據,沒有想要關閉數據口的意思,所以FIN與ACK不是同時發送的,而是等到B數據發送完了,才會發送FIN給主機A。
4、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