【計算機網絡】一篇文章快速瞭解Socket

目錄

一、socket簡介

二、socket通信流程

三、socket和http

3.1 socket和http的區別

3.2 socket和http的應用場景有哪些


一、socket簡介

端口(port)是伴隨着傳輸層誕生的概念。它可以將網絡層的IP通信分送到各個通信通道。UDP協議和TCP協議儘管在工作方式上有很大的不同,但它們都建立了從一個端口到另一個端口的通信。

隨着我們進入傳輸層,我們也可以調用操作系統中的API,來構建socket(套接字)

 

Socket是操作系統提供的一個編程接口,它用來代表某個網絡通信。應用程序通過socket來調用系統內核中處理網絡協議的模塊,而這些內核模塊會負責具體的網絡協議的實施。這樣,我們可以讓內核來接收網絡協議的細節,而我們只需要提供所要傳輸的內容就可以了,內核會幫我們控制格式,並進一步向底層封裝。

 

Socket可以看成在兩個程序進行通訊連接中的一個端點,一個程序將一段信息寫入Socket中,該Socket將這段信息發送給另外一個Socket中,使這段信息能傳送到其他程序中。例如服務器和客戶端通過socket進行交互。服務器需要綁定在本機的某個端口號上,客戶端需要聲明自己連接哪個地址的哪個端口,這樣服務器和客戶端就能連接了。

 

生成套接字,主要有3個參數:通信的目的IP地址使用的傳輸層協議(TCPUDP)使用的端口號。Socket原意是“插座”。通過將這3個參數結合起來,與一個“插座”Socket綁定,應用層就可以和傳輸 層通過套接字接口,區分來自不同應用程序進程或網絡連接的通信,實現數據傳輸的併發服務。

 

因此,在實際應用中,我們並不需要知道具體怎麼構成一個UDP包,而只需要提供相關信息(IP地址,端口號,所要傳輸的信息等)來創建socket,然後socket就會藉助操作系統內核在傳輸之前會根據我們提供的相關信息構成一個合格的UDP包(以及下層的包和幀)。

 

二、socket通信流程

Host A上的程序A將一段信息寫入Socket中,Socket的內容被Host A的網絡管理軟件訪問,並將這段信息通過Host A的網絡接口卡發送到Host B,Host B的網絡接口卡接收到這段信息後,傳送給Host B的網絡管理軟件,網絡管理軟件將這段信息保存在Host B的Socket中,然後程序B才能在Socket中閱讀這段信息。

要通過互聯網進行通信,至少需要一對套接字,一個套接字運行客戶機端,稱之爲ClientSocket,另一個套接字運行服務器端,稱之爲serverSocket。     

根據連接啓動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分爲三個步驟:服務器監聽客戶端請求連接確認。     

  • 服務器監聽:是服務器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網絡狀態。
  • 客戶端請求:是指由客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。爲此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然後就向服務器端套接字提出連接請求。
  • 連接確認:是指當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求,它就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客 戶端,一旦客戶端確認了此描述,連接就建立好了。而服務器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連接請求。

socket通信步驟:

  1. 服務器根據地址類型(ipv4,ipv6)、socket類型、協議類型(UDP/TCP)來創建socket
  2. 服務器爲socket綁定ip地址和端口號
  3. 服務器socket監聽端口號請求,隨時準備接收客戶端發來的連接,這時候服務器的socket並沒有被打開
  4. 客戶端創建socket
  5. 客戶端打開socket,根據服務器ip地址和端口號使用connexct()方法試圖連接服務器socket
  6. 服務器socket接收到客戶端socket請求,被動打開,開始接收客戶端請求,直到客戶端返回連接信息。這時候服務器socket進入阻塞狀態,所謂阻塞即accept()方法一直到客戶端返回連接信息後才返回,開始接收下一個客戶端連接請求
  7. 客戶端連接成功,向服務器發送連接狀態信息
  8. 服務器accept()方法返回,連接成功
  9. 客戶端send()方法向socket寫入信息
  10. 服務器recv()方法讀取信息
  11. 客戶端關閉
  12. 服務器端關閉

由上面的過程我們可以發現,socket就是對TCP/IP協議的封裝和應用。在TCP/IP協議中,TCP協議通過三次握手建立一個可靠的連接。

  1. 第一次握手:客戶端嘗試連接服務器,向服務器發送syn包(同步序列編號Synchronize Sequence Numbers),syn=j,客戶端進入SYN_SEND狀態等待服務器確認。
  2. 第二次握手:服務器接收客戶端syn包並確認(ack=j+1),同時向客戶端發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態。
  3. 第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。

服務器socket與客戶端socket建立連接的部分其實就是“三次握手”。

 

三、sockethttp

3.1 sockethttp的區別

socket連接:

socket不屬於協議範疇,而是一個調用接口(API),是對TCP/IP協議的封裝。實現服務器與客戶端之間的物理連接,並進行數據傳輸。Socket處於網絡協議的傳輸層,主要有TCP/UDP兩個協議(當然也有TCP/IP協議族中其他的協議)。

socket連接是長連接,理論上客戶端和服務器端一旦建立起連接將不會主動斷掉;但是由於各種環境因素可能會使連接斷開,比如:服務器端或客戶端主機宕機了、網絡故障,或者兩者之間長時間沒有數據傳輸,網絡防火牆可能會斷開該連接以釋放網絡資源。所以當一個socket連接中沒有數據的傳輸,那麼爲了維持連接需要發送心跳消息。

socket傳輸的數據可自定義,爲字節級,數據量小,可以加密,數據安全性高,適合Client/Server之間信息實時交互。

 

http連接:

HTTP是基於TCP/IP協議的應用層協議,定義的是傳輸數據的內容的規範。

HTTP是基於請求-響應形式並且是短連接,即客戶端向服務器端發送一次請求,服務器端響應後連接即會斷掉。

HTTP是無狀態的協議,針對其無狀態特性,在實際應用中又需要有狀態的形式,因此一般會通過session/cookie技術來解決此問題。

HTTP的傳輸速度慢,數據包大,數據傳輸安全性差,如實現實時交互,服務器性能壓力大。

 

3.2 sockethttp的應用場景有哪些

socket一般用於比較即時的通信和實時性較高的情況,比如推送,聊天,保持心跳長連接等;

http一般用於實時性要求不那麼高的情況,比如信息反饋,圖片上傳,獲取新聞信息等。

 

某些場合使用http不使用socket的原因是socket一旦連接上了,就一直保持連接,就會造成阻塞IO,與此相對的的,還有非阻塞IO。

  • 阻塞IO是指客戶端請求服務器端,服務器端處理完成後,再將返回值給客戶端。此時客戶端一直處在阻塞狀態。當客戶端太多、同時併發請求的時候,服務器端處理不過來,服務端就會一直卡在那裏等待,影響用戶體驗。因此提出了非阻塞IO。
  • 非阻塞IO是指客戶端請求服務器端,服務器端有一些監聽器負責接受請求,接收到客戶端發來的請求之後立即返回,即告訴客戶端已經接受好了,等處理完成後再把數據返回客戶端,在服務端處理數據期間客戶端不會一直阻塞等待。

阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態。

阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之後纔會返回。

非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。


 參考資料:https://www.linuxidc.com/Linux/2018-09/154366.htm
                   https://blog.csdn.net/weixin_36691991/article/details/104963784?fps=1&locationNum=2

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