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則用於跨機器之間的通訊。

相關文章
相關標籤/搜索