計算機網路之十一:套接字Socket

百聯達發表於2019-07-05

一:簡介

Socket可以作插口或者插槽,可以想象為一根網線,一頭插在客戶端,一頭插在服務端,然後進行通訊。所以在通訊之前,雙方都要建立一個Socket.

二:基於TCP協議的Socket程式函式呼叫過程

1.TCP的服務端要先監聽一個埠,一般是先呼叫bind函式,給這個Socket賦予一個IP地址和埠。

2.當服務端有了IP和埠號,就可以呼叫listen函式進行監聽。在TCP的狀態圖裡面,有一個listen狀態,當呼叫這個函式之後,服務端就進入這個狀態,

這個時候客戶端客戶端就可以發起連線了。

3.在核心中,為每個Socket維護兩個佇列。一個是已經建立了連線的佇列,這時連線三次握手已經完畢,處於established狀態;一個是還沒有完全建立連線

的佇列,這個時候三次握手還沒完成,處於syn_rcvd的狀態。

4.服務端呼叫accept函式,拿出一個已經完成的連線進行處理。如果還沒有完成,就要等待。

5.在服務端等待的時候,客戶端可以透過connect函式發起連線。先在引數中指明要連線的IP地址和埠號,然後開始發起三次握手。核心會給客戶端分配一個

臨時的埠。一旦握手成功,服務端的accept就會返回另一個Socket.

6.連線建立成功之後,雙方開始透過read和write函式來讀寫資料,就像往一個檔案流裡面寫東西一樣。

Socket在Linux中是以檔案的形式存在的,除此之外,還存在檔案描述符,寫入和讀出,也是透過檔案描述符。每一個程式都有一個資料結構task_struct,裡面指向

一個檔案描述符陣列,來列出這個程式開啟的所有檔案的檔案描述符。檔案描述符是一個整數,就是這個陣列的下標。


三:基於UDP協議的Socket程式函式呼叫過程

1.UDP是沒有連線的,所以不需要三次握手,也就不需要呼叫listen和connect,但是,UDP的互動仍然需要IP和埠號,因而也需要bind

2.UDP是沒有維護連線狀態的,因而不需要每對連線建立一組Socket,而是隻要有一個Socket,就能夠和多個客戶端通訊。因為沒有連線狀態,每次通訊的時候,都調

用sendto和recffrom,都可以傳入IP地址和埠。

四:Socket多程式程式設計

TCP連線數是受限的,首先Socket都是檔案,所以首先要透過ulimit配置檔案描述符的數目;另一個限制是記憶體。

多程式模式相當於設定一個代理,監聽請求,一旦建立了一個連線,就會有一個已連線Socket,這時可以建立一個子程式,然後將基於已連線Socket的互動交給子程式做。

五:Socket多執行緒程式設計

相對於程式來講,執行緒要輕量級的多,新的執行緒也可以透過已連線Socket處理請求,從而達到併發處理的目的。

六:IO多路複用,一個執行緒維護多個Socket

基於程式或者執行緒模型的,其實還是有問題的。新到來一個TCP連線,就需要分配一個程式或者執行緒。C10K,它的意思是一臺機器要維護1萬個連線,就要建立1萬個程式或者

執行緒,那麼作業系統是無法承受的。

由於Socket是檔案描述符,因而某個執行緒盯的所有的Socket,都放在一個檔案描述符fd_set中,然後呼叫select函式來監聽檔案描述符集合是否有變化,一旦有變化,就依次檢視

每個檔案描述。那些發生變化的檔案描述符在fd_set對應的位都設為1,表示Socket可讀或者可寫,從而可以進行讀寫操作,然後再呼叫select,接著看下一輪的變化。


七:IO多路複用,epoll模式

epoll它在核心中的實現不是透過輪詢方式,而是透過註冊callback函式的方式,當某個檔案描述發生變化時,就會主動通知。這種通知方式使得監聽的Socket資料增加的時候,效率

不會大幅度降低,能夠同時監聽的Socket的數目也非常多。epoll被稱為解決C10K問題的利器


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2649629/,如需轉載,請註明出處,否則將追究法律責任。

相關文章