1. 程式人生 > >Python網路程式設計零基礎1

Python網路程式設計零基礎1

1. 網路的概念

1)網路:多個節點通過特定的介質聯絡起來
         的一種關係
2)計算機網路:以計算裝置作為節點
               通訊線路作為介質的網路
3)網際網路(英特網)
   把許多的網路連在一起的網路
4)起源:起源於冷戰

2. 網路功能

1)資料與資訊的傳輸
2)資源的共享
3)打破時空的限制

3. 網路分類:

   範圍
   1)區域網:小範圍網路,位於同一個網段的網路
   2)都會網路:比區域網範圍稍大的網路
   3)廣域網:更大範圍的網路

使用者群體

   1)專用網:針對特定使用者,例如軍用網、金融網
   2)公用網:針對公眾的

4. 網路效能的衡量指標

1)頻寬:通訊通道支援的最高資料傳輸頻率
        單位:Mb/s, Kb/s, Gb/s
    100M 100Mbits
    b ==> bits   二進位制位
    B ==> Byte   位元組(8bits)

2)傳輸速率:每秒傳輸多少個bits資料

3)吞吐量:單位時間內通過某個網路的資料量

4)時延:傳送到完成接收之間的時間差
- 傳輸時延:從傳送到傳送完成的時間
- 傳播時延:電磁波、電訊號在介質中傳輸
            所必須的時間
- 處理時延:網路資料交換節點進行
            儲存、轉發時候所需的時間
    - 排隊時延:網路節點佇列分組、排隊所經歷
            的時間

      * 路由器(router):網路核心裝置

5. 網路程式設計的幾個術語

1)伺服器:提供網路服務的一方
2)客戶端:請求服務的一方
3)通訊:資料傳輸或交換的過程
4)協議(protocol):一組規則,資料的組織、
      編碼、傳輸、校驗、解析規則
  a =====> a

6. 網路通訊的過程

   客戶端          伺服器
   請求服務        接收請求
                   解析請求
		   處理請求
		   返回響應
   顯示響應結果

7. 網路通訊要解決的問題

   		客戶端---------伺服器

   如何找到對方---------如何讓對方找到自己
   如何聯絡對方---------如何讓對方聯絡自己
   如何進行數正確傳輸---------如何進行數正確傳輸
   如何讓對方正確理解自己的意思
   如何結束對話---------如何結束對話

   1)查閱域名系統(如果知道IP,可以直接連線對方)
     www.baidu.com(域名)===>119.75.217.26(IP)  
       域名系統:DNS
       伺服器到域名系統註冊、備案

   2)客戶端主動向伺服器發出連線請求
      伺服器接收客戶端發出的連線請求
      (三次握手)

   3)正確傳輸:通訊協議來保證

   4)如何正確理解對方意思:應用協議來保證

   5)釋放連線:釋放資源(四次揮手)

**8. 協議**
   - 一組規則,規定了資料組織、編碼、傳送、
     傳輸、解析的標準
   - 由權威的機構制定或通訊雙方約定
   - 通訊的參與方都必須遵守

9. ISO/OSI七層參考模型

   ISO:國際標準化組織
   OSI:開放式系統互聯參考模型

   功能:網路通訊過程的標準化
         把網路通訊過程分為7個層次
	 每個層次完成特定的任務
	 
分解:分解過程,分解規模,降低複雜度

   優點:分解問題規模,降低複雜度
         各司其職
	 解耦

   #### TCP/ IP七個層次:
   
	    7 應用層(Application):
	      提供使用者服務,具體定義程式或服務的功能
	      常用的應用協議有:
		http(用於超本文傳輸)
		pop3(郵件接收)
		smtp(郵件傳送)
		telnet(遠端登入)
		ftp(檔案傳輸協議)
	
	    6 表示層(Presentation):
	       資料的壓縮、優化、加密
	
	    5 會話層(session):
	       建立應用的連線,選擇合適的傳輸服務
	
	    4 傳輸層(Transportation):
	       負責程序到程序間的通訊
	       保證可靠性傳輸、差錯校驗、流量控制
	
	    3 網路層(Network):
	       負責主機到主機之間的通訊
	       路由選擇(定址)、分段、網路互連
	
	    2 資料鏈路層(Data Link):
	       負責相鄰主機間的通訊
	       進行資料交換、控制訊息收發、鏈路的連線
	
	    1 物理層(Physical):
	       定義機械、電器、物理標準
	       硬體特性、物理介面標準、傳輸介質

七層模型的特點:

   1. 建立了統一的網路工作流程
   2. 每個層次功能清晰,各司其職
   3. 方便了網路產品開發,推動了網路發展
   4. 沒有實現

TCP/IP四層模型

   應用層(應用層、表示層、會話層)
   傳輸層
   網路層
   物理鏈路層(物理層、資料鏈路層)

五層模型

   應用層(應用層、表示層、會話層)
   傳輸層
   網路層
   資料鏈路層
   物理層

10. 封裝、解封

   封裝:每個層接收上一層傳遞的資料
         加入本層的控制資訊(包頭)
	 並且傳遞給下一層
   解封:每層接收下一層傳遞的資料
         讀取並去掉本層的控制資訊
	 並且將資料傳給上一層

11. 資料包如何尋找路徑

- 每個網路節點都有一個IP地址(全球唯一)
- 資料封包的過程中
  包含了資料的源地址、目的地址
- 網路轉發裝置,根據包頭中記載的目的地址
  進行路徑的查詢(路由表)
  如果路由表包含到達目的主機的路徑,則傳送
  如果路由表不包含到達目的主機的路徑
  則轉發給下一個節點
  每個資料包包含一個生命週期值,每經過一個
  轉發節點,該值就減1,如果該值為0還未
  轉發到目的地址,該包就會被丟棄

12. IP地址

1)用32bits儲存(IPV4)
11111111 11111111 11111111 11111111(真實)
255.255.255.255 (點分十進位制表示法)
每部分的取值0~255
* ipconfig(windows)
  ifconfig(Linux/Unix)

IP地址構成:網路地址 + 主機地址

        172.40.91.140
* 掩碼:255.255.255.0

 255轉換成二進位制:
 11111111 11111111 11111111 00000000
 
 掩碼前面連續為1的部分是網路地址
 其它部分為主機地址

 私網地址:預留的一部分地址段,內網使用
A類:10.0.0.1--10.255.255.254
B類:172.16.0.1--172.31.255.254
C類:192.168.0.1--192.168.255.254

 特殊IP地址:
 127.0.0.1   代表本機地址(迴環地址)
 0.0.0.0     本機繫結的所有IP地址  
 
 主機地址全部為1:表示廣播地址
 例如:192.168.0.5 (C類)
       192.168.0.255  (主機部分全部為1)
        表示192.168.0網段的廣播地址
	
 主機地址全部為0,表示網路地址(網段)
 例如:192.168.0.5 (C類)
       192.168.0.0 (主機部分全為0)
        表示192.168.0這個網段

 練習:有IP地址 192.168.10.25
       掩碼:255.255.252.0
   
   求:網路地址
       求廣播地址
  計算方式:
  第一步:將IP轉換成二進位制
    11000000 10101000 00001010 00011001
  第二步:將掩碼轉成二進位制
    11111111 11111111 11111100 00000000

  第三步:取出前22bits為網路地址
          後面部分全部替換成0,轉換成10進位制
    11000000 10101000 00001000 00000000
   192.168.8.0  (網路地址)

    22bits後面部分全部換成1,轉換成10進位制
    11000000 10101000 00001011 11111111
       192.168.11.255 (廣播地址)

13. 埠

  1)作用:區分或標記不同的服務/應用
  2)長度:16bits,1~65535
  3)說明:
     1~1023  系統保留使用
     1024~65535  應用
  4)常見埠:
     80    HTTP服務埠
     21    FTP服務埠
     22    SSH(加密遠端登入)埠
     23    telnet埠
     3306  MySQL預設埠

     linux下使用下面的命令檢視埠是否開啟
        netstat -an | grep 埠號

     對於遠端主機,連線遠端的主機埠,看是否成功
	可以使用netcat,telnet工具連線埠

14. 傳輸層(TCP、UDP)

1)TCP:傳輸控制協議
        提供可靠傳輸
        資料無丟失、無重複、無差錯

   如何實現可靠傳輸
      - 面向連線的傳輸方式
  - 每個資料包都有一個序號,用來
    保證資料傳輸中不丟包、不重複
  - 流量控制

   連線建立過程(三次握手)
     - 客戶端向伺服器發起連線請求
   並且帶上自己當前的序號N
 - 服務收到連線請求後,產生一個應答
   帶兩個序號
          N+1:期望客戶端下一個包的序號
      K:自己的序號 
 - 客戶收到應答後,再給伺服器一個應答
   帶上序號K+1(期望伺服器下一個包序號為
   K+1)

   斷開連線:四次揮手
     - 主動方傳送斷開請求
 - 被動方收到請求,立即返回
   表示準備斷開
 - 被動方處理完訊息,完成斷開準備
   傳送報文,表示可以斷開
 - 主動方收到指令,傳送報文確認斷開
   
   適用場景:資料量較大、可靠性要求高
       例如:網頁訪問,檔案下載,網路遊戲

2)UDP:使用者報文協議
特點:無連線、不可靠傳輸
適用:資料量小、可靠性要求不高的情況
例如:QQ傳送文字資訊,DNS

  1. 伺服器、客戶端工作流程
    1)伺服器
    建立socket -> 繫結地址 -> 監聽 -> 接收請求
    迴圈收發資料 ->
    關閉連線

2)客戶端
建立socket -> 發起連線 -> 收發資料 -> 關閉

==== 套接字socket的使用 ====

1. 什麼是套接字
  1)用於計算機網路通訊的一種介面
     利用socket可以在系統軟體實現資料的收發
     最早由加州大學伯克利分校開發
     是目前計算機網路通訊的基礎、標準
     計算機雙方要通訊,必須建立在socket上

  2)套接字的型別
     - 流式套接字(SOCK_STREAM)
       + 面向連線、可靠傳輸、資料無差錯的收發序列
       + 流量控制功能
       + 資料被看成位元組流,長度無限制,多個數據包
         同時流入
    - 資料報套接字(SOCK_DGRAM)
       + 無連線、不可靠傳輸、資料可能丟包、重複
       + 資料構成為一個個獨立的報文
         每一次傳送資料就是一個數據報

  3)socket主要函式   
    - 建立:sokcet(socket_family=AF_INET,
                   socket_type=SOCK_STREAM,
		   proto=0)
	 引數:
	   socket_family  地址族型別,預設AF_INET
	   socket_type  套接字型別
	                SOCK_STREAM 流式套接字
			SOCK_DGRAM  資料報套接字
	  proto     子協議型別,預設填寫0

- 繫結:bind
    格式:bind(address)
引數:address  地址元組
      第一個值為IP地址
      第二個值為埠地址

- 監聽:listen
    格式:listen(backlog)
引數:backlog  未接收連線請求個數
      超過該值,則會拒絕後面的請求

- 接受連線:accept
    格式:sockfd, addr = s.accept()
功能:阻塞,等待客戶端連線
      如果有新的連線,接受連線並返回
      返回兩個引數
        sockfd: 新建立的socket,用於資料傳輸
	addr: 客戶端地址

- 傳送:send
  格式:send(data)
  引數:要傳送的訊息,要求bytes
  返回:返回實際傳送的位元組數

- 接收:recv
  格式:data = s.recv(buffersize)
  引數:buffersize 表示最多接收多少位元組
  返回值:返回接收到的資料
          如果對方傳送完成或關閉連線
      返回None

- 連線:connect(只能在客戶端使用)
  格式:connect(address)
  引數:address  伺服器地址

- 關閉連線:close
  格式:s.close()


基礎只是參考前面部落格


###基於TCP複製檔案程式碼

服務端
# 建立Socket
from socket import *
sk = socket()
# 繫結
sk.bind(('0.0.0.0',9999))
# 監聽
sk.listen()
# 阻塞等待緩衝區資料
conn,addr = sk.accept()
print('客戶端連線已建立:',addr[0])
# 接收資料
try:
    f =  open('ss.jpg','wb')
    while True:
        fs = conn.recv(1024)
        print('檔案接收完畢')
        if not fs:
            break
        else:
            f.write(fs)
    f.close()
except:
    print('檔案開啟失敗!')
#關閉連線
sk.close()
conn.close()

# 建立Socket 連線
客戶端
from socket import *
sk = socket()
sk.connect(('127.0.0.1',9999))
#讀取檔案
try:
    f = open('D:/Vscode/Mon02Demo/NetServer/Demo4/work/s.jpg','rb')
    while True:
        fs = f.read(1024)
        
        if not fs:
            break
        else:
            print(fs)
            sk.send(fs)
    f.close()
except:
    print('檔案讀取失敗')
sk.close()