TCP和UDP是OSI模型中的運(yùn)輸層中的協(xié)議穆咐。TCP提供可靠的通信傳輸,而UDP則常被用于廣播和細(xì)節(jié)控制交給應(yīng)用的通信傳輸。
1.TCP
TCP(Transmission Control Protocol,傳輸控制協(xié)議)是基于連接的協(xié)議挪挤,也就是說,在正式收發(fā)數(shù)據(jù)前关翎,必須和對(duì)方建立可靠的連接扛门。一個(gè)TCP連接必須要經(jīng)過三次“對(duì)話”才能建立起來,而釋放時(shí)需要四次對(duì)話纵寝。即三次握手论寨、四次揮手:
三次握手,大致流程如下:
- 第一次握手:起初兩端都處于CLOSED關(guān)閉狀態(tài)店雅,Client將標(biāo)志位SYN置為1政基,隨機(jī)產(chǎn)生一個(gè)值seq=x,并將該數(shù)據(jù)包發(fā)送給Server闹啦,Client進(jìn)入SYN-SENT狀態(tài)沮明,等待Server確認(rèn);
- 第二次握手:Server收到數(shù)據(jù)包后由標(biāo)志位SYN=1得知Client請(qǐng)求建立連接窍奋,Server將標(biāo)志位SYN和ACK都置為1荐健,ack=x+1酱畅,隨機(jī)產(chǎn)生一個(gè)值seq=y,并將該數(shù)據(jù)包發(fā)送給Client以確認(rèn)連接請(qǐng)求江场,Server進(jìn)入SYN-RCVD狀態(tài)纺酸,此時(shí)操作系統(tǒng)為該TCP連接分配TCP緩存和變量;
- 第三次握手:Client收到確認(rèn)后址否,檢查ack是否為x+1餐蔬,ACK是否為1,如果正確則將標(biāo)志位ACK置為1佑附,ack=y+1樊诺,并且此時(shí)操作系統(tǒng)為該TCP連接分配TCP緩存和變量,并將該數(shù)據(jù)包發(fā)送給Server音同,Server檢查ack是否為y+1词爬,ACK是否為1,如果正確則連接建立成功权均,Client和Server進(jìn)入ESTABLISHED狀態(tài)顿膨,完成三次握手,隨后Client和Server就可以開始傳輸數(shù)據(jù)叽赊。
四次揮手恋沃,大致流程如下:
- A的應(yīng)用進(jìn)程先向其TCP發(fā)出連接釋放報(bào)文段(FIN=1,序號(hào)seq=u)蛇尚,并停止再發(fā)送數(shù)據(jù)芽唇,主動(dòng)關(guān)閉TCP連接,進(jìn)入FIN-WAIT-1(終止等待1)狀態(tài)取劫,等待B的確認(rèn)。
- B收到連接釋放報(bào)文段后即發(fā)出確認(rèn)報(bào)文段研侣,(ACK=1谱邪,確認(rèn)號(hào)ack=u+1,序號(hào)seq=v)庶诡,B進(jìn)入CLOSE-WAIT(關(guān)閉等待)狀態(tài)惦银,此時(shí)的TCP處于半關(guān)閉狀態(tài),A到B的連接釋放末誓。
- A收到B的確認(rèn)后扯俱,進(jìn)入FIN-WAIT-2(終止等待2)狀態(tài),等待B發(fā)出的連接釋放報(bào)文段喇澡。
- B沒有要向A發(fā)出的數(shù)據(jù)迅栅,B發(fā)出連接釋放報(bào)文段(FIN=1,ACK=1晴玖,序號(hào)seq=w读存,確認(rèn)號(hào)ack=u+1)为流,B進(jìn)入LAST-ACK(最后確認(rèn))狀態(tài),等待A的確認(rèn)让簿。
- A收到B的連接釋放報(bào)文段后敬察,對(duì)此發(fā)出確認(rèn)報(bào)文段(ACK=1,seq=u+1尔当,ack=w+1)莲祸,A進(jìn)入TIME-WAIT(時(shí)間等待)狀態(tài)。此時(shí)TCP未釋放掉椭迎,需要經(jīng)過時(shí)間等待計(jì)時(shí)器設(shè)置的時(shí)間2MSL后锐帜,A才進(jìn)入CLOSED狀態(tài)。
其中侠碧,SYN表示建立連接抹估,F(xiàn)IN表示關(guān)閉連接,ACK表示響應(yīng)弄兜,PSH表示有 DATA數(shù)據(jù)傳輸药蜻,RST表示連接重置
握手只要三步,但揮手需要四步的原因:
- 當(dāng)Server端收到Client端的SYN連接請(qǐng)求報(bào)文后替饿,可以直接發(fā)送SYN+ACK報(bào)文语泽。其中ACK報(bào)文是用來應(yīng)答的,SYN報(bào)文是用來同步的视卢。但是關(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ā)送鳞芙。故需要四步揮手眷柔。
2.UDP
UDP(User Data Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)是與TCP相對(duì)應(yīng)的協(xié)議原朝。它是面向非連接的協(xié)議驯嘱,它不與對(duì)方建立連接,而是直接就把數(shù)據(jù)包發(fā)送過去喳坠!
3.編程步驟
TCP服務(wù)器端一般步驟是:
1鞠评、創(chuàng)建一個(gè)socket,用函數(shù)socket()丙笋;
2谢澈、設(shè)置socket屬性煌贴,用函數(shù)setsockopt(); * 可選
3、綁定IP地址锥忿、端口等信息到socket上牛郑,用函數(shù)bind();
4、開啟監(jiān)聽敬鬓,用函數(shù)listen()淹朋;
5、接收客戶端上來的連接钉答,用函數(shù)accept()础芍;
6、收發(fā)數(shù)據(jù)数尿,用函數(shù)send()和recv()仑性,或者read()和write();
7、關(guān)閉網(wǎng)絡(luò)連接右蹦;
8诊杆、關(guān)閉監(jiān)聽;
TCP客戶端一般步驟是:
1何陆、創(chuàng)建一個(gè)socket晨汹,用函數(shù)socket();
2贷盲、設(shè)置socket屬性淘这,用函數(shù)setsockopt();* 可選
3、綁定IP地址巩剖、端口等信息到socket上铝穷,用函數(shù)bind();* 可選
4、設(shè)置要連接的對(duì)方的IP地址和端口等屬性佳魔;
5氧骤、連接服務(wù)器,用函數(shù)connect()吃引;
6、收發(fā)數(shù)據(jù)刽锤,用函數(shù)send()和recv()镊尺,或者read()和write();
7、關(guān)閉網(wǎng)絡(luò)連接并思;
與之對(duì)應(yīng)的UDP編程步驟要簡單許多庐氮,分別如下:
UDP編程的服務(wù)器端一般步驟是:
1、創(chuàng)建一個(gè)socket宋彼,用函數(shù)socket()弄砍;
2仙畦、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選
3音婶、綁定IP地址慨畸、端口等信息到socket上,用函數(shù)bind();
4衣式、循環(huán)接收數(shù)據(jù)寸士,用函數(shù)recvfrom();
5、關(guān)閉網(wǎng)絡(luò)連接碴卧;
UDP編程的客戶端一般步驟是:
1弱卡、創(chuàng)建一個(gè)socket,用函數(shù)socket()住册;
2婶博、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選
3荧飞、綁定IP地址凡人、端口等信息到socket上,用函數(shù)bind();* 可選
4垢箕、設(shè)置對(duì)方的IP地址和端口等屬性;
5划栓、發(fā)送數(shù)據(jù),用函數(shù)sendto();
6条获、關(guān)閉網(wǎng)絡(luò)連接忠荞;
3.TCP與UDP區(qū)別
- TCP面向連接;UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接
- TCP提供可靠的服務(wù)帅掘。也就是說委煤,通過TCP連接傳送的數(shù)據(jù),無差錯(cuò)修档,不丟失碧绞,不重復(fù),且按序到達(dá);UDP盡最大努力交付吱窝,即不保證可靠交付
- TCP通過校驗(yàn)和讥邻,重傳控制,序號(hào)標(biāo)識(shí)院峡,滑動(dòng)窗口兴使、確認(rèn)應(yīng)答實(shí)現(xiàn)可靠傳輸。如丟包時(shí)的重發(fā)控制照激,還可以對(duì)次序亂掉的分包進(jìn)行順序控制发魄。
- UDP具有較好的實(shí)時(shí)性,工作效率比TCP高,適用于對(duì)高速傳輸和實(shí)時(shí)性有較高的通信或廣播通信励幼。
- 每一條TCP連接只能是點(diǎn)到點(diǎn)的;UDP支持一對(duì)一汰寓,一對(duì)多,多對(duì)一和多對(duì)多的交互通信
- TCP對(duì)系統(tǒng)資源要求較多苹粟,UDP對(duì)系統(tǒng)資源要求較少有滑。
參考:
https://blog.csdn.net/xiaobangkuaipao/article/details/76793702
https://www.cnblogs.com/HPAHPA/p/7737641.html
https://www.cnblogs.com/Andya/p/7272462.html