一、TCP和UDP的區(qū)別和優(yōu)缺點(diǎn)
TCP與UDP區(qū)別總結(jié)
1、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接
2、TCP提供可靠的服務(wù)。也就是說,通過TCP連接傳送的數(shù)據(jù),無差錯,不丟失,不重復(fù),且按序到達(dá);UDP盡最大努力交付,即不保證可靠交付
Tcp通過校驗(yàn)和,重傳控制,序號標(biāo)識,滑動窗口、確認(rèn)應(yīng)答實(shí)現(xiàn)可靠傳輸。如丟包時的重發(fā)控制,還可以對次序亂掉的分包進(jìn)行順序控制。
3、UDP具有較好的實(shí)時性,工作效率比TCP高,適用于對高速傳輸和實(shí)時性有較高的通信或廣播通信。
4.每一條TCP連接只能是點(diǎn)到點(diǎn)的;UDP支持一對一,一對多,多對一和多對多的交互通信
5、TCP對系統(tǒng)資源要求較多,UDP對系統(tǒng)資源要求較少。
為什么UDP有時比TCP更有優(yōu)勢
UDP以其簡單、傳輸快的優(yōu)勢,在越來越多場景下取代了TCP,如實(shí)時游戲。
(1)網(wǎng)速的提升給UDP的穩(wěn)定性提供可靠網(wǎng)絡(luò)保障,丟包率很低,如果使用應(yīng)用層重傳,能夠確保傳輸?shù)目煽啃浴?/p>
(2)TCP為了實(shí)現(xiàn)網(wǎng)絡(luò)通信的可靠性,使用了復(fù)雜的擁塞控制算法,建立了繁瑣的握手過程,由于TCP內(nèi)置的系統(tǒng)協(xié)議棧中,極難對其進(jìn)行改進(jìn)。
采用TCP,一旦發(fā)生丟包,TCP會將后續(xù)的包緩存起來,等前面的包重傳并接收到后再繼續(xù)發(fā)送,延時會越來越大,基于UDP對實(shí)時性要求較為嚴(yán)格的情況下,采用自定義重傳機(jī)制,能夠把丟包產(chǎn)生的延遲降到最低,盡量減少網(wǎng)絡(luò)問題對游戲性造成影響。
延伸閱讀:
二、TCP編程的服務(wù)器端一般步驟
1、創(chuàng)建一個socket,用函數(shù)socket(); SOCKET SocketListen =socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);
2、設(shè)置socket屬性,用函數(shù)setsockopt(); * 可選
3、綁定IP地址、端口等信息到socket上,用函數(shù)bind(); SOCKET_ERROR = bind(SocketListen,(const sockaddr*)&addr,sizeof(addr))
4、開啟監(jiān)聽,用函數(shù)listen(); SOCKET_ERROR == listen(SocketListen,2)
5、接收客戶端上來的連接,用函數(shù)accept(); SOCKET SocketWaiter = accept(SocketListen,
_Out_ struct sockaddr *addr
_Inout_ int *addrlen);
6、收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write();
7、關(guān)閉網(wǎng)絡(luò)連接; closesocket(SocketListen);closesocket(SocketWaiter);
8、關(guān)閉監(jiān)聽;
SOCK_STREAM這種的特點(diǎn)是面向連接的,即每次收發(fā)數(shù)據(jù)之前必須通過connect建立連接,而SOCK_DGRAM這種是User Datagram Protocol協(xié)議的網(wǎng)絡(luò)通訊,它是無連接的,不可靠的。