什麼是socket套接字?

 

客戶端-服務器模型

 

互聯網已經深入我們生活的方方面面,重要性不言而喻。上世紀70年代互聯網剛發明的時候,就確定了客戶端-服務器模型,這個編程模型一直沿用到現在都沒有變過,我們在電腦上打開一個網站,在微信上聊天,打開一個app本質上都是客戶端和服務器的連接和交互。

客戶端-服務器模型的操作方式如下:

(圖片來源:極客時間)

 

  1. 客戶端需要一個服務的時候,比如需要打開一個網頁,它就向服務器發送一個請求。

  2. 服務器收到請求後,會進行適當的處理,比如從數據庫讀取客戶端需要的數據。

  3. 服務器處理好請求後,會按一定的格式返回客戶端需要的數據,然後發給客戶端一個響應。

  4. 客戶端收到服務器的響應後,會處理網頁數據,然後再顯示器上顯示出來,然後客戶端再發送請求給服務器,如此循環。

     

socket 套接字

 

客戶端和服務器是通過什麼來連接的呢?是20 世紀 80 年代加州大學伯克利分校提出來的socket套接字,也叫伯克利套接字。socket的工作模式如下圖:

 

(圖片來源:極客時間)

 

服務器socket準備工作:

  1. 初始化socket

  2. 執行bind綁定操作,將服務器的服務綁定在一個ip地址和一個特定的端口上

  3. 執行listen操作,將原先的socket轉化爲服務端的socket

  4. 執行accept操作,將進程阻塞在accept方法上,等待客戶端的連接

客戶端初始化一個socket後,可以直接調用connet方法連接服務端的socket,經過著名的TCP三次握手,客戶端和服務器建立連接,進入數據傳輸狀態。

客戶端發起write寫操作,服務器通過read接收數據,然後write到客戶端,客戶端用read接收數據,當客戶端和服務器交互完成之後,客戶端發起close操作,發送一個FIN包通知服務器關閉鏈接。

 

socket 套接字地址格式

 

客戶端和服務器建立連接的時候,需要知道對方的地址。就像快遞小哥要給你送快遞就得知道你家住那棟樓,哪個房間一樣。互聯網世界的ip地址和端口就像哪棟樓幾零幾一樣,能夠精確的找到服務器上的某個服務。

(圖片來源:極客時間)

 

我們使用socket的時候就需要對方的ip地址和端口號,socket的地址結構在程序裏的表示如下面的圖示。

sin_family表示地址的類型,IPv4的值就是AF_INET,IPv6的值就是AF_INET6,程序通過sin_family的類型就可以知道該套接字地址是哪種類型了。

in_port_t表示端口號,我們看到端口號佔16位,所以端口號的數量最大支持2的16次方,就是65536個端口,也就是0~65535的範圍。因爲每次建立連接的時候都需要知道對方的端口號,很多知名的服務就把自己的端口號固定了,叫做保留端口。這樣客戶端要連接這些服務的時候就知道用哪個端口了,不用每次再去問了,比如:ftp的21端口,ssh的22端口,telnet的23端口,http的80端口。

 

通用套接字地址格式

(圖片來源:極客時間)

 

IPv4 套接字格式地址

(圖片來源:極客時間)

 

IPv6 套接字地址格式

(圖片來源:極客時間)

 

本地套接字地址格式

(圖片來源:極客時間)

 

幾種套接字地址格式比較

(圖片來源:極客時間)

 

通用套接字地址

 

IPv4套接字格式地址表示IPv4的地址,IPv6套接字格式地址表示IPv6的地址,還有本地地址結構用於本地 socket 通信,還有一個是通用地址結構,爲什麼要有通用地址結構呢?

原來爲了方便函數的的調用,像connect,bind,accept方法都需要一個套接字地址結構的指針參數:

 

 

爲了方便起見,函數的定義就直接用通用的地址結構指針定義,然後調用的時候再傳入具體的地址結構指針,有沒有和麪向對象編程的多態特性很像?

但是ipv4地址結構的大小爲16字節,ipv6地址結構的大小爲28字節,本地地址地址結構的大小最多爲110字節,而通用地址結構的大小爲16字節。除了ipv4地址,其他地址都比通用地址結構大,那麼其他地址是如果轉換爲通用地址的呢?

仔細看一下,這裏參數傳入的是地址結構的指針哦,後面還有一個*addrlen的參數,表示地址結構的長度,所以只要取addrlen長度的數據就行了,具體的類型可以根據sin_family來確定哦。

 

總結一下

 

客戶端和服務器只能通過socket套接字連接和傳輸數據,套接字地址結構的類型通過sin_family來確定,connect,bind,accept方法中的套接字地址參數是通用的套接字地址。

 

 

 

 

 

                                                                     

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章