(1)創(chuàng)建套接字
(2)連接服務(wù)器
(3)收發(fā)數(shù)據(jù)
(4)從服務(wù)器斷開連接并刪除套接字
(5)IP與以太網(wǎng)的包收發(fā)操作
(6)用UDP協(xié)議收發(fā)數(shù)據(jù)的操作
協(xié)議棧會與網(wǎng)卡進行配合,將數(shù)據(jù)切分成小塊并封裝成網(wǎng)絡(luò)包,再將網(wǎng)絡(luò)包轉(zhuǎn)換成電信號或者光信號發(fā)送出去。
2.1 創(chuàng)建套接字
協(xié)議棧的內(nèi)部結(jié)構(gòu)

應(yīng)用程序的下面是Socket庫,其中包括解析器,解析器用來向DNS服務(wù)器發(fā)出查詢。
協(xié)議棧的上半部分有兩塊,分別是負責用TCP協(xié)議收發(fā)數(shù)據(jù)的部分和負責用UDP協(xié)議收發(fā)數(shù)據(jù)的部分,它們會接受應(yīng)用程序的委托執(zhí)行收發(fā)數(shù)據(jù)的操作。
瀏覽器、郵件等一般應(yīng)用程序收發(fā)數(shù)據(jù)時用TCP;
DNS查詢等收發(fā)較短的控制數(shù)據(jù)時用UDP。
下面一半是用IP協(xié)議控制網(wǎng)絡(luò)包收發(fā)操作的部分。在互聯(lián)網(wǎng)上傳送數(shù)據(jù)時,數(shù)據(jù)會被切分成一個一個的網(wǎng)絡(luò)包,而將網(wǎng)絡(luò)包發(fā)送給通信對象的操作就是由IP來負責的。此外,IP中還包括ICMP協(xié)議和ARP協(xié)議。ICMP用于告知網(wǎng)絡(luò)包傳送過程中產(chǎn)生的錯誤以及各種控制消息,ARP用于根據(jù)IP地址查詢相應(yīng)的以太網(wǎng)MAC地址。
套接字的實體就是通信控制信息
IP下面的網(wǎng)卡驅(qū)動程序負責控制網(wǎng)卡硬件,而最下面的網(wǎng)卡則負責完成實際的收發(fā)操作,也就是對網(wǎng)線中的信號執(zhí)行發(fā)送和接收的操作。
在協(xié)議棧內(nèi)部有一塊用于存放控制信息的內(nèi)存空間,這里記錄了用于控制通信操作的控制信息,例如通信對象的IP地址、端口號、通信操作的進行狀態(tài)等。本來套接字就只是一個概念而已,并不存在實體,如果一定要賦予它一個實體,我們可以說這些控制信息就是套接字的實體,或者說存放控制信息的內(nèi)存空間就是套接字的實體。
調(diào)用socket時的操作
創(chuàng)建套接字時,首先分配一個套接字所需的內(nèi)存空間,然后向其中寫入初始狀態(tài)。
首先是創(chuàng)建套接字的階段。如圖2.3①所示,應(yīng)用程序調(diào)用socket申請創(chuàng)建套接字,協(xié)議棧根據(jù)應(yīng)用程序的申請執(zhí)行創(chuàng)建套接字的操作。
在這個過程中,協(xié)議棧首先會分配用于存放一個套接字所需的內(nèi)存空間。用于記錄套接字控制信息的內(nèi)存空間并不是一開始就存在的,因此我們先要開辟出這樣一塊空間來[插圖],這相當于為控制信息準備一個容器。但光一個容器并沒有什么用,還需要往里面存入控制信息。套接字剛剛創(chuàng)建時,數(shù)據(jù)收發(fā)操作還沒有開始,因此需要在套接字的內(nèi)存空間中寫入表示這一初始狀態(tài)的控制信息。到這里,創(chuàng)建套接字的操作就完成了。接下來,需要將表示這個套接字的描述符告知應(yīng)用程序。描述符相當于用來區(qū)分協(xié)議棧中的多個套接字的號碼牌。
收到描述符之后,應(yīng)用程序在向協(xié)議棧進行收發(fā)數(shù)據(jù)委托時就需要提供這個描述符。由于套接字中記錄了通信雙方的信息以及通信處于怎樣的狀態(tài),所以只要通過描述符確定了相應(yīng)的套接字,協(xié)議棧就能夠獲取所有的相關(guān)信息,這樣一來,應(yīng)用程序就不需要每次都告訴協(xié)議棧應(yīng)該和誰進行通信了。

netstat -ano
Mac 使用 netstat 無法查看進程id,通過端口找到對應(yīng)進程的 pid
sudo lsof -i :9000
