1. 程式人生 > >python---網絡編程

python---網絡編程

訪問 交換 對話 因特網 str 接收 但是 比較 客戶端

一、軟件開發的架構

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(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。[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(bhi)        #向客戶端發送信息
conn.close()       #關閉客戶端套接字
sk.close()        #關閉服務器套接字(可選)
服務端 技術分享圖片
import socket
sk = socket.socket()           # 創建客戶套接字
sk.connect((127.0.0.1,8898))    # 嘗試連接服務器
sk.send(bhello!)
ret = sk.recv(1024)         # 對話(發送/接收)
print(ret)
sk.close()            # 關閉客戶套接字
客戶端

 

python---網絡編程