TCP和UDP的誤解
一直都是說TCP/IP協(xié)議與UDP協(xié)議的區(qū)別棚贾,我覺得這是沒有從本質(zhì)上弄清楚網(wǎng)絡(luò)通信淫痰!
TCP/IP協(xié)議是一個協(xié)議簇病瞳。里面包括很多協(xié)議的践惑。UDP只是其中的一個慎颗。之所以命名為TCP/IP協(xié)議乡恕,因?yàn)門CP,IP協(xié)議是兩個很重要的協(xié)議言询,就用他兩命名了。
TCP簡介
TCP/IP協(xié)議集包括應(yīng)用層, 傳輸層傲宜,網(wǎng)絡(luò)層运杭,網(wǎng)絡(luò)訪問層。
TCP(Transmission Control Protocol函卒,傳輸控制協(xié)議)是面向連接的協(xié)議县习,也就是說,在收發(fā)數(shù)據(jù)前谆趾,必須和對方建立可靠的連接躁愿。
TCP建立連接要進(jìn)行3次握手
一個TCP連接必須要經(jīng)過三次“對話”才能建立起來,其中的過程非常復(fù)雜沪蓬,只簡單的描述下這三次對話的簡單過程:
(1)客戶向服務(wù)器發(fā)出連接請求數(shù)據(jù)包:“我想給你發(fā)數(shù)據(jù)彤钟,可以嗎?”跷叉,這是第一次對話逸雹;
(2)服務(wù)器向客戶發(fā)送同意連接和要求同步(同步就是兩臺主機(jī)一個在發(fā)送,一個在接收云挟,協(xié)調(diào)工作)的數(shù)據(jù)包:“可以梆砸,你什么時候發(fā)?”园欣,這是第二次對話帖世;
(3)客戶再發(fā)出一個數(shù)據(jù)包確認(rèn)服務(wù)器的要求同步:“我現(xiàn)在就發(fā),你接著吧沸枯!”日矫,這是第三次對話。
三次“對話”的目的是使數(shù)據(jù)包的發(fā)送和接收同步绑榴,經(jīng)過三次“對話”之后哪轿,客戶才向服務(wù)器正式發(fā)送數(shù)據(jù)。
TCP釋放連接要進(jìn)行4次
1 當(dāng)主機(jī)A完成數(shù)據(jù)傳輸后,將控制位FIN置1,提出停止TCP連接的請求
2 主機(jī)B收到FIN后對其作出響應(yīng),確認(rèn)這一方向上的TCP連接將關(guān)閉,將ACK置1
3 由B 端再提出反方向的關(guān)閉請求,將FIN置1
4 主機(jī)A對主機(jī)B的請求進(jìn)行確認(rèn),將ACK置1,雙方向的關(guān)閉結(jié)束.
由TCP的三次握手和四次斷開可以看出,TCP使用面向連接的通信方式,大大提高了數(shù)據(jù)通信的可靠性,使發(fā)送數(shù)據(jù)端
和接收端在數(shù)據(jù)正式傳輸前就有了交互,為數(shù)據(jù)正式傳輸打下了可靠的基礎(chǔ)
TCP采用四次揮手關(guān)閉連接如圖所示為什么建立連接協(xié)議是三次握手翔怎,而關(guān)閉連接卻是四次握手呢窃诉?
因?yàn)楫?dāng)Server端收到Client端的SYN連接請求報文后,可以直接發(fā)送SYN+ACK報文赤套。其中ACK報文是用來應(yīng)答的飘痛,SYN報文是用來同步的。但是關(guān)閉連接時于毙,當(dāng)Server端收到FIN報文時敦冬,很可能并不會立即關(guān)閉socket辅搬,所以只能先回復(fù)一個ACK報文唯沮,告訴Client端脖旱,”你發(fā)的FIN報文我收到了”。只有等到我Server端所有的報文都發(fā)送完了介蛉,我才能發(fā)送FIN報文萌庆,因此不能一起發(fā)送。故需要四步握手币旧。 TCPSocket和UDPSocket的具體實(shí)現(xiàn)
UDP(User Data Protocol践险,用戶數(shù)據(jù)報協(xié)議)
(1) UDP是一個非連接的協(xié)議,傳輸數(shù)據(jù)之前源端和終端不建立連接吹菱,當(dāng)它想傳送時就簡單地去抓取來自應(yīng)用程序的數(shù)據(jù)巍虫,并盡可能快地把它扔到網(wǎng)絡(luò)上。在發(fā)送端鳍刷,UDP傳送數(shù)據(jù)的速度僅僅是受應(yīng)用程序生成數(shù)據(jù)的速度占遥、計(jì)算機(jī)的能力和傳輸帶寬的限制;在接收端输瓜,UDP把每個消息段放在隊(duì)列中瓦胎,應(yīng)用程序每次從隊(duì)列中讀一個消息段。
(2) 由于傳輸數(shù)據(jù)不建立連接尤揣,因此也就不需要維護(hù)連接狀態(tài)搔啊,包括收發(fā)狀態(tài)等,因此一臺服務(wù)機(jī)可同時向多個客戶機(jī)傳輸相同的消息北戏。
(3) UDP信息包的標(biāo)題很短负芋,只有8個字節(jié),相對于TCP的20個字節(jié)信息包的額外開銷很小嗜愈。
(4) 吞吐量不受擁擠控制算法的調(diào)節(jié)示罗,只受應(yīng)用軟件生成數(shù)據(jù)的速率、傳輸帶寬芝硬、源端和終端主機(jī)性能的限制蚜点。
(5)UDP使用盡最大努力交付,即不保證可靠交付拌阴,因此主機(jī)不需要維持復(fù)雜的鏈接狀態(tài)表(這里面有許多參數(shù))绍绘。
(6)UDP是面向報文的。發(fā)送方的UDP對應(yīng)用程序交下來的報文迟赃,在添加首部后就向下交付給IP層陪拘。既不拆分,也不合并纤壁,而是保留這些報文的邊界左刽,因此,應(yīng)用程序需要選擇合適的報文大小酌媒。
我們經(jīng)常使用“ping”命令來測試兩臺主機(jī)之間TCP/IP通信是否正常欠痴,其實(shí)“ping”命令的原理就是向?qū)Ψ街鳈C(jī)發(fā)送UDP數(shù)據(jù)包迄靠,然后對方主機(jī)確認(rèn)收到數(shù)據(jù)包,如果數(shù)據(jù)包是否到達(dá)的消息及時反饋回來喇辽,那么網(wǎng)絡(luò)就是通的掌挚。
小結(jié)TCP與UDP的區(qū)別:
1.基于連接與無連接;
2.對系統(tǒng)資源的要求(TCP較多菩咨,UDP少)吠式;
3.UDP程序結(jié)構(gòu)較簡單;
4.流模式與數(shù)據(jù)報模式 抽米;
5.TCP保證數(shù)據(jù)正確性特占,UDP可能丟包,TCP保證數(shù)據(jù)順序云茸,UDP不保證摩钙。