1. 程式人生 > >TCP和UDP的區別和優缺點

TCP和UDP的區別和優缺點

1、TCP與UDP區別總結:
1、TCP面向連線(如打電話要先撥號建立連線);UDP是無連線的,即傳送資料之前不需要建立連線

2、TCP提供可靠的服務。也就是說,通過TCP連線傳送的資料,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付

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

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

4.每一條TCP連線只能是點到點的;UDP支援一對一,一對多,多對一和多對多的互動通訊

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

2、為什麼UDP有時比TCP更有優勢?

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

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

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

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

3、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程式設計步驟要簡單許多,分別如下: 
  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則常被用於讓廣播和細節控制交給應用的通訊傳輸。

4、將socket設定為廣播屬性
bool optval=true;
setsockopt(m_socketListen,SOL_SOCKET,SO_BROADCAST,(const char *)&optval,sizeof(bool));

5、將Socket設定為非阻塞。
//bool benable=true;
//ioctlsocket(m_socketListen,FIONBIO,(u_long*)&benable);

6、Tcp頭,20位元組

7、UDP首部,8個位元組