AF_UNIX和AF_INET

family参数表明地址家族,比较经常使用的为AF_INET或AF_UNIX。AF_UNIX用于同一台机器上的进程间通讯,AF_INET对于IPV4协议的TCP和UDP 。python

type参数表明套接字类型,SOCK_STREAM(流套接字)或者SOCK_DGRAM(数据报文套接字)。网络

其中AF_INET类型有关的例子很是多,但AF_UNIX的少见,因此给出一个AF_UNIX简单的例子,并经过select实现非阻塞socket。socket

Server端:ide

<pre class="python" name="code">import os  
import socket  
import select  
import sys  
  
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)  
path = './tt.d'  
if os.path.exists(path):  
   os.unlink(path)  
sock.bind(path)  
sock.listen(5)  
  
infds, outfds, errfds = select.select([sock,],[],[],5)  
if len(infds) != 0:  
   con,addr = sock.accept()  
   print con.recv(1024)  
   con.close()  
   sock.close()  
print '5 seconds later no data coming'  
Server

 

Client端:编码

</pre><pre class="python" name="code">import socket    
  
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)    
sock.connect('./tt.d')    
sock.send('Hello Socket')    
sock.close()  
Client

 

 

1.  AF_INET域socket通讯过程

AF_INET域通讯过程

典型的TCP/IP四层模型的通讯过程。spa

 

发送方、接收方依赖IP:Port来标识,即将本地的socket绑定到对应的IP端口上,发送数据时,指定对方的IP端口,通过Internet,能够根据此IP端口最终找到接收方;接收数据时,能够从数据包中获取到发送方的IP端口。操作系统

发送方经过系统调用send()将原始数据发送到操做系统内核缓冲区中。内核缓冲区从上到下依次通过TCP层、IP层、链路层的编码,分别添加对应的头部信息,通过网卡将一个数据包发送到网络中。通过网络路由到接收方的网卡。网卡经过系统中断将数据包通知到接收方的操做系统,再沿着发送方编码的反方向进行解码,即依次通过链路层、IP层、TCP层去除头部、检查校验等,最终将原始数据上报到接收方进程。3d

2.  AF_UNIX域socket通讯过程 

典型的本地IPC,相似于管道,依赖路径名标识发送方和接收方。即发送数据时,指定接收方绑定的路径名,操做系统根据该路径名能够直接找到对应的接收方,并将原始数据直接拷贝到接收方的内核缓冲区中,并上报给接收方进程进行处理。一样的接收方能够从收到的数据包中获取到发送方的路径名,并经过此路径名向其发送数据。code

 AF_UNIX域通讯过程

3.  相同点

操做系统提供的接口socket(),bind(),connect(),accept(),send(),recv(),以及用来对其进行多路复用事件检测的select(),poll(),epoll()都是彻底相同的。收发数据的过程当中,上层应用感知不到底层的差异。blog

4.  不一样点

1 创建socket传递的地址域,及bind()的地址结构稍有区别:

  socket() 分别传递不一样的域AF_INET和AF_UNIX

  bind()的地址结构分别为sockaddr_in(制定IP端口)和sockaddr_un(指定路径名)

2 AF_INET需通过多个协议层的编解码,消耗系统cpu,而且数据传输须要通过网卡,受到网卡带宽的限制。AF_UNIX数据到达内核缓冲区后,由内核根据指定路径名找到接收方socket对应的内核缓冲区,直接将数据拷贝过去,不通过协议层编解码,节省系统cpu,而且不通过网卡,所以不受网卡带宽的限制。

3 AF_UNIX的传输速率远远大于AF_INET

3 AF_INET不只能够用做本机的跨进程通讯,一样的能够用于不一样机器之间的通讯,其就是为了在不一样机器之间进行网络互联传递数据而生。而AF_UNIX则只能用于本机内进程之间的通讯。 

5.  使用场景

AF_UNIX因为其对系统cpu的较少消耗,不受限于网卡带宽,及高效的传递速率,本机通讯则首选AF_UNIX域。不用多说,AF_INET则用于跨机器之间的通讯。

相关文章
相关标签/搜索