python核心編程筆記——網絡編程(一)


. 題外話:私以爲這本書挺好的,在講一個大塊的時候會先介紹相關的知識,然後再是在python中的應用。

客戶端/服務器架構

. 無論是軟件還是硬件系統,相同的前提都是:服務器是一系列軟件或硬件,爲一個或多個客戶端提供所需的“服務”,其存在的唯一目的就是等待客戶端的請求,並響應它們,然後等待更多的需求。
  從另一方面,客戶端因特定的請求聯繫服務器,併發送必要的數據,然後等待服務器的迴應,最後完成請求或給出故障的原因。客戶端會對服務器進行一次性的請求,然後接受該服務,最後結束他們之間的事務,客戶端每次發送的請求都被當做不同的事務。

硬件客戶端/服務器架構

. 打印服務器是硬件服務器的一個例子。它們處理傳入的打印作業並將其發送給系統中的打印設備。這樣的計算機通常可以通過網絡進行訪問,並且客戶端計算機向它發送打印請求。
  另一個例子是文件服務器。這些通常是擁有龐大的存儲容量的計算機,可悲客戶端遠程訪問,支持文件服務器的一個最流行的網絡操作系統是sun公司的網絡文件系統(NFS)。它們的目的是讓客戶端訪問網絡磁盤和訪問本地磁盤擁有相同的體驗。

軟件客戶端/服務器架構

. 軟件服務器也是運行在硬件之上,但是沒有像硬件服務器那樣的專用外圍設備。軟件服務器所提供的主要服務包括程序執行、數據傳輸檢索、聚合、更新或其他類型的編程或數據操作。
  一個常見的軟件服務器是Web服務器。其一般擁有一臺或多臺計算機,在上面安裝希望提供給用戶的web頁面和web應用程序,然後啓動web服務器,接受來自客戶端的請求,並向客戶端回送web頁面,然後等待下一個客戶端的請求。這些服務器開啓後會儘可能的保持長時間運行,除非受到一些外力驅使(如硬件故障)纔會停止。
  數據庫服務器是另一種類型的軟件服務器。其接受客戶的存儲或是檢索請求,相應請求,然後的等待其它事務。

抽象理解

. 想像客戶端/服務器架構如何工作的一個辦法就是在腦海中構建一個畫面。一個自動取款機(ATM),它服務每一個排隊的客戶,似乎永遠也不會結束,這個隊列可能很長,也可能空無一人,但在任何給定的某個時刻,都可能會出現一個客戶。它就像一個無限循環的服務器,而每一個客戶就是一個客戶端,每個客戶端都有一個需要解決的需求,當ATM處理完一個事務,客戶就會離開,而ATM要麼爲下個客戶服務,要麼等待下一個客戶的到來。

客戶端/服務器網絡編程

. 在服務器響應客戶端請求之前,需要進行一些初步的設置流程來爲之後的工作做準備:**首先會創建一個通信端點,**它能夠使服務器監聽請求,一旦一個通信端點已經建立,監聽服務器就可以進入無限循環中,等待客戶端的連接並響應它們的請求。
  客戶端比服務器端更簡單,客戶端需要做的只是創建它的單一通信端點,然後建立一個到服務器的連接。然後客戶端就可以發出請求,該請求包括任何必要的數據交換。一旦請求被服務器處理,且客戶端收到結果或收到某種確認信息,此次通信就會被終止。

套接字:通信端點

套接字

. 套接字是計算機網絡數據結構,其體現了以上所說的“通信端點”的概念。在任何類型的通信開始之前,網絡應用程序必須創建套接字。
  套接字最初是爲同一主機上的應用程序所創建,使得主機上運行的一個程序和另一個運行的程序進行通信(進程間通信)。有兩種類型的套接字:基於文件的和麪向網絡的
  所講套接字的第一個家族是Unix套接字,其擁有一個“家族名字”AF_UNIX(又名AF_LOCAL),它代表地址家族:Unix。包括Python之內的大多數受歡迎的平臺都使用術語地址家族及其縮寫AF。
  因爲兩個進程運行在同一臺計算機上,所以這些套接字都是基於文件的,這意味着文件系統支持它們的底層基礎結構,因爲文件系統是一個運行在同一個計算機上的多個進程之間的共享常量。
  第二種類型的套接字是面向網絡的,它也有自己的家族名字:AF_INET,或者地址家族:因特網。另一個地址家族AF_INET6用於第6版因特網協議(IPv6)尋址。其他還有別的地址家族,但是AF_INET是使用的最廣泛的。

套接字地址:主機-端口號

. 一個網絡地址由主機名和端口號組成,這是網絡通信所需要的,此外並未事先說明有人在另一端進行接聽,因爲可能瀏覽一個網頁出現“無法連接服務器”等情況。
  有效的端口號範圍是0~65535(儘管小於1024的)。如果正在使用POSIX兼容系統(如Linux、Mac OS X等),那麼可以在/etc/services文件中找到預留端口號的列表(以及服務器/協議和套接字類型)。

面向連接的套接字與無連接的套接字

. 不論採用哪種地址家族,都有兩種不同風格的套接字連接。

面向連接的套接字

. 這種套接字意味着在進行通信之前需要建立一個連接,這種類型的連接又稱爲虛擬電路流套接字
  面向連接的通信提供序列化的、可靠的和不重複的數據交付,而沒有記錄邊界。這基本上意味着每條消息可以拆分爲多個片段,且每條消息片段都能確保到達目的地,然後將它們按照順序組合到一起,最後將完整的消息傳遞給正在等待的應用程序。
  實現這種連接類型的主要協議是傳輸控制協議(TCP)。爲了創建TCP套接字,必須使用SOCK_STREAM作爲套接字類型。因爲這些套接字的網絡版本使用因特網協議(IP)來搜尋網絡中的主機,所以整個系統通常結合這兩種協議來運行。

無連接的套接字

. 與虛擬電路形成鮮明對比的是數據報類型的套接字,它是一種無連接的套接字。這意味着在通信開始之前並不需要建立連接。此時,在數據傳輸的過程中並無法保證它的順序性、可靠性或重複性。然而,數據報確實保存了記錄邊界,這就意味着消息是以整體發送的,而並非首先分爲多個片段。
  這種方式就像是郵政服務,信件和包裹或許並不能以發送順序到達,事實上可能都不會到達。爲了將其添加到併發通信中,在網絡中甚至有可能存在重複的消息。
  既然有這麼多副作用,那爲什麼還要使用數據報呢?這是因爲面向連接的套接字所提供的保證導致它們的設置以及對虛擬電路連接的維護需要大量的開銷,而數據報不需要這些開銷。因此它們通常能提供更好的性能,並可能適合一些類型的應用程序。
  實現這種連接類型的主要協議是用戶數據包協議(UDP),爲創建UDP套接字,必須使用SOCK_DGRAM作爲套接字類型(其名字來源於單詞“datagram”——數據報)。因爲這些套接字也使用因特網協議來尋找網絡中的主機,所以這個系統也有一個兩種協議的組合名字UDP/IP。

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