TCP與UDP在socket程式設計中的區別
一、TCP與UDP的區別
基於連線與無連線
對系統資源的要求(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、關閉網路連線;