中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

临海市| 中牟县| 怀来县| 古蔺县| 阿坝县| 泰宁县| 宁海县| 长武县| 南城县| 德阳市| 汽车| 桂林市| 石渠县| 青岛市| 吉木萨尔县| 肃北| 政和县| 城口县| 宽甸| 库尔勒市| 吉木萨尔县| 宜兴市| 江陵县| 广宁县| 伊川县| 屏南县| 塔河县| 广德县| 克东县| 延安市| 南京市| 恭城| 岳阳县| 桦川县| 和田县| 丰原市| 奉节县| 阳泉市| 铅山县| 改则县| 凉山|