1. 程式人生 > >Socket通訊中AF_INET 和 AF_UNIX域的區別

Socket通訊中AF_INET 和 AF_UNIX域的區別

轉載:http://blog.csdn.net/sandware/article/details/40923491

1.  AF_INET域socket通訊過程

AF_INET域通訊過程

典型的TCP/IP四層模型的通訊過程。

傳送方、接收方依賴IP:Port來標識,即將本地的socket繫結到對應的IP埠上,傳送資料時,指定對方的IP埠,經過Internet,可以根據此IP埠最終找到接收方;接收資料時,可以從資料包中獲取到傳送方的IP埠。

傳送方通過系統呼叫send()將原始資料傳送到作業系統核心緩衝區中。核心緩衝區從上到下依次經過TCP層、IP層、鏈路層的編碼,分別新增對應的頭部資訊,經過網絡卡將一個數據包傳送到網路中。經過網路路由到接收方的網絡卡。網絡卡通過系統中斷將資料包通知到接收方的作業系統,再沿著傳送方編碼的反方向進行解碼,即依次經過鏈路層、IP層、TCP層去除頭部、檢查校驗等,最終將原始資料上報到接收方程序。

2.  AF_UNIX域socket通訊過程 

典型的本地IPC,類似於管道,依賴路徑名標識傳送方和接收方。即傳送資料時,指定接收方繫結的路徑名,作業系統根據該路徑名可以直接找到對應的接收方,並將原始資料直接拷貝到接收方的核心緩衝區中,並上報給接收方程序進行處理。同樣的接收方可以從收到的資料包中獲取到傳送方的路徑名,並通過此路徑名向其傳送資料。

 AF_UNIX域通訊過程

3.  相同點

作業系統提供的介面socket(),bind(),connect(),accept(),send(),recv(),以及用來對其進行多路複用事件檢測的select(),poll(),epoll()都是完全相同的。收發資料的過程中,上層應用感知不到底層的差別。 

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

相關推薦

Socket通訊AF_INET AF_UNIX區別

轉載:http://blog.csdn.net/sandware/article/details/40923491 1.  AF_INET域socket通訊過程 典型的TCP/IP四層模型的通訊過程。 傳送方、接收方依賴IP:Port來標識,即將本地的socket繫結到對應的IP埠上,傳送資料時

Socket通信AF_INET AF_UNIX區別

con cep 即將 blog 傳遞 http unix 機器 ext 轉載:http://blog.csdn.net/sandware/article/details/40923491 1. AF_INET域socket通信過程 典型的TCP/IP四層模型的通信

Socket通訊粘包分包問題的介紹解決(C#)

最近在做Unity區域網時,用到了Socket通訊基於TCP協議,然後使用非同步方式,主要用到了BeginAccept和BeginReceive方法 然而就可以實現非同步通訊,然而還是要解決粘包和分包問題 這裡我先說明一下什麼是分包和粘包,TCP提供面向連線的、可靠的資料流傳輸,所以當我們傳

socket通訊select函式的使用詳解

---------------------------面向連線      #include <winsock.h>      #include <stdio.h>      #define PORT       5150      #define MSGSIZE     1024   

JavaScriptvar let的區別,四個概念變數提升,作用,重複宣告,暫時死區以及從生命週期去看它

前言 今天無意當中遇到了js中的變數宣告,發現除了var居然還有let宣告方法,比較新奇,特地記錄下來它們兩者的區別!絕對能讓你理解清楚,PS 後面有重頭戲 思路 主要從四個角度來講述它們的區別 變數提升 作用域 重複宣告 暫時死區 變數提

C++使用Socket通訊包定義讀取方法

由於TCP/IP協議中,不能攜帶我們資料的長度,也就是說如果我們發的資料為變長度,接收端收到若干字元後就不知道是不是傳送完成了,還是要繼續等待,一般來說,VC中的解決方案為傳送端和接收端 定義一組共享的 通訊協議包,傳送按照通用介面將這些結構體包資料傳送出去,接收者判斷每

JSisPrototypeOf hasOwnProperty 的區別

另一個 strong 是否 指定 不同 名稱 功能 成員 eof 1、isPrototypeOf isPrototypeOf是用來判斷指定對象object1是否存在於另一個對象object2的原型鏈中,是則返回true,否則返回false。 格式如下: object1.is

Pythonsort()sorted()的區別

-s 可變對象 傳遞 內置函數 ict pan 16px nbsp lin 1、sort()是可變對象(字典)的方法,無參數,無返回值, sort()會改變可變對象,因此無需返回值。例如: list: 1 >>> a = [4,3,7,8] 2 >

Hibernateget()load()的區別

factory all htm on() 被調用 容易 transacti rip con Hibernate中根據Id單條查詢獲取對象的方式有兩種,分別是get()和load(),來看一下這兩種方式的區別。 1. get() 使用get()來根據ID進行單條查詢:

Sql語句INexists的區別及應用

應用場景 將不 集中 pre 代碼 根據 gif 效率 .cn   表展示     首先,查詢中涉及到的兩個表,一個user和一個order表,具體表的內容如下:     user表:          order表:        in     確定給定的值是否與子查

java棧的區別

mem 線程 所有 生成 werror 空間 調用 訪問 指向 01,各司其職;         棧內存用來存儲局部變量和方法的調用,         而堆內存用來存儲java中的對象,無論是成員變量,局部變量,還是類變量         他們指向的對象都存儲在堆內存中。

jsundefinednull的區別

常常 html exist tex 輸出 output 為什麽 hive 存在 轉自:http://www.cnblogs.com/eastday/archive/2010/03/03/1677324.html 在JavaScript中存在這樣兩種原始類型:Null與Und

PHPempty()isset()的區別

tom 常量 def -1 最大 解析 如果 sse add 先說一下他們的共同點: 都可以判定一個變量是否為空; 都返回boolean類型,即true或false。 下面具體說一下他們用法之間的區別: isset()用來檢測變量是否設置,只能用於變量,因為

jseval()$.parseJSON()的區別

16px 異常 comment 而不是 str on() ajax 鏈接 強制 之前自己一直對ajax不是特別的熟悉,所以一般都很少用這個去寫功能,但是最近這個項目中用到了,用ajax異步傳數據,json傳數據這個時候就需要去解析傳過來的數據了,eval()和$.parse

cssemrem的區別

子元素 字體大小 響應式布局 布局 height root html中 頁面 長度單位 在css中單位長度用的最多的是px、em、rem,這三個的區別是:1.px是固定的像素,一旦設置了就無法因為適應頁面大小而改變。2.em和rem相對於px更具有靈活性,他們是相對長度單位

C++typenameclass的區別

type .get true 能夠 class .... ray pla 依賴 在c++Template中很多地方都用到了typename與class這兩個關鍵字,而且好像可以替換,是不是這兩個關鍵字完全一樣呢? 相信學習C++的人對class這個關鍵字都非常明白,clas

Jscallercallee的區別

存在 ons var nbsp fun 區別 test 函數對象 返回 1 :caller 返回一個調用當前函數的引用 如果是由頂層調用的話 則返回null (舉個栗子哈 caller給你打電話的人 誰給你打電話了 誰調用了你 很顯然是下面a函數的執行 只有在打電話的時候

JavascriptinnerHTMLinnerText的區別

utf meta charset 測試 第一個 class utf-8 html標簽 技術分享 innerHTML:獲取的是從對象的起始位置到終止位置的全部內容,包括HTML標簽 innerText:獲取的是起始位置到終止位置的內容,但是會將HTML標簽去掉 下面寫一段代碼

PHPincluderequire的區別詳解

for in repl 這不 語句 沒有 16px targe size something 1、概要    require()語句的性能與include()相類似,都是包括並運行指定文件。不同之處在於:對include()語句來說,在執行文件時每次都要進行讀取和評估;

C++編程const#define的區別

程序 存在 pan best color 普通 分配 一次 def (1) 編譯器處理方式不同  define宏是在預處理階段展開。  const常量是編譯運行階段使用。(2) 類型和安全檢查不同  define宏沒有類型,不做任何類型檢查,僅僅是展開。  const常量有