學習記錄|Socket程式設計
1. AF_INET域socket通訊過程
典型的TCP/IP四層模型的通訊過程。
傳送方、接收方依賴IP:Port來標識,即將本地的socket繫結到對應的IP埠上,傳送資料時,指定對方的IP埠,經過Internet,可以根據此IP埠最終找到接收方;接收資料時,可以從資料包中獲取到傳送方的IP埠。
傳送方通過系統呼叫send()將原始資料傳送到作業系統核心緩衝區中。核心緩衝區從上到下依次經過TCP層、IP層、鏈路層的編碼,分別新增對應的頭部資訊,經過網路卡將一個資料包傳送到網路中。經過網路路由到接收方的網路卡。網路卡通過系統中斷將資料包通知到接收方的作業系統,再沿著傳送方編碼的反方向進行解碼,即依次經過鏈路層、IP層、TCP層去除頭部、檢查校驗等,最終將原始資料上報到接收方程式。
2. AF_UNIX域socket通訊過程
典型的本地IPC,類似於管道,依賴路徑名標識傳送方和接收方。即傳送資料時,指定接收方繫結的路徑名,作業系統根據該路徑名可以直接找到對應的接收方,並將原始資料直接拷貝到接收方的核心緩衝區中,並上報給接收方程式進行處理。同樣的接收方可以從收到的資料包中獲取到傳送方的路徑名,並通過此路徑名向其傳送資料。
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學習記錄
- Java學習筆記--網路程式設計SocketJava筆記程式設計
- 程式設計學習打卡記錄貼程式設計
- socket.io學習記錄
- javascript 學習記錄 -- 程式設計題集合JavaScript程式設計
- Java Tcp協議socket程式設計學習JavaTCP協議程式設計
- JAVA程式設計學習記錄(JavaWeb-Html)Java程式設計WebHTML
- JAVA程式設計學習記錄(安裝Java)Java程式設計
- 學程式設計的記錄程式設計
- JAVA程式設計學習記錄(API常用類(二))Java程式設計API
- JAVA程式設計學習記錄(File類檔案操作)Java程式設計
- python網路程式設計學習筆記(3):socket網路伺服器Python程式設計筆記伺服器
- SOCKET程式設計程式設計
- Linux學習/TCP程式設計學習筆記LinuxTCP程式設計筆記
- Linux socket程式設計學習初步(4)--伺服器端多程式Linux程式設計伺服器
- 網路程式設計學習筆記程式設計筆記
- 系統程式設計學習筆記程式設計筆記
- 學習VIORB程式碼記錄ORB
- 計網Quizzes學習記錄UI
- socket程式設計(1)程式設計
- Java Socket程式設計Java程式設計
- Java Socket程式設計Java程式設計
- WCF、Socket程式設計程式設計
- Socket程式設計(九)程式設計
- Socket程式設計模型程式設計模型
- 三步學會Java Socket程式設計Java程式設計
- 四. 文字程式設計--Windows程式設計課程學習筆記程式設計Windows筆記
- Golang 學習筆記——tun/tap 程式設計Golang筆記程式設計
- 結構化程式設計--學習筆記程式設計筆記
- Javascript高階程式設計 學習筆記JavaScript程式設計筆記
- ROS串列埠程式設計學習筆記ROS串列埠程式設計筆記
- spark學習筆記--進階程式設計Spark筆記程式設計
- Linux Shell 程式設計學習筆記Linux程式設計筆記
- 《Windows 程式設計》學習筆記(五) (轉)Windows程式設計筆記
- 《Windows 程式設計》學習筆記(四) (轉)Windows程式設計筆記
- 《Windows 程式設計》學習筆記(三) (轉)Windows程式設計筆記
- 程式設計學習MarkDown學習程式設計
- Python socket程式設計Python程式設計