Python網路程式設計零基礎1
阿新 • • 發佈:2018-12-08
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)伺服器
建立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()