IPC(Inter-Process Communication,程式間通訊)實現方式
1)管道:
- 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程式之間使用(程式的親緣關係通常是指父子程式關係)
2)有名管道(FIFO):
- 有名管道也是半雙工的通訊方式,但是允許在沒有親緣關係的程式之間使用,管道是先進先出的通訊方式
3)訊號量:
- 訊號量是一個計數器,可以用來控制多個程式對共享資源的訪問
- 它常作為一種鎖機制,防止某程式正在訪問共享資源時,其他程式也訪問該資源
- 因此,主要作為程式間以及同一程式內不同執行緒之間的同步手段
4)訊息佇列:
- 訊息佇列是有訊息的連結串列,存放在核心中,並由訊息佇列識別符號標識
- 訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點
5)訊號 ( Sinal ) :
- 訊號是一種比較複雜的通訊方式,用於通知接收程式某個事件已經發生
6)共享記憶體( Shared Memory) :
- 共享記憶體就是對映一段能被其他程式所訪問的記憶體,這段共享記憶體由一個程式建立,但多個程式都可以訪問
- 共享記憶體是最快的IPC實現機制,它是針對其它程式間通訊方式執行效率低而專門設計的
- 往往與其他通訊機制(如訊號量)配合使用,來實現程式間的同步和通訊
7)套接字( Socket ) :
- 套接字也是一種程式間通訊機制,與其他通訊機制不同的是,它可用於不同機器間的程式通訊
套接字通訊
1、基本介紹
1)網路上的兩個程式通過一個雙向的通訊連線實現資料交換,這個連線的一端就是一個套接字
2)其目的就是:允許位於同一主機或不同主機上的不同程式之間進行通訊,以實現資料交換
3)套接字本質是通過程式設計介面(API)對TCP/IP的封裝,TCP/IP也要提供可供程式設計師做網路開發所用的介面,這就是 Socket API
4)HTTP協議可以理解為轎車,其提供了封裝或者顯示資料的具體形式;Socket可以理解為發動機,提供了網路通訊的能力
5)程式使用埠需要向核心申請註冊,核心通過【套接字、埠】標記程式
6)相關連結:https://www.linuxprobe.com/socket-agreement-overview.html?comefrom=http://blogread.cn/news/
7)相關圖示:
2、套接字型別
1)根據其使用的傳輸層協議不同:
- SOCK_STREAM:TCP套接字,使用TCP埠
- SOCK_DGRAM:UDP套接字,使用UDP埠
- SOCK_RAM:RAM套接字,裸套接字,不使用TCP埠或UDP埠,直接將IP報文封裝後傳輸給目標主機
2)根據其使用的地址不同,可分為多個 Socket Domain:
- AF_INET:使用IPV4地址,AF(Address Family)
- AF_INET6 :使用IPV6地址
- AF_UNIX:同一主機上的不同程式間進行通訊時使用此類,效率更高,不佔用TCP/IP協議棧,不需要解封裝
3、深入瞭解
1)對於TCP、UDP套接字來說,一個IP地址擁有65536(0~65535)個埠(TCP協議頭部使用16位來儲存埠號)
2)0埠是保留埠,無論是TCP還是UDP都是不能使用的,可以監聽於0埠,但核心會在bind時,指定一個隨機可用埠來監聽
3)多個客戶端通過某一隨機埠與服務端的指定監聽埠建立套接字,服務端僅需使用一個套接字即可,但是連線需要用檔案描述符來標識,雖然不受套接字數量的限制,但會受到檔案描述符數量的限制
4)此外,如果服務端以反向代理方式工作時,雖然其僅需使用一個套接字就可以與多個客戶端建立連線,但是其還要與後端節點建立連線,如果通過TCP、UDP套接字與後端節點通訊,則會受到套接字的數量限制
5)相關連結
- http://www.360doc.com/content/14/0606/16/3300331_384326124.shtml
- https://mp.weixin.qq.com/s/vaURXrvafNBzBxmEiuaGOQ
4、SocketAPI(封裝了核心中的套接字通訊相關的系統呼叫)
1)介紹:
- socket():建立一個套接字
- bind():將套接字和程式繫結在一起(即使用)
- listen():監聽在套接字上
- accept():接收請求
- connect():請求建立連線(一般是客戶端請求)
- write():傳送資料(向此套接字寫入資料也就會傳送至對端套接字)
- read():接收資料
- close():請求關閉連線
2)圖示: