2.1 套接字协议及其数据传输特性
协议是计算机间对话必备的通信原则,是为了完成数据交换而定好的约定。
创建套接字
#include<sys/socket.h>
int socket(int domain, int type, int protocol)
//成功时返回文件描述符,失败返回-1
- domain 套接字中使用的协议族信息
- 套接字数据传输类型
- 计算机通信中使用的协议信息
第一个参数指的是协议分类信息,也称为协议族,是一类协议,其中包含很多协议。一般使用的是PF_INET。
而套接字中最终采用的协议(具体的)是通过第三个参数指定,也就是某一类协议(第一个参数)中的某个具体协议。
套接字类型
第三个参数套接字类型指的是套接字的数据传输方式,使用第一个参数决定了协议族信息,但并不能同时决定数据传输的方式,以为协议族中也存在多种数据传输方式。
两种具有代表性的数据传输方式:面向连接的套接字(SOCK_STREAM)、面向消息的套接字(SOCK_DGRAM)。
面向连接的套接字
向socket函数第二个参数传递SOCK_STREAM,将创建面向连接的套接字。
面向连接的套接字的特点:
- 传输过程中数据不会丢失。
- 按序传输数据。
- 传输的数据不存在数据边界。
收发数据的套接字内部有缓冲区,也就是字节数组,数据会先保存在该数组中。收到数据并不意味着马上调用read函数,有可能等数组填满,调用一次read函数读取全部数据,也有可能调用多次。
面向消息的套接字
socket函数第二个参数传递SOCK_DGRAM,则创建面向消息的套接字。
它的特点:
- 强调快速传输而非传输顺序。
- 传输的数据可能丢失也可能损毁。
- 传输的数据有数据边界。
- 限制每次传输的数据大小。
协议的最终选择
一般情况下有了第一个参数和第二个参数就可以确定具体要使用的协议,因为一个协议族中不同的协议有不同的数据传输方式(套接字),那么仅靠数据传输方式就可以确定指定的协议族中某个具体协议。此时设置第三个参数为0。
但是当遇到同一个协议族中存在多个数据传输方式相同的协议。即数据传输方式相同,但是协议不同,此时就需要第三个参数指定具体协议信息。