1. 程式人生 > >Socket通信原理

Socket通信原理

阻塞 cmp unix info 調用 通信模型 lis 什麽是 等待

什麽是Socket:

Socket是在應用層和傳輸層之間的一個抽象層,是將TCP/IP層復雜的操作抽象為幾個簡單的接口。

Socket起源於UNIX

Unix的思想是:一切接文件

Socket是一種“打開--讀/寫--關閉”模式的實現。

Socket所在位置

技術分享圖片

Socket通信過程:

對於網站,通信模型是服務器與客戶端之間的通信。

兩端都會建立一個Socket對象,通過Socket對象對數據進行傳輸。

通常服務器處於一個無限循環,等待客戶端的連接。

面向連接的TCP時序圖

技術分享圖片

客戶端過程:

創建Socket-->連接服務器-->將Socket與遠程主機連接(Tips:只有TCP才有“連接”的概念,一些Socket如UDP、ICMP、ARP沒有“連接”的概念)-->發送數據-->讀取響應數據-->等待數據交換完畢-->關閉連接-->結束TCP對話。

服務端過程:

初始化Socket-->建立流式套接字 --> 與本機地址及接口進行綁定 -->通知TCP -->準備接受連接 --> 調用accept()阻塞 --> 等待來自客戶端的鏈接 --> (客戶端與服務器建立鏈接後:客戶端發送數據請求 --> 服務器接受請求並處理請求 --> 將響應數據發送給客戶端 --> 客戶端讀取數據 --> 等待數據交換完畢) --> 關閉鏈接 --> 交互結束。

TCP三次握手的Socket過程:

技術分享圖片

  • 服務器調用socket() \ bind() \ listen() 完成初始化後,調用 accept() 阻塞等待
  • 客戶端Socket對象調用connect()向服務器發送一個SYN並阻塞
  • 服務器完成了第一次握手(發送SYN、ACK應答)
  • 客戶端收到服務端發送的應答之後,從connect() 返回,再發送一個ACK給服務器;
  • 服務器Socket對象接收客戶端第三次握手ACK確認,此時服務端從accept()返回,建立鏈接
  • (解釋任然不清楚)

TCP四次揮手的Socket過程:

技術分享圖片

  • 某個應用進程調用close() 主動關閉,發送一個FIN;
  • 另一端接收到FIN後被動執行關閉,並發送ACK確認;
  • 之後被動執行關閉的應用進程調用close()關閉Socket,並也發送一個FIN;
  • 接收到這個FIN的一端向另一端ACK確認

服務端的代碼只有處理完一個客戶端請求才會去處理下一個客戶端請求,這樣服務器的處理能力很弱,而實際中服務器都需要有並發處理能力,為了達到並發處理,服務器需要fork一個新的進程或線程去處理請求。

Socket通信原理