TCP和UDP的誤解
一直都是說(shuō)TCP/IP協(xié)議與UDP協(xié)議的區(qū)別,我覺(jué)得這是沒(méi)有從本質(zhì)上弄清楚網(wǎng)絡(luò)通信!
TCP/IP協(xié)議是一個(gè)協(xié)議簇。里面包括很多協(xié)議的。UDP只是其中的一個(gè)。之所以命名為TCP/IP協(xié)議,因?yàn)門CP,IP協(xié)議是兩個(gè)很重要的協(xié)議,就用他兩命名了。
TCP簡(jiǎn)介
TCP/IP協(xié)議集包括應(yīng)用層, 傳輸層,網(wǎng)絡(luò)層,網(wǎng)絡(luò)訪問(wèn)層。
TCP(Transmission Control Protocol,傳輸控制協(xié)議)是面向連接的協(xié)議,也就是說(shuō),在收發(fā)數(shù)據(jù)前,必須和對(duì)方建立可靠的連接。
TCP建立連接要進(jìn)行3次握手
一個(gè)TCP連接必須要經(jīng)過(guò)三次“對(duì)話”才能建立起來(lái),其中的過(guò)程非常復(fù)雜,只簡(jiǎn)單的描述下這三次對(duì)話的簡(jiǎn)單過(guò)程:
(1)客戶向服務(wù)器發(fā)出連接請(qǐng)求數(shù)據(jù)包:“我想給你發(fā)數(shù)據(jù),可以嗎?”,這是第一次對(duì)話;
(2)服務(wù)器向客戶發(fā)送同意連接和要求同步(同步就是兩臺(tái)主機(jī)一個(gè)在發(fā)送,一個(gè)在接收,協(xié)調(diào)工作)的數(shù)據(jù)包:“可以,你什么時(shí)候發(fā)?”,這是第二次對(duì)話;
(3)客戶再發(fā)出一個(gè)數(shù)據(jù)包確認(rèn)服務(wù)器的要求同步:“我現(xiàn)在就發(fā),你接著吧!”,這是第三次對(duì)話。
三次“對(duì)話”的目的是使數(shù)據(jù)包的發(fā)送和接收同步,經(jīng)過(guò)三次“對(duì)話”之后,客戶才向服務(wù)器正式發(fā)送數(shù)據(jù)。
TCP釋放連接要進(jìn)行4次
1 當(dāng)主機(jī)A完成數(shù)據(jù)傳輸后,將控制位FIN置1,提出停止TCP連接的請(qǐng)求
2 主機(jī)B收到FIN后對(duì)其作出響應(yīng),確認(rèn)這一方向上的TCP連接將關(guān)閉,將ACK置1
3 由B 端再提出反方向的關(guān)閉請(qǐng)求,將FIN置1
4 主機(jī)A對(duì)主機(jī)B的請(qǐng)求進(jìn)行確認(rèn),將ACK置1,雙方向的關(guān)閉結(jié)束.
由TCP的三次握手和四次斷開(kāi)可以看出,TCP使用面向連接的通信方式,大大提高了數(shù)據(jù)通信的可靠性,使發(fā)送數(shù)據(jù)端
和接收端在數(shù)據(jù)正式傳輸前就有了交互,為數(shù)據(jù)正式傳輸打下了可靠的基礎(chǔ)
TCP采用四次揮手關(guān)閉連接如圖所示為什么建立連接協(xié)議是三次握手,而關(guān)閉連接卻是四次握手呢?
因?yàn)楫?dāng)Server端收到Client端的SYN連接請(qǐng)求報(bào)文后,可以直接發(fā)送SYN+ACK報(bào)文。其中ACK報(bào)文是用來(lái)應(yīng)答的,SYN報(bào)文是用來(lái)同步的。但是關(guān)閉連接時(shí),當(dāng)Server端收到FIN報(bào)文時(shí),很可能并不會(huì)立即關(guān)閉socket,所以只能先回復(fù)一個(gè)ACK報(bào)文,告訴Client端,”你發(fā)的FIN報(bào)文我收到了”。只有等到我Server端所有的報(bào)文都發(fā)送完了,我才能發(fā)送FIN報(bào)文,因此不能一起發(fā)送。故需要四步握手。 TCPSocket和UDPSocket的具體實(shí)現(xiàn)
UDP(User Data Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)
(1) UDP是一個(gè)非連接的協(xié)議,傳輸數(shù)據(jù)之前源端和終端不建立連接,當(dāng)它想傳送時(shí)就簡(jiǎn)單地去抓取來(lái)自應(yīng)用程序的數(shù)據(jù),并盡可能快地把它扔到網(wǎng)絡(luò)上。在發(fā)送端,UDP傳送數(shù)據(jù)的速度僅僅是受應(yīng)用程序生成數(shù)據(jù)的速度、計(jì)算機(jī)的能力和傳輸帶寬的限制;在接收端,UDP把每個(gè)消息段放在隊(duì)列中,應(yīng)用程序每次從隊(duì)列中讀一個(gè)消息段。
(2) 由于傳輸數(shù)據(jù)不建立連接,因此也就不需要維護(hù)連接狀態(tài),包括收發(fā)狀態(tài)等,因此一臺(tái)服務(wù)機(jī)可同時(shí)向多個(gè)客戶機(jī)傳輸相同的消息。
(3) UDP信息包的標(biāo)題很短,只有8個(gè)字節(jié),相對(duì)于TCP的20個(gè)字節(jié)信息包的額外開(kāi)銷很小。
(4) 吞吐量不受擁擠控制算法的調(diào)節(jié),只受應(yīng)用軟件生成數(shù)據(jù)的速率、傳輸帶寬、源端和終端主機(jī)性能的限制。
(5)UDP使用盡最大努力交付,即不保證可靠交付,因此主機(jī)不需要維持復(fù)雜的鏈接狀態(tài)表(這里面有許多參數(shù))。
(6)UDP是面向報(bào)文的。發(fā)送方的UDP對(duì)應(yīng)用程序交下來(lái)的報(bào)文,在添加首部后就向下交付給IP層。既不拆分,也不合并,而是保留這些報(bào)文的邊界,因此,應(yīng)用程序需要選擇合適的報(bào)文大小。
我們經(jīng)常使用“ping”命令來(lái)測(cè)試兩臺(tái)主機(jī)之間TCP/IP通信是否正常,其實(shí)“ping”命令的原理就是向?qū)Ψ街鳈C(jī)發(fā)送UDP數(shù)據(jù)包,然后對(duì)方主機(jī)確認(rèn)收到數(shù)據(jù)包,如果數(shù)據(jù)包是否到達(dá)的消息及時(shí)反饋回來(lái),那么網(wǎng)絡(luò)就是通的。
小結(jié)TCP與UDP的區(qū)別:
1.基于連接與無(wú)連接;
2.對(duì)系統(tǒng)資源的要求(TCP較多,UDP少);
3.UDP程序結(jié)構(gòu)較簡(jiǎn)單;
4.流模式與數(shù)據(jù)報(bào)模式 ;
5.TCP保證數(shù)據(jù)正確性,UDP可能丟包,TCP保證數(shù)據(jù)順序,UDP不保證。