套接字協議及其數據傳輸特性
1. 關於協議(Protocol)
計算機間對話必備通信規則。
2. 創建套接字
#include <sys/socket>
int socket(int domain, int type, int protocol);
-domain:套接字中使用的協議族(ProtocolFamily)信息;
-type:套接字數據傳輸類型信息;
-protocol:計算機間通信中使用的協議信息;
3. 協議族(Protocol Family)
- PF_INET ipv4
- PF_INET6 ipv6
- PF_LOCAL 本地通信的UNIX協議族
4. 套接字類型(Type)
套接字類型指的是套接字的數據傳輸方式。Socket函數第一個參數PF_INET協議族中也存在多種數據傳輸方式。
套接字類型1:面向連接的套接字(SOCK_STREAM)
- 傳輸過程中數據不會消失;
- 按序傳輸數據;
- 傳輸的數據不存在數據邊界(Boundary)。
收發數據的套接字內部有緩衝(buffer),即字節數組。通過套接字傳輸的數據將保存到該數組,因此,收到數據並不意味着馬上調用read函數,只要不超過數組容量,則有可能在數據填充滿後通過1次函數調用讀取全部數據,也有可能分成多次read函數調用讀取。
讀取速度較慢時,緩衝有可能被填滿,此時套接字無法再接收數據,但即使這樣也不會發生數據丟失,因爲傳輸端套接字將停止傳輸。
面向連接的套接字:可靠的、按序傳遞的、基於字節的面向連接的數據傳輸方式。
套接字類型2:面向消息的套接字(SOCK_DGRAM)
面向消息的套接字比面向連接的套接字具有更快的傳輸速度,但無法避免數據丟失或損毀;另外,每次傳輸的數據大小具有一定的限制,並存在數據邊界,存在數據邊界意味着接收數據的次數應和傳輸次數相同。
面向消息的套接字:不可靠的、不按序傳遞的、以數據的高速傳輸爲目的的套接字。
5. 協議的最終選擇
傳遞前兩個參數即可創建所需套接字,所以大部分情況下可以向第三個採納數傳遞0,除非遇到以下這種情況:
“同一協議族中存在多個數據傳輸方式相同的協議”(傳輸方式相同,但協議不同)
int tcp_socket = socket(PF_INET, SOCK_STREAM,IPPROTO_TCP);
int udp_socket = socket(PF_INET, SOCK_DGRAM,IPPROTO_UDP);