網絡基礎—TCP與UDP之間的區別

TCP與UDP區別

1、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發送數據之前不需要建立連接
2、TCP提供可靠的服務。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付

TCP通過校驗和,重傳控制,序號標識,滑動窗口、確認應答實現可靠傳輸。如丟包時的重發控制,還可以對次序亂掉的分包進行順序控制。

3、UDP具有較好的實時性,工作效率比TCP高,適用於對高速傳輸和實時性有較高的通信或廣播通信。

4.每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信。

5、 TCP面向字節流,因爲面向字節流,讀取數據很靈活,可以是一個字節 兩個字節等等;UDP面向數據報,不能靈活的控制讀寫數據的次數與數量。

6、TCP對系統資源要求較多,UDP對系統資源要求較少。

爲什麼UDP有時比TCP更有優勢?

    UDP以其簡單、傳輸快的優勢,在越來越多場景下取代了TCP,如實時遊戲。

(1)網速的提升給UDP的穩定性提供可靠網絡保障,丟包率很低,如果使用應用層重傳,能夠確保傳輸的可靠性。

(2)TCP爲了實現網絡通信的可靠性,使用了複雜的擁塞控制算法,建立了繁瑣的握手過程,由於TCP內置的系統協議棧中,
極難對其進行改進。

    採用TCP,一旦發生丟包,TCP會將後續的包緩存起來,等前面的包重傳並接收到後再繼續發送,延時會越來越大,基於UDP
對實時性要求較爲嚴格的情況下,採用自定義重傳機制,能夠把丟包產生的延遲降到最低,儘量減少網絡問題對遊戲性造成影響。
UDP和TCP編程步驟上的區別

TCP:

TCP編程的服務器端一般步驟是:
  1、創建一個socket,用函數socket(); SOCKET SocketListen =socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);
  2、設置socket屬性,用函數setsockopt(); * 可選
  3、綁定IP地址、端口等信息到socket上,用函數bind(); SOCKET_ERROR = bind(SocketListen,(const sockaddr*)&addr,sizeof(addr))
  4、開啓監聽,用函數listen(); SOCKET_ERROR == listen(SocketListen,2)
  5、接收客戶端上來的連接,用函數accept(); SOCKET SocketWaiter = accept(SocketListen, Out struct sockaddr *addr,Inout int *addrlen);
  6、收發數據,用函數send()和recv(),或者read()和write();
  7、關閉網絡連接; closesocket(SocketListen);closesocket(SocketWaiter);
  8、關閉監聽;
SOCK_STREAM這種的特點是面向連接的,即每次收發數據之前必須通過connect建立連接,而SOCK_DGRAM這種是User Datagram Protocol協議的網絡通訊,它是無連接的,不可靠的。


TCP編程的客戶端一般步驟是:
  1、創建一個socket,用函數socket();
  2、設置socket屬性,用函數setsockopt();* 可選
  3、綁定IP地址、端口等信息到socket上,用函數bind();* 可選
  4、設置要連接的對方的IP地址和端口等屬性;
  5、連接服務器,用函數connect();
  6、收發數據,用函數send()和recv(),或者read()和write();
  7、關閉網絡連接;

int send(
  _In_  SOCKET s,         //向哪個socket發送,accept返回的socket。
  _In_  const char *buf,
  _In_  int len,
  _In_  int flags
);                               
send(SocketClient,(const char *)&fh,sizeof(fh),0);
recv(SocketClient,szbuf,sizeof(szbuf),0);

UDP:

 UDP編程的服務器端一般步驟是:
  1、創建一個socket,用函數socket();
  2、設置socket屬性,用函數setsockopt();* 可選
  3、綁定IP地址、端口等信息到socket上,用函數bind();
  4、循環接收數據,用函數recvfrom();
  5、關閉網絡連接;


UDP編程的客戶端一般步驟是:
  1、創建一個socket,用函數socket();
  2、設置socket屬性,用函數setsockopt();* 可選
  3、綁定IP地址、端口等信息到socket上,用函數bind();* 可選
  4、設置對方的IP地址和端口等屬性;
  5、發送數據,用函數sendto();
  6、關閉網絡連接;

int recvfrom(
  _In_         SOCKET s,       //綁定的socket
  _Out_        char *buf,
  _In_         int len,
  _In_         int flags,
  _Out_        struct sockaddr *from,  //用來接收對方的
  _Inout_opt_  int *fromlen
);
int nres=recvfrom(pThis->m_socketListen,szBuf,sizeof(szBuf),0,(sockaddr*)&addrClient,&nSize);//0處標誌位
sendto(m_socketListen,szBuffer,nSize,0,(const sockaddr*)&addr,sizeof(sockaddr_in))
TCP和UDP是OSI模型中的運輸層中的協議。TCP提供可靠的通信傳輸,而UDP則常被用於讓廣播和細節控制交給應用的通信傳輸。
發佈了78 篇原創文章 · 獲贊 34 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章