Python網路編程(OSI模型、網路通訊協定、TCP)

來源:互聯網
上載者:User

標籤:strong   摻雜   文本   name   block   ...   結束   lis   暫停   

前言:

什麼是網路?

網路是由節點和連線構成,表示諸多個物件及其相互聯絡。

在數學上,網路是一種圖,一般認為專指加權圖。

網路除了數學定義外,還有具體的物理含義,即網路是從某種相同類 型的實際問題中抽象出來的模型

在電腦領域中,網路是資訊傳輸、接收、共用的虛擬平台,通過它把各個點、面、體的資訊聯絡到一起,從而實現這些資源的共用

網路是人類發展史來最重要的發明,提高了科技和人類社會的發展。

在1999年之前,人們一般認為網路的結構都是隨機的。但隨著Barabasi和Watts在1999年分別發現了網路的無標度和小世界特性並分別在世界著名的《科學》和《自然》           雜誌上 發表了他們的發現之後,人們才認識到網路的複雜性。

網路會藉助文字閱讀、圖片查看、影音播放、下載傳輸、遊戲、聊天等軟體工具從文字、圖片、聲音、視頻等方面給人們帶來極其豐富的生活和美好的享受。

     網路目的:      網路傳輸的目的是什嗎?
  •          沒錯就是:資料轉送
 
  由於網路的複雜性以及各種應用硬體等等不匹配原因   和編碼是一個道理你有你的我有我的會導致衝突等問題  所以出現了 :ISO(國際標準組織)   ISO是幹嘛的呢?
  •      他是一個非盈利性國際組織 這個組織制定了一個用於電腦或通訊系統間的互連網標準體系
  •      叫OSI模型  不僅包括一系列抽象的術語或概念,也包括具體的協議
  •      OSI公有七層 :
 
  1.     應用程式層: 提供使用者服務,具體的內容由特定的程式規定
  2.     展示層: 提供資料的加密和壓縮最佳化
  3.     會話層: 確定建立應用連結,選擇傳輸服務
  4.     傳輸層: 提供Data Transmission Service,進行流量控制
  5.     網路層: 路由選著,網路互聯
  6.     鏈路層: 提供鏈路交換,具體訊息的發送
  7.     物理層: 物理硬體,介面,網卡的規定
  四層模型:
  1.     應用程式層 :  應用程式層   展示層  會話層
  2.     傳輸層 :  傳輸層
  3.     網路層 :  網路層
  4.     物理鏈路層: 鏈路層和物理層
  五層模型(tcp/ip模型):
  1.     應用程式層 : 應用程式層   展示層  會話層
  2.     傳輸層 : 傳輸層
  3.     網路層 : 網路層
  4.     鏈路層 : 鏈路層
  5.     物理層 : 物理層
    OSI模型優點
  •              將功能分開 降低網路中的耦合度,
  •              使用開發流程更加清晰,每部分各司其職
  高內聚低耦合:
  1.   高內聚:每個模組功能盡量單一,不會多個功能摻雜
  2.   低耦合:盡量降低每個模組之間的關聯性
     網路通訊協定:
  •           在網路通訊中協議必須遵守的規定,
  •           如建立什麼串連,訊息結構如何解析等
  • 應用程式層:TFTP(檔案傳輸)、HTTP(超文字傳輸通訊協定 (HTTP))、DNS(網域名稱解析)、SMTP(郵件傳輸)
  • 傳輸層:TCP、UDP
  • 網路層:IP
  • 物理層:IEEE
 iPython3:socket模組  網路相關概念:    網路主機:在網路上確定一台主機
  1.         本地使用:127.0.0.1 或 “localhost”
  2.         網路地址:“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地址:
  1. IPv4: 點分十進位   例如:192.168.1.3   取值0~255(32位)
  2. IPv6: 128位
  網路連接測試     ping 172.18.32.47  特殊ip
  1.     127.0.0.1            本地IP測試
  2.     0.0.0.0                自動使用本地可用網卡IP
  3.     192.168.1.0        代表網段
  4.     192.168.1.1        通常為網關地址
  5.     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 自用連接埠
  擷取應用程式的連接埠:
  1.     socket.getservbyname(‘ssh‘)
  2.     22
  1.     socket.getservbyname(‘mysql‘)
  2.     3306
   傳輸層服務:    連線導向的傳輸服務(tcp協議):
  •         傳輸特徵:
  •                可靠的資料轉送:
  •                       可靠性:無失序、無差錯、無重複、無丟失
  •                       在資料轉送前和傳輸後需要建立串連和取消連結
  •        面向傳輸服務建立串連的過程:‘三向交握
  1. 用戶端向伺服器發送連結請求
  2. 伺服器接受到請求進行確認,返回確認報文
  3. 用戶端收到伺服器回複最終確認連結
  •           面向傳輸服務取消連結的過程:‘四次揮手’
  1. 主動方發送報文,告知被動方要取消連結
  2. 被動方回複報文,表示已經接受到請求,準備斷開
  3. 被動方再次發送報文,表示準備處理就緒,可以斷開
  4. 主動方發送確認報文,取消連結
  •         應用情況:
  •     適用於傳輸較大的內容或檔案,網路良好,
  •     需要保證傳輸可靠性的情況
  •     e.g.  資訊聊天,檔案上傳下載,郵件,網頁擷取
 面向不需連線的傳輸服務(udp協議):
  1. 不保證傳輸的可靠性
  2. 沒有建立串連和斷開的過程
  3. 資料的收發比較自由
  • 適用情況: 
  •     網路情況較差,對可靠性要求不高,收發訊息的兩端
  •     e.g.:網路視頻,群聊,廣播等
     socket 通訊端編程:     目的:
  • 通過程式設計語言提供的通訊端編程介面
  •           可以更簡單的完成基於tcp/udp的編程
     通訊端:
  • 是完成上述目標的一種編程手段
    通訊端類別:      1.流式通訊端( SOCK_STREAM):
  •          傳輸層基於通訊端的協議通訊
  •          連線導向可靠的傳輸  tcp的傳輸   流式通訊端
      2.資料通訊端( SOCK_DGRAM):
  •          面向無串連不可靠的傳輸 udp的傳輸  資料通訊端
      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()   阻塞狀態       功能:
  • 阻塞等待並處理用戶端連結
       傳回值:
  1.            connfd:新的通訊端,用於和用戶端通訊
  2.            addr:連結用戶端的地址(ip, port)
       阻塞函數
  •     當程式運行到阻塞函數位置,如果某種條件
  •     沒有達成則暫停程式運行,直到條件達成結束阻塞
  5.訊息的收發:      data =  connfd.recvbuffersize)         功能:
  • 接受訊息
         參數:
  •        一次接受訊息的大小 位元組
  •         傳回值:返回接受的內容
       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)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.