Socket原理
我們經(jīng)常談到互聯(lián)網(wǎng)汹粤,以及OSI 推出的七層模型(比較理想,過于復(fù)雜)田晚,其實早期西方國家設(shè)備進行互聯(lián)通信還沒有一個統(tǒng)一的標準嘱兼,誰發(fā)展的好推廣的快,誰就占了主動肉瓦,每一個在發(fā)展的時候都遇到一些各自的問題遭京。后來是一個軍方的項目使用的TCP/IP協(xié)議,慢慢的推廣出來泞莉,占了上風(fēng)哪雕,網(wǎng)絡(luò)也就這樣慢慢的連起來了,后來越來越多的國家都連起來鲫趁,成為了事實上的標準斯嚎。對于不跟底層打交道的編程人員來說,不希望去考慮那么多協(xié)議上的事情挨厚,只是為了實現(xiàn)基本的通信功能堡僻。socket是一種通用的網(wǎng)絡(luò)編程接口,基于TCP/IP協(xié)議疫剃,簡化了網(wǎng)絡(luò)通信的很多步驟钉疫。 socket 本義是插座,相當(dāng)于兩端插座 中間搭建了一個管道(通過IP進行互聯(lián))就可以通信了巢价,我們不用關(guān)心太細節(jié)的實現(xiàn)牲阁,只需要跟socket接口打交道固阁,中間什么協(xié)議的事情不是太關(guān)心。一個socket 其實就是一個(ip, port)城菊,ip我們好理解备燃,可以理解為管道兩端的節(jié)點,端口是干什么的呢凌唬。端口實際上是socket 與應(yīng)用程序之間進行了一層綁定并齐。兩端應(yīng)用程序之間的通信,一個數(shù)據(jù)發(fā)過來了客税,通過ip可以找到管道的節(jié)點况褪,再通過port找到對應(yīng)的應(yīng)用程序,就可以通信了霎挟。
python 提供的socket庫的實現(xiàn)原理如上圖所示窝剖,我們之前講到一個socket 其實就是一個(ip, port),從服務(wù)端來看bind函數(shù)后面就是接(ip,port)
,但注意只有執(zhí)行了listen 函數(shù)后酥夭,端口才算真正意義上的綁定了。那為什么客戶端這邊沒有綁定具體的端口呢脊奋,實際上這里的綁定在connect函數(shù)里給隱藏了熬北,客戶端從自己的空閑端口隨便找了一個,不需要我們關(guān)心到底使用什么ip, 什么port, 它自己內(nèi)部保證只要不出錯就可以了诚隙。connect需要傳的參數(shù)是服務(wù)端的(ip,port)讶隐, 因為你要知道自己去哪兒。我們知道TCP連接是面向連接的久又,服務(wù)器與一個客戶端之間通過socket tcp進行了連接巫延,那服務(wù)器的這個socket不就占用住了,如何能夠與另一個客戶端進行連接和通信呢地消?這要求我們深入理解accept背后的原理炉峰,accept 是一個阻塞函數(shù),阻塞直到客戶端有連接connect脉执,它會開辟另一個子socket, 使得剛傳過來的請求連接與這個子socket 建立tcp連接疼阔,然后你們之間要通信自己去玩,它依然在監(jiān)聽中半夷。