IPC之套接字

叫我情感專家發表於2019-06-28

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)圖示:

 





相關文章