经过这段时间对网络编程的学习,发现套接字的类型其实蛮多的,不是仅有
TCP 和
UDP 那么简单,本文简单理一理socket的类型。
socket系统调用
通过创建socket的系统调用接口就能看到内核对socket的分类。
int socket(int domain, int type, int protocol);
参数
通过domain 、type 和protocol 这三个参数可以唯一标识一种socket 。因此可以对socket做三个维度的分类。
domain
该参数指定协议族。取值总共有以下几种:
PF_LOCAL Host-internal protocols, formerly called PF_UNIX,
PF_UNIX Host-internal protocols, deprecated, use PF_LOCAL,
PF_INET Internet version 4 protocols,
PF_ROUTE Internal Routing protocol,
PF_KEY Internal key-management function,
PF_INET6 Internet version 6 protocols,
PF_SYSTEM System domain,
PF_NDRV Raw access to network device,
PF_VSOCK VM Sockets protocols
常用的有三种:
PF_INET :ipv4类型的socket,使用ipv4网络地址+端口号标识socket的地址,用于主机间通信。PF_INET6 :ipv6类型的socket,使用ipv6网络地址+端口号标识socket的地址,用于主机间通信。PF_LOCAL :本地socket,使用某个文件的绝对路径名标识socket地址,用于同一主机的不同进程间,是一种IPC 手段(相当于两个进程通过共享一个文件实现通信)。该socket使用的是简化版的网络协议栈,所以性能较高。
协议族确定了,地址族也就确定了。 构造socket的地址时,要指定地址族(AF_xxx ),AF_xxx 和PF_xxx 是对应的。 用PF_xxx 这样的值来创建socket ,用AF_xxx 这样的值来构造socket 的地址。
type
该参数指定通信的语义。取值共有以下三种:
SOCK_STREAM
SOCK_DGRAM
SOCK_RAW
SOCK_STREAM :字节流类型,提供有序、可靠、有连接、基于字节流的通信机制。SOCK_DGRAM :数据报类型,提供最大长度固定、无连接、不可靠的通信机制。SOCK_RAW :原始socket类型,提供对内部网络协议和接口的访问,仅对超级用户可用。原始套接字可以不经过网络协议栈的处理,直接访问网卡,把用户进程构造的消息发出去。
protocol
该参数指定socket通信时要使用的特定协议。 当前面的两个参数不能唯一标识一个具体的网络通信协议时,就会使用protocol 指定具体的协议。
返回值
该函数会返回一个socket描述符,失败时返回-1 . 在Linux里面,万物皆文件,socket也不例外。
socket系统调用 <----> open系统调用 socket描述符 <----> 文件描述符 通过socket发送数据 <----> 文件写 通过socket接收数据 <----> 文件读
总结
domain 指定了协议族。也指定了地址族,即socket的地址类型。type 指定了通信语义。protocol 指定了具体的通信协议。
|