TCP(Transmission Control Protocol?傳輸控制協(xié)議)是一種面向連接的哨毁、可靠的汪茧、基于字節(jié)流的傳輸層通信協(xié)議椅亚,由IETF的RFC 793定義。
UDP(User Datagram Protocol)協(xié)議直接位于IP(網(wǎng)際協(xié)議)協(xié)議的頂層舱污。根據(jù)OSI(開放系統(tǒng)互連)參考模型呀舔,UDP和TCP都屬于傳輸層協(xié)議。UDP協(xié)議的主要作用是將網(wǎng)絡(luò)數(shù)據(jù)流量壓縮成數(shù)據(jù)包的形式扩灯。
TCP與UDP區(qū)別總結(jié):
1别威、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接
2驴剔、TCP提供可靠的服務。也就是說粥庄,通過TCP連接傳送的數(shù)據(jù)丧失,無差錯,不丟失惜互,不重復布讹,且按序達;UDP 盡最大努力交 付琳拭,即不保證可靠交付Tcp通過校驗和,重傳控制描验,序號標識白嘁,滑動窗口、確認應 答實現(xiàn)可靠傳輸膘流。如丟包時的重發(fā)控制絮缅,還可以對次序亂掉的分包進行順序控制。
3呼股、UDP具有較好的實時性耕魄,工作效率比TCP高,適用于對高速傳輸和實時性有較高的通信或廣播通信彭谁。
4吸奴、每一條TCP連接只能是點到點的;UDP支持一對一,一對多缠局,多對一和多對多的交互通信
5则奥、TCP對系統(tǒng)資源要求較多,UDP對系統(tǒng)資源要求較少狭园。
為什么UDP有時比TCP更有優(yōu)勢?
UDP以其簡單读处、傳輸快的優(yōu)勢,在越來越多場景下取代了TCP,如實時游戲妙啃。
(1)網(wǎng)速的提升給UDP的穩(wěn)定性提供可靠網(wǎng)絡(luò)保障档泽,丟包率很低,如果使用應用層重傳揖赴,能夠確保傳輸?shù)目煽啃浴?/p>
(2)TCP為了實現(xiàn)網(wǎng)絡(luò)通信的可靠性馆匿,使用了復雜的擁塞控制算法,建立了繁瑣的握手過程燥滑,由于TCP內(nèi)置的系統(tǒng)協(xié)議棧中渐北,極難對其進行改進。
采用TCP铭拧,一旦發(fā)生丟包赃蛛,TCP會將后續(xù)的包緩存起來,等前面的包重傳并接收到后再繼續(xù)發(fā)送搀菩,延時會越來越大呕臂,基于UDP對實時性要求較為嚴格的情況下,采用自定義重傳機制肪跋,能夠把丟包產(chǎn)生的延遲降到最低歧蒋,盡量減少網(wǎng)絡(luò)問題對游戲性造成影響。
基于上述不同,UDP和TCP編程步驟也有些不同谜洽,如下:
TCP:
TCP編程的服務器端一般步驟是:
1萝映、創(chuàng)建一個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)建一個socket,用函數(shù)socket()怎抛;
2卑吭、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選
3马绝、綁定IP地址豆赏、端口等信息到socket上,用函數(shù)bind();* 可選
4富稻、設(shè)置要連接的對方的IP地址和端口等屬性掷邦;
5、連接服務器椭赋,用函數(shù)connect()抚岗;
6、收發(fā)數(shù)據(jù)哪怔,用函數(shù)send()和recv()宣蔚,或者read()和write();
7廷痘、關(guān)閉網(wǎng)絡(luò)連接;
UDP:
與之對應的UDP編程步驟要簡單許多件已,分別如下:
UDP編程的服務器端一般步驟是:
1个绍、創(chuàng)建一個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)建一個socket巍糯,用函數(shù)socket()啸驯;
2、設(shè)置socket屬性祟峦,用函數(shù)setsockopt();* 可選
3罚斗、綁定IP地址、端口等信息到socket上宅楞,用函數(shù)bind();* 可選
4针姿、設(shè)置對方的IP地址和端口等屬性;
5、發(fā)送數(shù)據(jù)厌衙,用函數(shù)sendto();
6距淫、關(guān)閉網(wǎng)絡(luò)連接;