不管是做哪一种开发,都离不开网络编程,网络编程又经常会涉及套接字(socket)。Socket最初由加州大学伯克利分校开发,主要用于实现4.2BSD上的进程间通信。套接字主要有2种类型:Unix domain socket和IP socket。那么它们有哪些不同点呢?
Unix domain socket
Unix domain socket,也叫IPC socket(inter-precess communication socket,也就是进程间通信套接字),用于同一台主机上的不同进程间交换数据,是Posix系统的标准组件。可以传输字节流(byte stream,SOCK_STREAM,TCP)或者数据报(datagram,SOCK_DGRAM,UDP).除了传输数据以外,还可以使用Unix domain socket传输文件描述符(file descriptor)。
IP socket
IP socket要利用主机的传输层(tcp),可以用于同一台主机上不同进程间的通信,也可以用于网络上不同主机间的通信。
Unix domain socket vs IP socket
先来看一个使用案例,配置php-fpm与Nginx交互的socket:
fastcgi_pass 127.0.0.1:9000
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock
这个案例中,运行在同一台机器上的php和Nginx需要通信,有2种实现方式:第一种是ip socket,通过本机回环地址127.0.0.1加端口实现;第二种是通过unix domain socket实现。哪一种效率更高呢?
基于localhost的ip socket需要实现跨网络主机通讯的全部环节,包括建立socket连接,ACk开销,tcp流控,封装/解封,路由。在这个过程中还会有2个context switch,因为使用网络层传输数据需要调用system call,而调用system call会产生中断,导致context switch的;另外一个进程接受到来自网络层的连接请求,也会产生系统中断,导致context switch。以上过程导致2个context switch的开销,外加其它各种开销(overhead)。
网友评论