標籤:strong 摻雜 文本 name block ... 結束 lis 暫停
前言:
什麼是網路?
網路是由節點和連線構成,表示諸多個物件及其相互聯絡。
在數學上,網路是一種圖,一般認為專指加權圖。
網路除了數學定義外,還有具體的物理含義,即網路是從某種相同類 型的實際問題中抽象出來的模型
在電腦領域中,網路是資訊傳輸、接收、共用的虛擬平台,通過它把各個點、面、體的資訊聯絡到一起,從而實現這些資源的共用。
網路是人類發展史來最重要的發明,提高了科技和人類社會的發展。
在1999年之前,人們一般認為網路的結構都是隨機的。但隨著Barabasi和Watts在1999年分別發現了網路的無標度和小世界特性並分別在世界著名的《科學》和《自然》 雜誌上 發表了他們的發現之後,人們才認識到網路的複雜性。
網路會藉助文字閱讀、圖片查看、影音播放、下載傳輸、遊戲、聊天等軟體工具從文字、圖片、聲音、視頻等方面給人們帶來極其豐富的生活和美好的享受。
網路目的: 網路傳輸的目的是什嗎?
由於網路的複雜性以及各種應用硬體等等不匹配原因 和編碼是一個道理你有你的我有我的會導致衝突等問題 所以出現了 :ISO(國際標準組織)
ISO是幹嘛的呢?
- 他是一個非盈利性國際組織 這個組織制定了一個用於電腦或通訊系統間的互連網標準體系
- 叫OSI模型 不僅包括一系列抽象的術語或概念,也包括具體的協議
- OSI公有七層 :
- 應用程式層: 提供使用者服務,具體的內容由特定的程式規定
- 展示層: 提供資料的加密和壓縮最佳化
- 會話層: 確定建立應用連結,選擇傳輸服務
- 傳輸層: 提供Data Transmission Service,進行流量控制
- 網路層: 路由選著,網路互聯
- 鏈路層: 提供鏈路交換,具體訊息的發送
- 物理層: 物理硬體,介面,網卡的規定
或
四層模型:
- 應用程式層 : 應用程式層 展示層 會話層
- 傳輸層 : 傳輸層
- 網路層 : 網路層
- 物理鏈路層: 鏈路層和物理層
或
五層模型(tcp/ip模型):
- 應用程式層 : 應用程式層 展示層 會話層
- 傳輸層 : 傳輸層
- 網路層 : 網路層
- 鏈路層 : 鏈路層
- 物理層 : 物理層
OSI模型優點:
- 將功能分開 降低網路中的耦合度,
- 使用開發流程更加清晰,每部分各司其職
高內聚低耦合:
- 高內聚:每個模組功能盡量單一,不會多個功能摻雜
- 低耦合:盡量降低每個模組之間的關聯性
網路通訊協定:
- 在網路通訊中協議必須遵守的規定,
- 如建立什麼串連,訊息結構如何解析等
- 應用程式層:TFTP(檔案傳輸)、HTTP(超文字傳輸通訊協定 (HTTP))、DNS(網域名稱解析)、SMTP(郵件傳輸)
- 傳輸層:TCP、UDP
- 網路層:IP
- 物理層:IEEE
iPython3:socket模組
網路相關概念: 網路主機:在網路上確定一台主機
- 本地使用:127.0.0.1 或 “localhost”
- 網路地址:“0.0.0.0” 或 “172.168.40.53”
- ifconfig:查看本機IP (ens33:本地IP lo:本地回還)
- ipconfig:windoes中
- socket.gethostname() : 擷取本機主機名稱
- socket.gethostbyname(‘tedu‘) : 利用主機名稱擷取ip
- socket.gethostbyname(‘localhost‘): 擷取本地ip
常用IP地址:
- IPv4: 點分十進位 例如:192.168.1.3 取值0~255(32位)
- IPv6: 128位
網路連接測試
ping 172.18.32.47
特殊ip
- 127.0.0.1 本地IP測試
- 0.0.0.0 自動使用本地可用網卡IP
- 192.168.1.0 代表網段
- 192.168.1.1 通常為網關地址
- 192.168.1.255 廣播位址
訪問主機IP地址: socket.gethostbyaddr(‘127.0.0.1‘) (‘
localhost‘,
[], [‘
127.0.0.1‘])
主機
別名
ip地址
IP十六進位轉換:
- socket.inet_aton(‘192.168.1.2‘)
- b‘\xc0\xa8\x01\x02‘
- socket.inet_ntoa(b‘\xc0\xa8\x01\02‘)
- ‘192.168.1.2‘
網域名稱:
連接埠號碼:
- 連接埠號碼是地址的一部分,在一個系統中每個網路(區分應用ip)
- 應用監聽不同的連接埠,以擷取對應的連接埠傳遞資訊
- 取值範圍:1---------65535
- 1---------255 一些通用連接埠(眾所周知的程式佔用)
- 256------1023 系統連接埠
- 1024-----65535 自用連接埠
擷取應用程式的連接埠:
- socket.getservbyname(‘ssh‘)
- 22
- socket.getservbyname(‘mysql‘)
- 3306
傳輸層服務:
連線導向的傳輸服務(tcp協議):
- 傳輸特徵:
- 可靠的資料轉送:
- 可靠性:無失序、無差錯、無重複、無丟失
- 在資料轉送前和傳輸後需要建立串連和取消連結
- 面向傳輸服務建立串連的過程:‘三向交握’
- 用戶端向伺服器發送連結請求
- 伺服器接受到請求進行確認,返回確認報文
- 用戶端收到伺服器回複最終確認連結
- 主動方發送報文,告知被動方要取消連結
- 被動方回複報文,表示已經接受到請求,準備斷開
- 被動方再次發送報文,表示準備處理就緒,可以斷開
- 主動方發送確認報文,取消連結
- 應用情況:
- 適用於傳輸較大的內容或檔案,網路良好,
- 需要保證傳輸可靠性的情況
- e.g. 資訊聊天,檔案上傳下載,郵件,網頁擷取
面向不需連線的傳輸服務(udp協議):
- 不保證傳輸的可靠性
- 沒有建立串連和斷開的過程
- 資料的收發比較自由
- 適用情況:
- 網路情況較差,對可靠性要求不高,收發訊息的兩端
- e.g.:網路視頻,群聊,廣播等
socket 通訊端編程:
目的:
- 通過程式設計語言提供的通訊端編程介面
- 可以更簡單的完成基於tcp/udp的編程
通訊端:
通訊端類別: 1.流式通訊端(
SOCK_STREAM):
- 傳輸層基於通訊端的協議通訊
- 連線導向可靠的傳輸 tcp的傳輸 流式通訊端
2.資料通訊端(
SOCK_DGRAM):
3.低層通訊端(SOCK_RAM):
TCP服務端:
import socket
1.建立通訊端(函數):
socket.socket(sock_family = AF_INET, sock_type = SOCK_STREAM, proto = 0)
功能:
參數:
- sock_family地址族類型 AF_INET:IPV4網路通訊
- sock_tpye:通訊端類型 SICK_STREAM :流式 SOCK_DGRAM:資料報
- proto:通常為0 選定子協議類型
- 傳回值:返回一個通訊端對象
2.綁定地址(函數):
sockfd.bind(addr)
功能:
參數:
- addr--->元組 (ip, port) ("0.0.0.0", 8888)
3.設定監聽通訊端:
sockfd.listen(n)
功能:
參數:
4.等待接受用戶端連結:
connfd,addr = sockfd.accept()
阻塞狀態
功能:
傳回值:
- connfd:新的通訊端,用於和用戶端通訊
- addr:連結用戶端的地址(ip, port)
阻塞函數:
- 當程式運行到阻塞函數位置,如果某種條件
- 沒有達成則暫停程式運行,直到條件達成結束阻塞
-
5.訊息的收發: data =
connfd.recv(
buffersize)
功能:
參數:
- 一次接受訊息的大小 位元組
- 傳回值:返回接受的內容
n = connfd.send(data)
功能:
參數:
- 要發送的內容(bytes格式)
- 傳回值:返回實際發送的位元組數
6.關閉通訊端
sockfd.close()
用戶端:
1.建立通訊端 (和服務端通訊端類型相同)
2.發起連結
connect(addr)
功能:
參數:
3.訊息收發 4.關閉通訊端
樣本服務端:
from socket import *# 建立通訊端對象sockd = socket()# 綁定IP地址sockd.bind(("127.0.0.1", 6666))# 設定監聽通訊端sockd.listen(5)# 等待用戶端連結cond, addr = sockd.accept()# 接受用戶端訊息(單次1024位元組)data = cond.recv(1024)print(data.decode())# 發送訊息cond.send(b"Hello, I‘m the server")# 關閉通訊端cond.close()sockd.close()
這裡本機測試可以利用兩個進行 telnet命令連結服務端測試
伺服器:
from socket import *# 建立通訊端sockfd = socket(AF_INET, SOCK_STREAM)# 綁定地址sockfd.bind(("0.0.0.0", 8888))# 設定監聽sockfd.listen(5)# 等待用戶端連結print("waiting for connect....")conn, addr = sockfd.accept()print("Connect from", addr)print("Connect from", conn)# 訊息收發while True: data = conn.recv(1024) if data.decode() == "": n = conn.send(b"Bey") break print("Receive", data.decode()) n = conn.send(b"Receive your message") print("send %d" % n)# 關閉通訊端conn.close()sockfd.close()
用戶端:
# tcp_client.pyfrom socket import *sockfd = socket()sockfd.connect(("172.18.32.31", 8888))while True: msg = input("Msg>>") if msg == "": break sockfd.send(msg.encode()) data = sockfd.recv(1024) # if msg == "Bye": # break print(data.decode())sockfd.close()
簡單的訊息傳輸:
Python網路編程(OSI模型、網路通訊協定、TCP)