python---網絡編程
一、軟件開發的架構
1: C/S架構
Client與Server 客戶端與服務器端,這裏的客戶端一般泛指客戶端應用EXE,程序需要先安裝後,才能運行在用戶的電腦上,對用戶的電腦操作系統環境依賴較大。
2: B/S架構
Browser與Server 瀏覽器端與服務器端。
Browser瀏覽器,其實也是一種Client客戶端,只是這個客戶端不需要去安裝什麽應用程序,只需在瀏覽器上通過HTTP請求服務器端相關的資源。
二、網絡基礎
IP地址:指互聯網協議地址。
IP地址是IP協會提供的一種統一的地址格式,它為互聯網上的每一個網絡和每一臺主機分配一個邏輯地址,以此來屏蔽物理地址的差異。
IP地址是一個32位的二進制數,通常被分割為4個‘8位二進制數’。
IP地址通常用“點分十進制”表示(a,b,c,d)的形式,其中,a,b,c,d都是0~255之間的十進制整數。
端口可以認為是設備與外界通訊交流的出口。
因此IP地址可以精確到具體的一臺電腦,而端口精確到具體的程序。
通過子網掩碼,我們就能判斷,任意兩個IP地址是否處在同一個子網絡。方法是將兩個IP地址與子網掩碼分別進行AND運算(兩個位數都是1,則結果1,反之0),然後比較結果是否相同,如果是的話,就表示它們在同一個子網絡中,否則就不是。
總結一下,IP協議的作用主要有兩個:一個是為每一臺計算機分配IP地址,另一個是確定哪些地址在同一個子網絡。
TCP協議
TCP---傳輸控制協議,提供的是面向連接、可靠的字節流服務。當客戶與服務器彼此交換數據前,必須先在雙方之間建立一個TCP連接,之後才能傳輸數據。TCP提供超時重發,丟棄重復數據,檢驗數據,流量控制等功能,保證數據能從一端傳輸到另一端。
可靠的、面向連接的協議(eg:打電話)、傳輸效率低全雙工通信(發送緩存&接收緩存)、面向字節流。使用TCP的應用:Web瀏覽器;電子郵件、文件傳輸程序。
TCP是因特網中的傳輸層協議,使用三次握手協議建立連接。當主動方發出SYN連接請求後,等待對方回答SYN+ACK[1],並最終對對方的 SYN 執行 ACK 確認。這種建立連接的方法可以防止產生錯誤的連接。[1] TCP三次握手的過程如下: 客戶端發送SYN(SEQtcp的三次握手=x)報文給服務器端,進入SYN_SEND狀態。 服務器端收到SYN報文,回應一個SYN (SEQ=y)ACK(ACK=x+1)報文,進入SYN_RECV狀態。 客戶端收到服務器端的SYN報文,回應一個ACK(ACK=y+1)報文,進入Established狀態。 三次握手完成,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。[1] 既然每個方向都需要一個FIN和一個ACK,因此通常需要4個分節。 註意: (1) “通常”是指,某些情況下,步驟1的FIN隨數據一起發送,另外,步驟2和步驟3發送的分節都出自執行被動關閉那一端,有可能被合並成一個分節。[2] (2) 在步驟2與步驟3之間,從執行被動關閉一端到執行主動關閉一端流動數據是可能的,這稱為“半關閉”(half-close)。 (3) 當一個Unix進程無論自願地(調用exit或從main函數返回)還是非自願地(收到一個終止本進程的信號)終止時,所有打開的描述符都被關閉,這也導致仍然打開的任何TCP連接上也發出一個FIN。 無論是客戶還是服務器,任何一端都可以執行主動關閉。通常情況是,客戶執行主動關閉,但是某些協議,例如,HTTP/1.0卻由服務器執行主動關閉。[2]tcp的四次揮手
UDP協議
UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,但是並不能保證它們能到達目的地。由於UDP在傳輸數據報前不用在客戶和服務器之間建立一個連接,且沒有超時重發等機制,故而傳輸速度很快。
不可靠的、無連接的服務,傳輸效率高(發送前時延小),一對一、一對多、多對一、多對多、面向報文,盡最大努力服務,無擁塞控制。使用UDP的應用:域名系統 (DNS);視頻流;IP語音(VoIP)。
互聯網協議按照功能不同分為osi七層或tcp/ip五層或tcp/ip四層
每層運行常見的物理設備
傳輸層——> 四層交換機、四層的路由器
網絡層——>路由器、三層交換機
數據鏈路層——>網橋、以太網交換機、網卡
物理層——>中繼器、集線器、雙絞線
每層運行常見的協議
應用層——>。。。
傳輸層——>TCP與UDP協議
網絡層——>ip協議
數據鏈路層——>arp協議
物理層——>。。。
三、socket
Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。
基於文件類型的套接字家族
套接字家族的名字:AF_UNIX
unix一切皆文件,基於文件的套接字調用的就是底層的文件系統來取數據,兩個套接字進程運行在同一機器,可以通過訪問同一個文件系統間接完成通信
基於網絡類型的套接字家族
套接字家族的名字:AF_INET
(還有AF_INET6被用於ipv6,還有一些其他的地址家族,不過,他們要麽是只用於某個平臺,要麽就是已經被廢棄,或者是很少被使用,或者是根本沒有實現,所有地址家族中,AF_INET是使用最廣泛的一個,python支持很多種地址家族,但是由於我們只關心網絡編程,所以大部分時候我麽只使用AF_INET)
基於TCP協議的socket
tcp是基於鏈接的,必須先啟動服務端,然後再啟動客戶端去鏈接服務端
import socket sk = socket.socket() sk.bind((‘127.0.0.1‘,8898)) #把地址綁定到套接字 sk.listen() #監聽鏈接 conn,addr = sk.accept() #接受客戶端鏈接 ret = conn.recv(1024) #接收客戶端信息 print(ret) #打印客戶端信息 conn.send(b‘hi‘) #向客戶端發送信息 conn.close() #關閉客戶端套接字 sk.close() #關閉服務器套接字(可選)服務端
import socket sk = socket.socket() # 創建客戶套接字 sk.connect((‘127.0.0.1‘,8898)) # 嘗試連接服務器 sk.send(b‘hello!‘) ret = sk.recv(1024) # 對話(發送/接收) print(ret) sk.close() # 關閉客戶套接字客戶端
python---網絡編程