1. 程式人生 > 實用技巧 >Python網路程式設計 —— 網路基礎知識

Python網路程式設計 —— 網路基礎知識

1、網路的基礎概念

(1)、網路架構

C / S 架構: client 客戶端 / server 服務端

諸如:qq 微信 瀏覽器 英雄聯盟 穿越火線 ··· --- 需要安裝客戶端

這裡的客戶端一般泛指客戶端應用程式 EXE,程式需要先安裝後 ,才能執行在使用者電腦上,對使用者的電腦作業系統環境依賴較大。

B / S 架構: browser 瀏覽器 / server 伺服器

諸如:百度 淘寶 碼雲 ··· --- 只要在瀏覽器輸入網址就可以直接使用了

B / S 架構中的瀏覽器,也是客戶端的一種,不過不需要大家去安裝什麼應該程式,只需在瀏覽器上通過HTTP請求伺服器端相關的資源(網頁資源),客戶端瀏覽器就能夠進行增刪改查。

B / S 是 C / S 架構中的一種;C / S 架構安全性較高,但程式比較龐大。

(2)、移動端

APP

微信小程式:統一了所有web程式的入口

支付寶:統一了所有和錢相關的事

(3)、mac地址

Mac地址是一個實體地址,唯一的標識了一臺網路裝置,每塊網絡卡出廠時都被燒製上一個世界唯一的mac地址,長度為48位2進位制,通常由12位16進位制數表示(前六位是廠商編號,後六位是流水線號)

head中包含的源和目標地址由來:ethernet規定接入internet的裝置都必須具備網絡卡,傳送端和接收端的地址便是指網絡卡的地址,即mac地址。

(4)、IP地址

IP地址是一個邏輯地址,是可以根據位置變化而變化的,能夠在廣域網中進行快速的定位

<1>、IPV4地址

表示 : 4 位點分十進位制

範圍 : 0.0.0.0 - 255.255.255.255

數量 :2**32

<2>、IPV6地址

6位冒分十六進位制

0.0.0.0 - FFFF:FFFF:FFFF:FFFF:FFFF:FFFFF

(5)、公網和內網

公網 : 0.0.0.0 - 255.255.255.255 (不包含保留欄位的IP)

能夠在任意一個地方去訪問的IP地址

內網 : 所有的內網IP都要使用保留欄位

只能在一個區域內使用,出了這個區域就用不了了

# ip保留地址
a類網:192.168.0.0  -  192.168.255.255
b類網:172.16.0.0  -  172.32.255.255
c類網:10.0.0.0  -  10.255.255.255

(6)、路由器和交換機

<1>、 交換機

交換機(Switch)是一種用於電(光)訊號轉發的[網路裝置。它可以為接入交換機的任意兩個網路節點提供獨享的電訊號通路。最常見的交換機是乙太網交換機。其他常見的還有電話語音交換機、光纖交換機等。

# 交換機完成區域網內通訊

交換機不認識 IP 地址,只認識 mac 地址
通過 IP 找 mac 地址:arp協議(地址解析協議)
方式: 單播    廣播    組播
<2>、 路由器

路由器是連線兩個或多個網路的硬體裝置,在網路間起閘道器的作用,是讀取每一個數據包中的地址然後決定如何傳送的專用智慧性的網路裝置。

# 路由器完成區域網間通訊

(7)、閘道器IP

閘道器實質上是一個網路通向其他網路的IP地址。

(8)、子網掩碼

 子網掩碼,就是表示子網路特徵的一個引數。它在形式上等同於IP地址,也是一個32位二進位制數字,它的網路部分全部為1,主機部分全部為0。比如,IP地址172.16.10.1,如果已知網路部分是前24位,主機部分是後8位,那麼子網路掩碼就是11111111.11111111.11111111.00000000,寫成十進位制就是255.255.255.0。

  知道”子網掩碼”,就可以判斷,任意兩個IP地址是否處在同一個子網路。方法是將兩個IP地址與子網掩碼分別進行AND運算(兩個數位都為1,運算結果為1,否則為0),然後比較結果是否相同,如果是的話,就表明它們在同一個子網路中,否則就不是。

255.0.0.0

255.255.0.0

255.255.255.0

# 判斷兩個IP地址是否在同一網段   結果相同則為同一網段,反之不是, IP 和 子網掩碼 之間是 按位運算
192.168.13.26  
255.255.0.0
11000000.10101000.00001101.00011010
11111111.11111111.00000000.00000000
11000000.10101000.00000000.00000000 = 192.168.0.0

192.168.12.134
255.255.0.0
11000000.10101000.00001100.10000110
11111111.11111111.00000000.00000000
11000000.10101000.00000000.00000000 = 192.168.0.0

# 結果都是192.168.0.0,因此它們在同一個子網路。

(9)、port 埠 : 0 - 65535

​ 一臺擁有IP地址的主機可以提供許多服務,比如Web服務、FTP服務、SMTP服務等,這些服務完全可以通過1個IP地址來實現。那麼,主機是怎樣區分不同的網路服務呢?顯然不能只靠IP地址,因為IP地址與網路服務的關係是一對多的關係。實際上是通過“IP地址+埠號”來區分不同的服務的。

​ IP + port 能夠唯一的確認網路上的一臺機器上的一個服務。

2、網際網路協議與OSI模型

(1)osi七層協議

應用層 : 網路服務與終端使用者的一個介面
表示層 : 資料的表示、安全、壓縮。(在五層模型裡面已經合併到了應用層)
會話層 : 建立、管理、終止會話。(在五層模型裡面已經合併到了應用層)
傳輸層 : 定義傳輸資料的協議埠號,以及流控和差錯校驗。
網路層 : 進行邏輯地址定址,實現不同網路之間的路徑選擇。
資料鏈路層 : 建立邏輯連線、進行硬體地址定址、差錯校驗等功能。(由底層網路定義協議)
物理層 : 建立、維護、斷開物理連線。(由底層網路定義協議)

(2)osi五層協議

應用層(五層)
傳輸層(四層)        埠         UDP協議 / TCP協議             四層交換機      四層路由器
網路層(三層)       			  IPV4協議  / IPV6協議            路由器        三層交換機
資料鏈路層(二層)     mac             arp協議                     網絡卡         (二層)交換機
物理層(一層)

3、TCP/UDP協議

(1)、TCP協議

​ 當應用程式希望通過 TCP 與另一個應用程式通訊時,它會發送一個通訊請求。這個請求必須被送到一個確切的地址。在雙方“握手”之後,TCP 將在兩個應用程式之間建立一個全雙工 (full-duplex) 的通訊。這個全雙工的通訊將佔用兩個計算機之間的通訊線路,直到它被一方或雙方關閉為止。

用途:上傳,下載
特性:安全可靠、 面向連線、 速度慢、 能傳遞的資料長度不限
過程:
建立連線   --  三次握手
訊息傳遞   --  可靠傳輸
斷開連線   --  四次揮手
TCP三次握手的過程如下:
    客戶端傳送SYN(SEQ=x)報文給伺服器端,進入SYN_SEND狀態。
	伺服器端收到SYN報文,迴應一個SYN (SEQ=y)ACK(ACK=x+1)報文,進入SYN_RECV狀態。
	客戶端收到伺服器端的SYN報文,迴應一個ACK(ACK=y+1)報文,進入Established狀態。
三次握手完成,TCP客戶端和伺服器端成功地建立連線,可以開始傳輸資料了。
TCP四次揮手的過程如下:
建立一個連線需要三次握手,而終止一個連線要經過四次揮手,這是由TCP的半關閉(half-close)造成的。
(1) 某個應用程序首先呼叫close,稱該端執行“主動關閉”(active close)。該端的TCP於是傳送一個FIN分節,表示資料傳送完畢。
(2) 接收到這個FIN的對端執行 “被動關閉”(passive close),這個FIN由TCP確認。
注意:FIN的接收也作為一個檔案結束符(end-of-file)傳遞給接收端應用程序,放在已排隊等候該應用程序接收的任何其他資料之後,因為,FIN的接收意味著接收端應用程序在相應連線上再無額外資料可接收。
(3) 一段時間後,接收到這個檔案結束符的應用程序將呼叫close關閉它的套接字。這導致它的TCP也傳送一個FIN。
(4) 接收這個最終FIN的原發送端TCP(即執行主動關閉的那一端)確認這個FIN。
既然每個方向都需要一個FIN和一個ACK,因此通常需要4個分節。
注意:
(1) “通常”是指,某些情況下,步驟1的FIN隨資料一起傳送,另外,步驟2和步驟3傳送的分節都出自執行被動關閉那一端,有可能被合併成一個分節。
(2) 在步驟2與步驟3之間,從執行被動關閉一端到執行主動關閉一端流動資料是可能的,這稱為“半關閉”(half-close)。
(3) 當一個Unix程序無論自願地(呼叫exit或從main函式返回)還是非自願地(收到一個終止本程序的訊號)終止時,所有開啟的描述符都被關閉,這也導致仍然開啟的任何TCP連線上也發出一個FIN。
無論是客戶還是伺服器,任何一端都可以執行主動關閉。通常情況是,客戶執行主動關閉,但是某些協議,例如,HTTP/1.0卻由伺服器執行主動關閉。

(2)、UDP協議

​ 當應用程式希望通過UDP與一個應用程式通訊時,傳輸資料之前源端和終端不建立連線。當它想傳送時就簡單地去抓取來自應用程式的資料,並儘可能快地把它扔到網路上。

用途:即時通訊工具
特性:不可靠、 面向資料報、 速度快、 能傳遞的資料長度有限
過程:

不管對方在不線上 直接傳送

不佔連線

隨時可以收發訊息

(3)、TCP和UDP的比較:

​ TCP --- 傳輸控制協議,提供的是面向連線、可靠的位元組流服務。當客戶和伺服器彼此交換資料前,必須先在雙方之間建立一個TCP連線,之後才能傳輸資料。TCP提供超時重發,丟棄重複資料,檢驗資料,流量控制等功能,保證資料能從一端傳到另一端。
​ UDP --- 使用者資料報協議,是一個簡單的面向資料報的運輸層協議。UDP不提供可靠性,它只是把應用程式傳給IP層的資料報傳送出去,但是並不能保證它們能到達目的地。由於UDP在傳輸資料報前不用在客戶和伺服器之間建立一個連線,且沒有超時重發等機制,故而傳輸速度很快。

	現在Internet上流行的協議是TCP/IP協議,該協議中對低於1024的埠都有確切的定義,他們對應著Internet上一些常見的服務。這些常見的服務可以分為使用TCP埠(面向連線)和使用UDP埠(面向無連線)兩種。 
	說到TCP和UDP,首先要明白“連線”和“無連線”的含義,他們的關係可以用一個形象地比喻來說明,就是打電話和寫信。兩個人如果要通話,首先要建立連線——即打電話時的撥號,等待響應後——即接聽電話後,才能相互傳遞資訊,最後還要斷開連線——即掛電話。寫信就比較簡單了,填寫好收信人的地址後將信投入郵筒,收信人就可以收到了。從這個分析可以看出,建立連線可以在需要痛心地雙方建立一個傳遞資訊的通道,在傳送方傳送請求連線資訊接收方響應後,由於是在接受方響應後才開始傳遞資訊,而且是在一個通道中傳送,因此接受方能比較完整地收到傳送方發出的資訊,即資訊傳遞的可靠性比較高。但也正因為需要建立連線,使資源開銷加大(在建立連線前必須等待接受方響應,傳輸資訊過程中必須確認資訊是否傳到及斷開連線時發出相應的訊號等),獨佔一個通道,在斷開連線錢不能建立另一個連線,即兩人在通話過程中第三方不能打入電話。而無連線是一開始就傳送資訊(嚴格說來,這是沒有開始、結束的),只是一次性的傳遞,是先不需要接受方的響應,因而在一定程度上也無法保證資訊傳遞的可靠性了,就像寫信一樣,我們只是將信寄出去,卻不能保證收信人一定可以收到。 
	TCP是面向連線的,有比較高的可靠性, 一些要求比較高的服務一般使用這個協議,如FTP、Telnet、SMTP、HTTP、POP3等。
	UDP是面向無連線的,使用這個協議的常見服務有DNS、SNMP、QQ等。對於QQ必須另外說明一下,QQ2003以前是隻使用UDP協議的,其伺服器使用8000埠,偵聽是否有資訊傳來,客戶端使用4000埠,向外傳送資訊(這也就不難理解在一般的顯IP的QQ版本中顯示好友的IP地址資訊中埠常為4000或其後續埠的原因了),即QQ程式既接受服務又提供服務,在以後的QQ版本中也支援使用TCP協議了。