亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Socket調用過程是怎樣的

發布時間:2021-12-21 14:18:11 來源:億速云 閱讀:160 作者:iii 欄目:大數據

本篇內容介紹了“Socket調用過程是怎樣的”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

Socket由來

在學習一個新知識之前,要去想它為什么會出現,它的出現解決了什么問題.這樣印象才會深刻一些.

在同一個主機下,兩個進程間的通訊是很容易,直接把各種通訊細節交給操作系統去做就 OK 了.但是如果兩個進程是處于不同主機下呢?該如何進行通訊呢?而且在實際的應用場景中,是很復雜的,有的使用 TCP 協議,有的使用 UDP 協議,那么當我們使用不同的協議進行通信時,是不是就要使用不同的接口?同時還要處理不同協議的各種通訊細節,這樣一來,是不是就增加了開發的難度,同時軟件不容易進行擴展.

編程思想之一就是「面向對象」,同樣,在遇到這種問題時,我能不能把不同協議的通信細節抽出來,這樣程序員在使用的時候,直接調用,就不需要再關注協議本身了.而這就是 Socket 的由來.

它提供接口,來進行互聯的不同主機之間的進程通信.你想要讓不同主機之間通信? OK ,你直接調用我就行,至于我怎么實現,程序員不需要 care .

在上面的基礎上,我們能夠達成一個共識:如果一個應用,需要在客戶端和服務端之間進行通信,那就需要創建一個 Socket 實例. 那么問題來了,我如何使用?

Socket 進行的是端到端的通信,中間經過多少局域網,路過多少路由器,我是不清晰的,所以能夠設置的參數,也只是端到端協議之上的網絡層和傳輸層. 在網絡層, Socket 函數需要指定使用到的協議到底是 IPv4 還是 IPv6 ,分別對應設置為 AF_INET 和 AF_INET6 .此外,還需要說明你是使用 TCP 協議,還是 UDP 協議. TCP 協議是基于數據流的,所以設置為 SOCK_STREAM , UDP 是基于數據報的,因而設置為 SOCK_DGRAM .

 

Socket調用過程

客戶端和服務端創建 Socket 之后, TCP 的服務端要先監聽一個端口,一般是先調用 bind 函數,給這個 Socket 賦予一個 IP 地址和端口.為什么需要 IP 地址呢?有時候一臺機器會有多個網卡,相應的就會有多個 IP 地址,可以選擇監聽所有的網卡,也可以選擇監聽一個網卡,這樣只有發給這個網卡的包,才會給你.那我為什么還需要端口呢?你要知道,你寫的是一個應用程序,當一個網絡包來的時候,內核是需要通過 TCP 頭里面的這個端口,來定位到你這個應用程序的.

此時,當服務端有了 IP 和端口號,就可以調用 listen 函數進行監聽.在 TCP 的狀態圖中,有一個 listen 狀態,當調用這個函數之后,服務端就進入了這個狀態,這個時候客戶端那邊就可以發起連接了.

在內核中,為每個 Socket 維護了兩個隊列,一個是已經建立了連接的隊列,說明此時三次握手已經完畢,處于 established 狀態;一個是還沒有完全建立連接的隊列,也就是說這個時候三次握手還沒完成,處于 syn_rcvd 的狀態.

接下來,服務端調用 accept 函數,拿出一個已經完成的連接進行處理.如果客戶端還沒有完全建立連接,沒別的辦法,就等著咯.

在服務端等待的時候,客戶端可以通過 connect 函數發起連接.現在參數中指明要連接的 IP 地址和端口號,然后開始發起三次握手.內核會給客戶端分配一個臨時的端口,一旦握手成功,服務端的 accept 就會返回另一個 Socket .

注意一下,在這里有一個經常考察的知識點,就是監聽的 Socket 和真正用來傳數據的 Socket 是兩個,一個叫做「監聽 Socket 」,一個叫做「已連接 Socket 」.

連接建立成功之后,雙方就開始通過 read 和 write 函數來讀寫數據,就像往一個文件流里面寫東西一樣.之所以把 TCP 的 Socket 描述成一個文件流,是因為 Socket 在 Linux 中就是以文件的形式存在的.

在內核中, Socket 是一個文件,那對應就有文件描述符.每一個進程都有一個數據結構 task_struct ,里面指向一個文件描述符數組,來列出這個進程打開的所有文件的文件描述符.文件描述符是一個整數,是這個數組的下標.

這個數組中的內容是一個指針,指向內核中所有打開的文件的列表.既然是一個文件,就會有一個 inode ,只不過 Socket 對應的 inode 不像真正的文件系統一樣,保存在硬盤上,而是在內存中.在這個 inode 中,指向了 Socket 在內核中的 Socket 結構.

在這個結構中,主要的是兩個隊列,一個是發送隊列,一個是接收隊列.在這兩個隊列里面保存的是一個緩存 sk_buff .這個緩存中能夠看到完整的包的結構.

以上,就是基于 TCP 協議的 Socket 程序函數調用過程的一個描述

接下來說說基于 UDP 協議的 Socket 程序函數調用過程.

基于 UDP 協議的 Socket 程序函數調用過程 對于 UDP 來說,和 TCP 還是有些不一樣的.首先, UDP 是沒有連接的,也就不需要三次握手,也不需要調用 listen 和 connect ,但是 UDP 的交互仍然需要 IP 和端口號,那就需要 bind .

UDP 是沒有維護連接狀態的,也就不需要對每對連接建立一組 Socket ,而是只要有一個 Socket 就可以和多個客戶端通信.也是因為沒有連接狀態,所以每次通信的時候,都調用 sendto 和 recvfrom ,這樣才可以傳入 IP 地址和端口.

“Socket調用過程是怎樣的”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阳西县| 长海县| 衡阳市| 大安市| 广昌县| 巴林右旗| 江都市| 永康市| 金华市| 靖远县| 灵台县| 永川市| 南木林县| 石棉县| 囊谦县| 阳朔县| 建平县| 开化县| 张家界市| 肃北| 九龙城区| 安丘市| 洮南市| 泗水县| 英吉沙县| 孝义市| 长春市| 深泽县| 灵寿县| 新疆| 临沧市| 甘泉县| 谢通门县| 洪雅县| 德安县| 苏尼特右旗| 巴马| 尼玛县| 鱼台县| 宜兴市| 五峰|