1. 程式人生 > >Python課程回顧(day26)網路程式設計

Python課程回顧(day26)網路程式設計

一  客戶端/服務端架構(C/S架構)

  在瞭解網際網路協議之前我們需要先了解一個知識點,即C/S與B/S架構

  所謂的CS架構指的就是client(客戶端)與server(伺服器)結合的一種結構,是服務端根據需求給客戶端提供服務的一種架構

  而B/S架構指的就是browser(瀏覽器)與server結合的一種結構,而B/S架構也是C/S架構的一種

  我們要學的網路程式設計就是為了要完成C/S架構的開發!

 

OSI七層協議

  我們首先要知道,我們的計算機都是分為硬體、作業系統、應用程式這三層的,有了這三層我們才可以使用計算機來進行一系列的工作,不過這些工作都只能是一些單機程式,即只能自己跟自己玩,既不能與其他計算機通訊,也不能訪問其他計算機的資料:

              

  那麼如果你想要實現這些功能,那就必需接入網際網路

              

 

 

  而網際網路又是什麼呢?

  網際網路的本質就是一堆協議,你想,我們人類之間通訊必須要建立在一個語言標準之上,那麼計算機又何嘗不是,假設每臺計算機都有自己的一個標準,那麼想要通訊是不是首先知道並學習對方的標準呢?而OSI七層協議做的就是這個事情,將計算機與計算機之間的通訊標準給統一了起來,統一起來之後所有的計算機都按照這個標準去收發資訊就可以完成通訊。

  人們按照分工的不同將網際網路協議從邏輯上劃分了等級,這就是OSI七層協議。

  如圖:

        

 

  每層執行時常見的物理裝置:

        

  

  從上圖我們可以看出,其實應用層、表示層、會話層其實都屬於應用層的範圍,我們平時操作的都是應用層,越往下越靠近硬體,但其實這五層協議從上到下,每一層都依賴於下一層。所以我們從最底層開始瞭解,只要搞清楚了每層協議的主要內容,就理解了網際網路通訊的基本原理。

 

1.物理層

  上面提到:計算機如果想要與其他計算機通訊就必須要連結到internet,那麼物理層就是以一些物理連結介質來將所有計算機都連結到internet這個大家庭中,而這些介質的主要功能則是基於電的特性發送高低電壓或電訊號,高電壓對應數字1,低電壓對應數字0。

        

 

2.資料鏈路層

  其實單純的只發送高低電訊號是沒有任何意義的,而資料鏈路層的功能就是將電訊號進行了一系列的分組,即多少電訊號位為一組,每組又代表著什麼意思。而在早期,每個公司的計算機都有著自己的分組方式,這代表著計算機只能在公司內之間相互通訊,發到另外一個計算機是沒有用的。這在很大程度上阻礙了計算機的發展。所以就有了乙太網協議

  乙太網協議:

    每一組電訊號構成一個數據報,也叫做‘幀’

    而每一組資料報則分為報頭與資料兩個部分

    

    head中包含了固定的18個位元組,指的就是對資料報的描述。

      傳送者名稱|傳送者地址,佔用6個位元組

      接收者名稱|接收者地址,佔用6個位元組

      資料的型別,佔用6個位元組

    data中則包含資料報的具體內容:

      最短46個位元組最長1500位元組的資料報內容

    若要傳送的資料報總體長度超過head與data規定的範圍內,那就分片傳送

    

源地址與目標地址的由來:

    但凡接入Internet的計算機都必須具備一個唯一的地址,即我們的網絡卡,也稱之為mac地址,而傳送端與接收端訊息的傳遞就是基於mac地址進行通訊的,而mac地址則是在計算機出廠時就有的一個全世界唯一的地址,長度為48位2進位制,通常由12位16進位制數表示(前六位是廠商地址,後六位是流水線號)。

  其實有了mac地址,同一網路內的兩臺主機就可以實現通訊了,而乙太網採用的通訊方式非常古老,即通訊基本靠吼:

        

 

3.網路層

  基於乙太網規定的協議,我們又有了mac地址,其實目前已經可以實現世界上所有的計算機都可以通訊了,但問題是網際網路是由一個個隔離的小的區域網組成的,如果所有的通訊都採用乙太網的廣播方式,那麼一臺機器傳送的包全世界都會收到,如果世界上所有的計算機同時發包,那麼沒有任何一臺計算機是可以儲存這麼大的資訊量的,這就不僅僅是效率的問題了,如圖:

        

 

 

從圖中我們可以得出結論:若所有的計算機都將資料包傳送到Internet,那所有人都會收到一份,不僅計算機會卡死,資料若想要找到具體的mac地址就不知道需要多久了。

  所以我們必須找到一種方法來區分哪些計算機在同一個區域網,哪些計算機不在同一個區域網,如果在,那就使用廣播的方式傳送資料,如果不在,那就使用向不同廣播域分發資料包的方式(也稱為路由方式)傳送資料。而網路層的功能就是引入一套新的地址用來區分不同的廣播域、子網,這套地址就稱為網路地址(IP協議)。

  IP協議:

    IP協議中所定義的網路地址統稱為IP地址,廣泛採用的是IPv4版本,它規定的網路地址由32位二進位制數表示

    IP協議規定的網路地址範圍:0.0.0.0 ---> 255.255.255.255

    每個IP通常以四段十進位制數來表示: 例如 --> 192.168.10.1

  IP地址:

    每個IP地址都分為兩個部分:

      網路部分:標識子網

      主機部分:標識主機

  需要強調的是:單純的IP地址只是標識了IP地址的種類,該種類無論從網路部分還是主機部分都無法識別一個IP所處的子網

         例:不要單純的以為 172.16.10.1 與 172.16.10.2 是處於同一子網內的

 

  子網掩碼

    子網掩碼指的其實就是網路特徵的一個引數,它在形式上等同於IP地址,也是一個32位的二進位制數字,它的網路部分全部為1,主機部分全部為0。而知道了子網掩碼其實我們就能判斷任意兩個IP地址是否處於同一個子網,方法是將兩個IP地址與子網掩碼分別進行AND運算(兩個數位都為1,運算結果才為1,否則為0),然後比較結果是否相同,如果是的話,就表明他們在同一子網內,否則就不是。總的來說,IP協議的主要作用有兩個,一是為每一臺計算機分配網路地址,二是確定哪些計算機在同一子網。

  IP資料包

    IP資料包也分為報頭和資料兩部分,無須為IP包定義單獨的欄位,直接放入乙太網的資料部分。報頭的長度為20到60位元組,資料的長度為0到65515位元組。但乙太網協議規定的資料最長位元組長度為1500,所以如果資料長度超過1500,就需要分割成幾個乙太網資料包分開發送。

  ARP協議

    上面提到過,目前計算機的通訊都是以廣播的方式進行通訊的,而所有上層的包到最後都要封裝上乙太網的報頭,然後再通過乙太網協議進行傳送,而乙太網協議的通訊又是基於mac地址的廣播方式進行實現的,所以計算機在發包的時候,獲取自身mac地址是很容易的,但如何獲取目標主機的mac地址呢?那麼ARP協議的作用就是幫助我們獲取對方主機mac地址的。

  ARP協議工作原理

    一:ARP協議首先通過IP地址和子網掩碼區分出自己所處的子網地址。

    二:分析本機的IP地址與對方的IP地址是否處於同一子網,若不是同一子網,則或獲取當前子網的閘道器地址,再由閘道器地址傳送到目標IP所在的閘道器地址。

    三:若處於同一子網內,這個包則會以廣播的方式在傳送端所處的子網內進行傳輸,所有子網的主機都會進行拆包,若發現目標為自己的計算機,則響應並返回自己的mac地址,ARP協議收到地址後會記錄當前計算機的mac地址以便於下一次傳送。

 

4.傳輸層

  雖然網路層的IP地址幫我們來區分子網,乙太網層的mac地址又幫助我們找到主機,但大家在進行計算機的一系列操作時使用的都是應用程式,即我們電腦上的各種軟體(QQ,微信,各種播放APP等等),那麼我們在找到了一臺特定的主機之後,又如何標識這臺計算機之上的應用程式呢?答案就是埠,埠是每個應用程式與網絡卡關聯的唯一編號。而傳輸層的功能就是建立伺服器埠到客戶端埠的通訊連結。埠範圍為0到6535,其中0到1024大大多數是給系統提供的,不建議使用。而傳輸層又細分為兩層協議,分別為TCP協議與UPD協議。

  TCP協議

    TCP協議傳輸又稱為可靠傳輸與TCP流式協議,TCP的資料長度是沒有具體限制的,理論上來說是可以無限延長的,但為了保證資料在網路中傳輸的效率,通常TCP的資料長度不會超過IP資料包的長度,以確保單個TCP資料包不需要再進行分割。而可靠傳輸則是由於以TCP協議進行資料傳輸時,傳輸成功會收到來自客戶端的一個確認資訊,不成功的話服務端則會在一段時間內再次進行傳送,直到收到客戶端迴應的確認收到資訊。

      

  TCP的報文

      

  

  TCP的三次握手與四次揮手

    Client:客戶端

    Server:服務端

    SYN_SENT(connect()):傳送的連結請求

    LISTEN(listen()):監聽傳送的連結請求,可以設定一個半連結池,即同一時間可以接收的最大請求數。

    SYN_RCVD:

    ESTABLISHED:建立成功的結果

    FIN_WAIT:

    CLOSE_WAIT:

    LAST_ACK:

    TIME_WAIT:

    syn,seq:傳送連結請求,並自帶一個序號seq

    ack:迴應請求,是基於seq序號的迴應

      

  UDP協議

    UDP協議傳輸又稱為不可靠傳輸,首先UDP的報頭部分一共就只有8個位元組,總長度不會超過65535個位元組,正好可以放進一個IP資料包。不可靠則指的是基於UDP協議進行的傳輸是不會等待也不需要客戶端的迴應資訊的,資料發出去之後就不會管客戶端有沒有收到。而UDP可以確保資料完整的位元組數僅僅只有512個位元組。

      

  

 

5.應用層