網絡的本質
理解Socket前,先談一個概念。什么是網絡?
沒有網絡之前,每個人的設備(電腦等)都是彼此孤立的。人類之間通過電子設備進行網絡交流,其實就是不斷地將信息以二進制數據的形式發送到其他設備上。這些信息是通過光纖傳輸的,光纖是一種客觀存在的材料,通過它可以實現高速數據傳輸。光纖內部的材料可以通過電信號來激發,使得光在光纖內部傳播,從而實現信息傳輸。
所以筆者認為網絡的本質就是連接和傳輸數據。
網絡協議
網絡協議是計算機網絡中進行數據交換而建立的規則、標準或約定的集合。你想要在網絡環境中進行通信,那么網絡協議就是你必須遵守的規則。
規則是什么,你一定聽說過OSI模型,TCP/IP協議。
OSI模型是國際組織定義的一套理論基礎,主要用于定義網絡通信的規則。
TCP/IP協議是基于這套理論基礎真正實現的通信規則。
總結:連接和傳輸數據需要統一標準的協議和規則。
Socket
Socket英文中的意思是“插座”,中文翻譯“套接字”。可能最開始西方人覺得:電器 + Socket = 通電,類比電腦 + Socket = 通信。
中國人翻譯,套接字也是是類比水管的套接筒吧。關鍵還是連接和信息交換。
一開始,我也是按照什么這么理解的,但是腦海中對這個抽象概念沒法實例化。那么我們先放下這些類比,看看Socket到底有哪些東西吧。
首先明確一點,套接字是操作系統提供的。window和linux上的實現是不一樣的,但是規則是一樣的。你可以理解Socket是網絡協議的具體實現。不同的語言都會有Socket類,他們都是對底層socket的封裝。
網絡編程中接收連接請求(Server)的套接字創建過程:
-
調用
socket
函數創建套接字。這一步,不管是linux還是window,或者不同語言的封裝,創建的時候,都會傳入一些參數。比如,你是傳遞IPV4還是IPV4,Stream還是Dgram,是TCP還是UDP。看見沒有,其實這一步,就是對網絡協議的具體實現和描述。
定義了協議和規則,你就只能在規則類選取一種樣式。
-
調用
bind
函數分配地址和端口號。通信,和寫信一樣都需要地址。而具體的軟件進程間的通信,是需要IP +端口。
-
調用
listen
函數轉為可接收請求狀態。調用listen函數后,服務器意味著可以接受來自其他設備的請求了。
-
調用
accept
函數接收連接請求。這一步就相當于TCP三次握手的第二次,好的我已經和你建立連接了,我們可以通信了。
網絡中請求連接(Client)的套接字創建過程。
- 創建套接字
- 調用
connect
發送請求。
Socket也還有其他函數close
,write
,read
。這里我就不詳細介紹了。可以參考這篇文章:超詳細的Socket通信原理和實例講解 - 知乎 (zhihu.com)。
總而言之,Socket就是一個由操作系統提供的一個可以進行連接和傳輸數據的工具。現在再看叫插座還是套接字,沒什么意義,本質就是工具。
歡迎指正!