1. 程式人生 > >python摸爬滾打之day26----網路程式設計之socket

python摸爬滾打之day26----網路程式設計之socket

1、網路通訊原理

  網際網路的本質就是一系列的網路協議, 統稱為網際網路協議.

  網際網路協議的功能:定義計算機如何接入internet,以及接入internet的計算機通訊的標準。

  網際網路協議按照功能不同分為osi七層或tcp/ip五層或tcp/ip四層.

   對於tcp\ip 五層協議, 每層執行常見物理裝置有以下幾種:

 

2、tcp\ip五層協議模型講解 

    我們將應用層,表示層,會話層並作應用層,從tcp/ip五層協議的角度來闡述每層的由來與功能,搞清楚了每層的主要協議就理解了整個網際網路通訊的原理.

    首先,使用者感知到的只是最上面一層應用層,自上而下每層都依賴於下一層,所以我們從最下一層開始切入,比較好理解.

    每層都執行特定的協議,越往上越靠近使用者,越往下越靠近硬體.

  2.1  物理層

    孤立的計算機之間要想一起玩,就必須接入internet,言外之意就是計算機之間必須完成組網.

    物理層功能:主要是基於電器特性發送高低電壓(電訊號),高電壓對應數字1,低電壓對應數字0

  2.2  資料鏈路層

    單純的電訊號0和1沒有任何意義,必須規定電訊號多少位一組.

    資料鏈路層的功能:定義了電訊號的分組方式.

    乙太網協議----ethernet

       乙太網協議規定: 一組電訊號組成一個數據包(叫做幀), 每一幀資料由報頭(head)和資料體(date)組成.

       

       報頭(18個位元組): 源Mac地址+目標Mac地址+資料型別

       data資料包含: (最短46位元組,最長1500位元組)

       每組資料包的大小: head長度+data長度=最短64位元組,最長1518位元組,超過最大限制就分片傳送

    通訊方式: 廣播     

      ethernet(乙太網) 採用最原始的方式,廣播的方式進行通訊,即計算機通訊基本靠吼. 這個包會以廣播的方式在傳送端所處的子網內傳輸, 所有主機接收後拆開包, 發現目標ip為自己的, 就響應, 返回自己的mac.

  2.3  網路層  

    有了ethernet、mac地址、廣播的傳送方式,世界上的計算機就可以彼此通訊了,問題是世界範圍的網際網路是由一個個彼此隔離的小的區域網組成的,那麼如果所有的通訊都採用乙太網的廣播方式,那麼一臺機器傳送的包全世界都會收到,數以萬計的機器傳送巨量的包不僅會造成網路擁堵癱瘓, 而且資料還不安全.

     網路層功能:引入一套新的地址用來區分不同的廣播域/子網,這套地址即網路地址.

     IP協議

       規定網路地址的協議叫ip協議, 它定義的地址稱之為ip地址, 一個ip地址通常寫成四段十進位制數,例:172.16.10.1.

       IP協議的作用主要有兩個:

        1,是為每一臺計算機分配IP地址

        2, 是確定哪些地址在同一個子網路(通過子網掩碼和and運算), 如果不是一個子網內的, 就通過Arp協議獲取閘道器的Mac地址.

    IP資料包也分為head和data部分, IP資料包直接放入乙太網包的data部分.

      乙太網資料包的”資料”部分, 最長只有1500位元組. 因此, 如果IP資料包超過了1500位元組, 它就需要分割成幾個乙太網資料包, 分開發送了.

    Arp協議

      計算機通訊基本靠吼, 即廣播的方式, 所有上層的包到最後都要封裝上乙太網頭, 然後通過乙太網協議傳送, 乙太網通訊是基於mac的廣播方式實現, 計算機在發包時,獲取自身的mac是容易的, 如何獲取目標主機的mac, 就需要通過arp協議.

    arp協議功能: 廣播的方式傳送資料包, 獲取目標主機的mac地址.

    具體的IP包長什麼樣子? 

    如果不在同一個子網內, 將IP包裡的目標Mac替換成獲取到的閘道器Mac.

  2.4  傳輸層

    網路層的IP幫我們區分子網, 乙太網層的Mac幫我們找到主機, 但是隻找到主機沒用,程式之間進行的溝通啊像QQ、瀏覽器和京東伺服器, 大家使用的都是應用程式, 你的電腦上可能同時開啟qq, 暴風影音等多個應用程式, 那麼我們通過IP和Mac找到了一臺特定的主機,如何標識這臺主機上的應用程式,答案就是埠,埠即應用程式與網絡卡關聯的編號。

    傳輸層功能:建立埠到埠的通訊(端對端通訊)    

      注意: 埠範圍0-65535,0-1023為系統佔用埠

    tcp協議

      TCP把連線作為最基本的物件, 每一條TCP連線都有一個套接字(socket), 埠號拼接到IP地址即構成了套接字, 例如IP地址為192.3.4.16, 而埠號為80, 那麼得到的套接字為192.3.4.16:80.當應用程式希望通過 TCP 與另一個應用程式通訊時, 它會發送一個通訊請求, 這個請求必須被送到一個確切的地址. 在雙方“握手”之後, TCP 將在兩個應用程式之間建立一個全雙工 (full-duplex,雙方都可以收發訊息) 的通訊. 這個全雙工的通訊將佔用兩個計算機之間的通訊線路, 直到它被一方或雙方關閉為止.

    tcp協議和udp協議的對比:

     tcp: 提供的是面向連線、可靠的位元組流服務. 當客戶和伺服器彼此交換資料前, 必須先在雙方之間建立一個tcp連線, 之後才能傳輸資料. tcp提供超時重發, 丟棄重複資料, 檢驗資料, 流量控制等功能, 保證資料能從一端傳到另一端. 

     udp: 是一個簡單的面向資料報的運輸層協議. udp不提供可靠性, 它只是把應用程式傳給IP層的資料報傳送出去, 但是並不能保證它們能到達目的地. 由於udp在傳輸資料報前不用在客戶和伺服器之間建立一個連線, 且沒有超時重發等機制, 故而傳輸速度很快.

    tcp的三次握手,四次揮手?(具體見後章節)

  2.5  應用層

    應用層功能: 規定應用程式的資料格式.

     例:tcp協議可以為各種各樣的程式傳遞資料, 比如Email、WWW、FTP等等. 那麼, 必須有不同協議規定電子郵件、網頁、FTP資料的格式, 這些應用程式協議就構成了”應用層”.

網路通訊之全流程示意圖

3、socket