談談socket

Socket原理

我們經常談到互聯(lián)網,以及OSI 推出的七層模型(比較理想,過于復雜),其實早期西方國家設備進行互聯(lián)通信還沒有一個統(tǒng)一的標準,誰發(fā)展的好推廣的快,誰就占了主動,每一個在發(fā)展的時候都遇到一些各自的問題。后來是一個軍方的項目使用的TCP/IP協(xié)議,慢慢的推廣出來,占了上風,網絡也就這樣慢慢的連起來了,后來越來越多的國家都連起來,成為了事實上的標準。對于不跟底層打交道的編程人員來說,不希望去考慮那么多協(xié)議上的事情,只是為了實現(xiàn)基本的通信功能。socket是一種通用的網絡編程接口,基于TCP/IP協(xié)議,簡化了網絡通信的很多步驟。 socket 本義是插座,相當于兩端插座 中間搭建了一個管道(通過IP進行互聯(lián))就可以通信了,我們不用關心太細節(jié)的實現(xiàn),只需要跟socket接口打交道,中間什么協(xié)議的事情不是太關心。一個socket 其實就是一個(ip, port),ip我們好理解,可以理解為管道兩端的節(jié)點,端口是干什么的呢。端口實際上是socket 與應用程序之間進行了一層綁定。兩端應用程序之間的通信,一個數(shù)據(jù)發(fā)過來了,通過ip可以找到管道的節(jié)點,再通過port找到對應的應用程序,就可以通信了。

python 提供的socket庫的實現(xiàn)原理如上圖所示,我們之前講到一個socket 其實就是一個(ip, port),從服務端來看bind函數(shù)后面就是接(ip,port)
,但注意只有執(zhí)行了listen 函數(shù)后,端口才算真正意義上的綁定了。那為什么客戶端這邊沒有綁定具體的端口呢,實際上這里的綁定在connect函數(shù)里給隱藏了,客戶端從自己的空閑端口隨便找了一個,不需要我們關心到底使用什么ip, 什么port, 它自己內部保證只要不出錯就可以了。connect需要傳的參數(shù)是服務端的(ip,port), 因為你要知道自己去哪兒。我們知道TCP連接是面向連接的,服務器與一個客戶端之間通過socket tcp進行了連接,那服務器的這個socket不就占用住了,如何能夠與另一個客戶端進行連接和通信呢?這要求我們深入理解accept背后的原理,accept 是一個阻塞函數(shù),阻塞直到客戶端有連接connect,它會開辟另一個子socket, 使得剛傳過來的請求連接與這個子socket 建立tcp連接,然后你們之間要通信自己去玩,它依然在監(jiān)聽中。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容