Socket編程:一點點教你做個聊天工具——(一)計算機網絡基礎理論篇

一個簡單的聊天工具,寫個小系列,Python代碼實現。最後的成品在這裏,你可以先下載下來玩一下,再考慮要不要看這個系列的東西。

鏈接:https://pan.baidu.com/s/192onr8E0KWxH4EfmOBqb6g 
           提取碼:0hsf 
 

首界面:

 

左上角Config菜單配置ip:

 

在你的cmd命令行裏打入ipconfig命令,查看你的ip。

 

我這裏連接的是無線,找到WLAN的適配器,查看ip:192.168.1.117,這是一個局域網IP,對於什麼是局域網,我們後面談,這裏注意,如果你測試機的ip是局域網ip,需要兩臺通訊機器連接到同一局域網上。(也就是說鏈接的是同一個wifi)

這裏點擊確認(confirm)後,應該會有個彈框,問你是否允許程序執行某些東西,點擊確認就行。別擔心,我只是佔用了你的55555號端口,至於端口是什麼,我們同樣後面說。

 

相同的道理,問問你哥們的ip是多少,在config裏配置send_ip。

順便可以自己起個暱稱。config ID

配置完畢後,界面會有提示:

 

自己的機器算是配置完了。同樣的,把你哥們的也配置好。不過注意這裏的ip是它的ip,它的send_ip纔是你的IP,別搞混了啊。

 

當全部配置完畢後,在輸入框裏(下面小的那個)輸入你想發送的消息,點擊submit發送。下面就是兩臺電腦間的通訊結果:

 

 

 

ok,演示已經結束了。你現在需要考慮要不要把時間丟在這上面了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

哇,如果你看到了這句話,那你應該就決定留下來了。不過我還是要奉勸一句:別抱有太大的期望,萬一失望了呢。

哈哈哈,開玩笑,既然決定了,那就一起努力吧。

 

文章的標題已經指出了,理論片。不要一聽到這篇文章沒代碼就很傷心,程序的代碼並不長,但涉及到的理論並不少,有些原理的東西無關緊要,但有些最基礎的東西,不理解是沒辦法懂得程序含義的。

 

首篇文章,我們就先來解決這些東西。

 

就從程序運行的過程一點點說起。最開始,我們配置的就是自己的IP,那第一個概念來了,什麼是IP(WHAT)。

 

IP(Internet Protocol Address),簡單來說就是地址(WHERE)。分IPv4和IPv6,我們常用的是IPv4,有什麼區別呢?也沒太大區別,IPv4用32位的長度來表示一個ip地址,而IPv6用128位表示一個地址(我說的是二進制位)。至於IPv6爲什麼會出現,也完全是因爲IPv4不夠用了。

 

也就是說,你自己的IP是在網絡中定位你位置用的。數據的傳輸要有目的地,通過你的IP地址,數據才能準確的發到你的手裏。

 

就拿這裏來說,往上看這篇文章的鏈接地址:

https://blog.csdn.net/qq_41500251/article/details/90114802

如果你不小心點進去了,那............這篇文章的點擊量+1,感謝。

 

在計算機網絡中,數據傳輸通過的是協議。又一個概念——協議。我不想說的太官方,搜索瞭解下。這裏我簡單談理解,協議——就是“規則”。兩臺機器之間通信,我們要指定規則,舉個例子,比如A給B發消息,B接收到了。A怎麼知道B是否接受到了呢?如果B沒接收到,那我還要重新發送。Now,制定規則,B如果你接收到了,給我回個消息說:“我收到了!”。A收到了確認消息,知道發送成功,不管了。那B怎麼知道A是否收到了B發送的確認消息呢?制定規則,A你收到了我收到的消息,也告訴我一聲。B如果收到了A的確認消息,OK了,已經可以確定AB的接受和發送能力沒問題,換句話說A和B之間的鏈接沒問題,可以通信了。

 

我上面說到的這個例子是TCP(一種運輸層協議,有些地方叫傳輸層)協議建立鏈接的過程,建立完鏈接,就可以在這條通道上傳輸數據了。

 

回過來再看那個鏈接:

https://blog.csdn.net/qq_41500251/article/details/90114802

如果你不小心又點到,那......你懂的。

 

http是應用層的一種協議(就按我剛剛說的理解,就是一種數據的傳輸規則)。從剛纔的運輸層,又到了現在的應用層,這都是什麼東西啊。

 

別急,聽我言。因爲網絡協議的指定過於複雜,我們人工的對它進行了分層。這個東西和我們寫代碼是一樣的,比如我們寫個飛機大戰的代碼。我們不太可能從頭到尾一溜煙兒的把邏輯寫完,因爲寫着寫着就亂了。我們會寫個飛機移動的函數move(),飛機開火的函數fire()。然後我們在主函數裏調用就完了,網絡協議的分層完全可以靠這種理解。

 

                       

這張圖片並不準確,因爲有些層之間的區分並不很明確,而且有些層在一些地方也不會用到(比如表示層和會話層等等)。

 

最底層的物理層,相信不需要過多的介紹了,就是在網絡之間傳送01數字,我們知道數據除了0就是1,至於問什麼計算機可以把01變成我們能夠看到的圖片,視頻,文字等完全是軟件的功勞。

 

簡單點理解,物理層你就是在寫函數功能,最上面那一層就是在調函數。下層對上層提供服務,讓上層在邏輯功能的表示上更加簡單。

 

回過來說那個連接:

https://blog.csdn.net/qq_41500251/article/details/90114802

你懂我要說什麼,因爲問題一直在發散,我們說完一個問題就回到主幹往下延伸,你們習慣下我的思維。

 

這個鏈接,也就是我們經常說的網頁地址,它有個自己的學名——URL(Uniform Resourfe Locator)統一資源定位符。我們知道IP和port在網絡中表示一臺設備,而URL標識的更加精細,他是網絡中某一文檔的表示。

 

URL的一般形式由以下四個部分組成:

<協議>://<主機>:<端口>/<路徑>

 

協議就是指出使用什麼協議來獲取萬維網文檔。我們經常用的是http和ftp(文件傳輸協議),主機端口我們就不多解釋了,後面的路徑,當然就是文檔的目錄了。

 

我們在輸網址時一般不會輸入端口號,默認爲80。如果訪問自己本地的服務器時,就要按着服務器容器的端口去請求了。比如TomCat的端口默認8080等等。

 

我們說了http屬於應用層的一個協議,而給http提供服務的運輸層協議就是TCP。我們在瀏覽網頁的時候應該也注意到了,全是靠的http協議來傳輸數據的。回眼兩行看鏈接:

http後緊跟的是blog.csdn.net,這個東西叫做域名(因器內容與程序沒太大關係,我把基礎理論放在文章後面,感興趣的可以自行查看),你可以和IP等同。我們前面說了IPv4是32位長度的一個地址,拿我的局域網ip來說:

 

192.168.1.117。

我們通常用十進位來表示,八位二進制表示成一位十進制數字:

192 —— 11000000, 168——10101000, 1——00000001, 117——01110101。

所以,我的局域網IP地址的二進制表現形式是:

 11000000 10101000 00000001 01110101 (32位)

 

我們上面說到的域名,其實是和IP綁定上的,等同於IP,但不是IP。爲什麼這麼做呢?一來是你輸入地址時方便,我們所有人訪問百度都知道是www.baidu.com,你知道他的IP嗎。二來,爲了保護服務器的安全,不直接顯示IP地址。

 

當然如果你知道服務器的詳細IP地址,就可以把域名換掉,效果是一樣的。打個比方,如果csdn博客的服務器ip是192.168.1.117。那你請求這個地址,效果是完全一樣的:

https://192.168.1.117/qq_41500251/article/details/90114802

當然你不可能請求到,因爲這是個局域網IP。

 

說回來,當你在瀏覽器地址欄中輸入了:

https://blog.csdn.net/qq_41500251/article/details/90114802

按下回車,你會向csdn的服務器發送個請求,來請求建立鏈接。整個過程就是前面我們拿AB說的那個例子,而他的底層就是靠TCP這個協議實現的。那個過程執行完畢,服務器就會給你發數據,你接收到展示出來,就是你眼前的這篇文章了。也就是說你雖然能看到我的這篇文章,但是這篇文章並不在你的電腦上,而是csdn服務器發給你的,哪的服務器?就是blog.csdn.net這個域名所代表的服務器。你是怎麼找到這個服務器的?靠服務器IP地址。

 

現在清晰IP是個什麼功能了嗎?行吧,IP就先說到這裏了。已經煩了是不是,再堅持下,這很重要。

 

演示中我說過,當你在配置自己的IP地址的時候,系統問你是否同意程序執行某些東西。我說過了,我要佔用你的端口。又一個概念來了——端口(port)。

 

我們還從例子出發:

 

你打開了自己的電腦,登上了QQ,然後打開了瀏覽器,請求了csdn的博客,csdn服務器給你發回來數據。你的瀏覽器接收到,展現出來。

 

有沒有想過這個問題——爲什麼是數據能精確的給了瀏覽器,爲什麼它沒把數據給了QQ?

 

嗯,就是那個意思。通過IP我知道了你的機器在哪裏(這裏說法並不準確,很多設備都可以有IP,聯繫物聯網思考下),我只是把數據給了你的機器,怎麼精確定位到具體要給你機器的哪個程序呢?

 

這就是端口的功能了。

 

對於端口,我們多說點。端口大了分可以分爲兩類——服務器端使用的端口和客戶端使用的端口。

 

服務器端口中,又分爲兩類:

1.系統端口號,數值爲0-1023,這些端口是大衆熟知的端口,很重要,不會讓用戶隨意修改。

2.登記端口號,數值爲1024-49151,這些端口使用也是需要做登記的。

 

客戶端使用的端口,就是給我們計算機上的進程用的了,數值爲49152-65535。它是動態分配的,來一個進程給一個端口,不用了收回來,給別的程序使用。(我佔用了你的55555端口,那個彈窗就是請求你同意的。)

 

也因此,網絡中兩臺PC的數據交換,其實是兩個進程之間的數據交換。

 

現在我們有了兩個重要概念:IP和port。

 

這二者的結合,(IP, port)就是socket,套接字。

 

有了上面的理解,我們就能清楚的瞭解到通過socket我就能定位到指定機器的指定進程,有了目標之後,就可以對目標發送數據了。

 

最後的一個概念,也是最開始說的“局域網ip”。

 

其實從概念上應該也能明白個差不多,就是在局域有效的ip。我們知道表示地址的的長度就那麼幾位,是有限的,會被分完的。

 

局域網從某一方面上減緩了這種情況。我們簡單說下吧。假如,我有10個ip分別是1, 2, 3, 4........10(這裏只是爲了書寫簡便)。

 

那我的網絡中最終只能有10臺機器,再多我就沒地址可以給了。

 

現在規定8, 9, 10這3個ip是局域網ip,這幾個ip只在局部有效。我把1, 2, 3....其他的ip分給路由器(不能再擴展了,沒完沒了了。簡單理解路由器就是網絡中轉發數據的機器)。

 

                               

 

如果我把其餘七個ip給了7個路由器,每個路由器都可以連接3臺機器構成一個局域網,三臺機器用8,9,10ip標記。也就是說如果1局域網裏用8給9發數據,接收的也是1局域網裏的9,而不是2局域網裏的9。這種方式來分配IP,那算算看我們能分配多上設備:7個路由器加上7 x 3 =21臺PC。

 

問題來了,那我1裏面的8要給2裏面的9發送數據怎麼辦呢?因爲8, 9, 10ip是局域網的,他不能在外網進行傳輸(圖中1到2之間的網絡就可以看成外網),最終通過路由器1和路由器2之間傳輸數據進行實現。也就是說如果局域8,9,10要給其他局域網裏的機器發送數據,他們都要把數據給他們的路由器,然後路由器給目標機器的所在網絡的路由器。那個路由器再根據你發的數據選擇目標,帶到它的局域網裏,找到指定機器給它。局域網數據出局域網的端口IP,就是我們平常說的“網關”。

 

路由器又是怎麼知道是局域網哪臺機器的數據,當數據在經過路由器時,它會做記錄。具體的東西,我們就不在這裏做解釋了。

 

將局域網ip轉化爲全球外部ip的方法叫做NAT,感興趣的同學可以去搜索瞭解下。換句話說,在互聯網看來,1局域網的任一PC和2局域網中的任一PC通信,都是路由器1,2之間通信,至於局域網內部的東西,就不是外網的管轄範圍了。

 

在局域網中使用的IP地址,是我們人爲指明的一些地址,又被叫做專用地址。這些地址只能用於一個機構的內部通信,而不能用於和互聯網上的主機通信。換言之,專用地址只能用作本地地址,而不能用作全球地址。在互聯網的所有路由器中,對目的地址是專用地址的數據報(又一個概念,簡單理解“數據報”就是一段數據),一律不進行轉發。

 

那怎樣識別一個IP是否是專用地址?

 

專用地址的指派如下:

 

1. 10.0.0.0 到10.255.255.255

2. 172.16.0.0 到 172.31.255.255

3. 192.168.0.0 到 192.168.255.255

 

有了這些東西,應該能明白爲什麼我說如果PC是局域網IP需要連接到同一個局域網裏了吧。因爲我們寫的程序沒辦法去控制網關,讓路由器發給別的局域網。

 

當然,如果是座機,用的寬帶連接。那通過查看ipconfig的本地連接的IP地址,不屬於專用地址的範圍段,那就不需要關注了。因爲如果有外網的IP,它就可以在互聯網中傳遞了呀。不用侷限在我們的局域網範圍中。

 

學校某些機房的計算機都是有外網IP的,你可以通過它給其他任一具有全球外網IP的PC發送消息。

 

本來想着涉及點代碼,概念太多了,我們放到下篇文章吧。這篇文章好好理解下,下次我們就動手來實現下TCP數據傳輸。

 

這篇文章要好好看啊,不然會影響到後面的邏輯。

 

 

 

 

 

擴展:

域名系統DNS(Domain Name System),用來把便於人們使用的機器的名字轉換爲IP地址。

csdn的域名來解釋:

blog.csdn.net,左右端的net叫做頂級域名,csdn是二級域名,blog是三級域名(或者說是一臺host)。域名只是個邏輯地址,並不代表計算機所在的物理地點。

互聯網中採用了層次樹狀結構的命名方法,在尋找主機時,先尋找net域,再在net域中尋找csdn域,在csdn中找到blog那臺主機。(域中如果有多個分塊,我們把他們叫做“區”)

常見的頂級域名如下:

1)國家頂級域名:如cn表中國,us表美國(但是人家一般不會用,因爲整個DNS都是人家的,人家不想服從別人的遊戲規則),uk表英國。

2)通用頂級域名:com(公司企業,比如www.baidu.com),net(網絡服務機構,csdn就是這種),org(非營利性組織,比如python官網),int(國際組織),edu(美國專用的教育機構,所以我們的教育機構是edu.cn,在我們自己的cn後面偷偷建edu),gov(美國政府部門),mil(美國軍事部門)

後來陸續增加的一些頂級域名:

biz(公司和企業),jobs(人力資源管理者),museum(emmmm,不用解釋了),name(個人),pro(有證書的專業人員,嗯,就是),travel(旅遊業,就是表面意思)。

 

因爲我國的頂級域名是cn,因此我們的類別域名主要在二級域名:

類別域名:ac(科研機構),com(工、商、金融等企業),edu(教育機構,我們學校的官網基本都是這種),gov(政府機構),mil(國防機構),net(提供互聯網絡服務的機構),org(和頂級是一樣的)

行政區域名:這個我們不常見,因爲我們不用。比如:bj(北京市),js(江蘇省)等等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章