1. 程式人生 > >TCP與UDP在socket程式設計中的區別

TCP與UDP在socket程式設計中的區別

一、TCPUDP的區別

 基於連線與無連線 
  對系統資源的要求(TCP較多,UDP少) 
  UDP程式結構較簡單 
  流模式與資料報模式 
  TCP保證資料正確性,UDP可能丟包 
  TCP保證資料順序,UDP不保證 
  部分滿足以下幾點要求時,應該採用UDP 面向資料報方式 網路資料大多為短訊息 
  擁有大量Client 
  對資料安全性無特殊要求 
  網路負擔非常重,但對響應速度要求高 
  具體程式設計時的區別 socket()的引數不同 
  UDP Server不需要呼叫listen和accept 
  UDP收發資料用sendto/recvfrom函式 
  TCP:地址資訊在connect/accept時確定 
  UDP:在sendto/recvfrom函式中每次均 需指定地址資訊 
  UDP:shutdown函式無效

二、man----socket
    通過檢視socket的man手冊可以看到socket函式的第一個引數的值可以為下面這些值: 
  Name Purpose 
  PF_UNIX, PF_LOCAL Local communication 
  PF_INET IPv4 Internet protocols 
  PF_INET6 IPv6 Internet protocols 
  PF_IPX IPX - Novell protocols 
  PF_NETLINK Kernel user interface device 
  PF_X25 ITU-T X.25 / ISO-8208 protocol 
  PF_AX25 Amateur radio AX.25 protocol 
  PF_ATMPVC Access to raw ATM PVCs 
  PF_APPLETALK Appletalk 
  PF_PACKET Low level packet interface

三、程式設計區別
     通常我們在說到網路程式設計時預設是指TCP程式設計,即用前面提到的socket函式建立一個socket用於TCP通訊,函式引數我們通常填為SOCK_STREAM。即socket(PF_INET, SOCK_STREAM, 0),這表示建立一個socket用於流式網路通訊。 
   SOCK_STREAM這種的特點是面向連線的,即每次收發資料之前必須通過connect建立連線,也是雙向的,即任何一方都可以收發資料,協議本身提供了一些保障機制保證它是可靠的、有序的,即每個包按照發送的順序到達接收方。 

  而SOCK_DGRAM這種是User Datagram Protocol協議的網路通訊,它是無連線的,不可靠的,因為通訊雙方傳送資料後不知道對方是否已經收到資料,是否正常收到資料。任何一方建立一個socket以後就可以用sendto傳送資料,也可以用recvfrom接收資料。根本不關心對方是否存在,是否傳送了資料。它的特點是通訊速度比較快。大家都知道TCP是要經過三次握手的,而UDP沒有。 

  基於上述不同,UDP和TCP程式設計步驟也有些不同,如下: 
  TCP程式設計的伺服器端一般步驟是: 
  1、建立一個socket,用函式socket(); 
  2、設定socket屬性,用函式setsockopt(); * 可選 
  3、繫結IP地址、埠等資訊到socket上,用函式bind(); 
  4、開啟監聽,用函式listen(); 
  5、接收客戶端上來的連線,用函式accept(); 
  6、收發資料,用函式send()和recv(),或者read()和write(); 
  7、關閉網路連線; 
  8、關閉監聽; 

  TCP程式設計的客戶端一般步驟是: 
  1、建立一個socket,用函式socket(); 
  2、設定socket屬性,用函式setsockopt();* 可選 
  3、繫結IP地址、埠等資訊到socket上,用函式bind();* 可選 
  4、設定要連線的對方的IP地址和埠等屬性; 
  5、連線伺服器,用函式connect(); 
  6、收發資料,用函式send()和recv(),或者read()和write(); 
  7、關閉網路連線;


  與之對應的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、關閉網路連線;