當前位置:編程學習大全網 - 熱門推薦 - 到底什麽是Socket?

到底什麽是Socket?

本系列文章前面那些主要講解的是計算機網絡的理論基礎,但對於即時通訊IM這方面的應用層開發者來說,跟計算機網絡打道的其實是各種API接口。

本篇文章就來聊壹下網絡應用程序員最熟悉的Socket這個東西,拋開生澀的計算機網絡理論,從應用層的角度來理解到底什麽是Socket。

對於 Socket 的認識,本文將從以下幾個方面著手介紹:

1) Socket 是什麽;

2) Socket 是如何創建的;

3) Socket 是如何連接的;

4) Socket 是如何收發數據的;

5) Socket 是如何斷開連接的;

6) Socket 套接字的刪除等。

特別說明: 本文中提到的“Socket”、“網絡套接字”、“套接字”,如無特殊指明,指的都是同壹個東西哦。

Socket 是什麽

壹個數據包經由應用程序產生,進入到協議棧中進行各種報文頭的包裝,然後操作系統調用網卡驅動程序指揮硬件,把數據發送到對端主機。

我們大家知道,協議棧其實是位於操作系統中的壹些協議的堆疊,這些協議包括 TCP、UDP、ARP、ICMP、IP等。即時通訊開發可以找蔚可雲開發。

通常某個協議的設計都是為了解決特定問題的,比如:

1) TCP 的設計就負責安全可靠的傳輸數據;

2) UDP 設計就是報文小,傳輸效率高;

3) ARP 的設計是能夠通過 IP 地址查詢物理(Mac)地址;

4) ICMP 的設計目的是返回錯誤報文給主機;

5) IP 設計的目的是為了實現大規模主機的互聯互通。

應用程序比如瀏覽器、電子郵件、文件傳輸服務器等產生的數據,會通過傳輸層協議進行傳輸。而應用程序是不會和傳輸層直接建立聯系的,而是有壹個能夠連接應用層和傳輸層之間的套件,這個套件就是 Socket 。

應用程序的下面: 就是操作系統內部,操作系統內部包括協議棧,協議棧是壹系列協議的堆疊。

操作系統下面: 就是網卡驅動程序,網卡驅動程序負責控制網卡硬件,驅動程序驅動網卡硬件完成收發工作。

在操作系統內部有壹塊用於存放控制信息的存儲空間,這塊存儲空間記錄了用於控制通信的控制信息。其實這些控制信息就是 Socket 的實體,或者說存放控制信息的內存空間就是Socket的實體。

這裏大家有可能不太清楚所以然,所以我用了壹下 netstat 命令來給大夥看壹下Socket是啥玩意。

Socket 是如何創建的

通過上節的講解,現在妳可能對 Socket 有了壹個基本的認識,先喝口水,休息壹下,讓我們繼續探究 Socket。

現在我有個問題, Socket 是如何創建的呢?

Socket 是和應用程序壹起創建的。

應用程序中有壹個 socket 組件,在應用程序啟動時,會調用 socket 申請創建Socket,協議棧會根據應用程序的申請創建Socket:首先分配壹個Socket所需的內存空間,這壹步相當於是為控制信息準備壹個容器,但只有容器並沒有實際作用,所以妳還需要向容器中放入控制信息;如果妳不申請創建Socket所需要的內存空間,妳創建的控制信息也沒有地方存放,所以分配內存空間,放入控制信息缺壹不可。至此Socket的創建就已經完成了。

Socket創建完成後,會返回壹個Socket描述符給應用程序,這個描述符相當於是區分不同Socket的號碼牌。根據這個描述符,應用程序在委托協議棧收發數據時就需要提供這個描述符。

Socket 是如何連接的

Socket創建完成後,最終還是為數據收發服務的。但是,在數據收發之前,還需要進行壹步“連接”(術語就是 connect),建立連接有壹整套過程。

實際上這個“連接”是應用程序通過 TCP/IP 協議標準從壹個主機通過網絡介質傳輸到另壹個主機的過程。

Socket剛剛創建完成後,還沒有數據,也不知道通信對象。

在這種狀態下: 即使妳讓客戶端應用程序委托協議棧發送數據,它也不知道發送到哪裏。所以瀏覽器需要根據網址來查詢服務器的 IP 地址,查詢到目標主機後,再把目標主機的 IP 告訴協議棧。至此,客戶端這邊就準備好了。

在服務器上: 與客戶端壹樣也需要創建Socket,但是同樣的它也不知道通信對象是誰,所以我們需要讓客戶端向服務器告知客戶端的必要信息: IP 地址和端口號 。

現在通信雙方建立連接的必要信息已經具備,可以開始“連接”過程了。

首先: 客戶端應用程序需要調用 Socket 庫中的connect方法,提供 socket 描述符和服務器 IP 地址、端口號。

以下是connect的偽碼調用:

1connect(<描述符>、<服務器IP地址和端口號>)

這些信息會傳遞給協議棧中的 TCP 模塊,TCP 模塊會對請求報文進行封裝,再傳遞給 IP 模塊,進行 IP 報文頭的封裝,然後傳遞給物理層,進行幀頭封裝。

之後通過網絡介質傳遞給服務器,服務器上會對幀頭、IP 模塊、TCP 模塊的報文頭進行解析,從而找到對應的Socket。

Socket收到請求後,會寫入相應的信息,並且把狀態改為正在連接。

請求過程完成後: 服務器的 TCP 模塊會返回響應,這個過程和客戶端是壹樣的

Socket 是如何收發數據的

當控制流程上節中的連接過程回到應用程序之後,接下來就會直接進入數據收發階段。

數據收發操作是從應用程序調用 write 將要發送的數據交給協議棧開始的,協議棧收到數據之後執行發送操作。

協議棧不會關心應用程序傳輸過來的是什麽數據,因為這些數據最終都會轉換為二進制序列,協議棧在收到數據之後並不會馬上把數據發送出去,而是會將數據放在發送緩沖區,再等待應用程序發送下壹條數據。

為什麽收到數據包不會直接發送出去,而是放在緩沖區中呢?

因為只要壹旦收到數據就會發送,就有可能發送大量的小數據包,導致網絡效率下降(所以協議棧需要將數據積攢到壹定數量才能將其發送出去)。

至於協議棧會向緩沖區放多少數據,這個不同版本和種類的操作系統有不同的說法。

  • 上一篇:人活壹張臉什麽意思?
  • 下一篇:楊寺莊小殼動物群的對比
  • copyright 2024編程學習大全網