日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python网络编程(OSI模型、网络协议、TCP)

發布時間:2024/10/12 python 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python网络编程(OSI模型、网络协议、TCP) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:

什么是網絡?

網絡是由節點和連線構成,表示諸多對象及其相互聯系。

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

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

在計算機領域中,網絡是信息傳輸、接收、共享的虛擬平臺,通過它把各個點、面、體的信息聯系到一起,從而實現這些資源的共享

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

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

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

網絡目的: 網絡傳輸的目的是什么?
  • ? ? ? ? ?沒錯就是:數據傳輸
由于網絡的復雜性以及各種應用硬件等等不匹配原因? 和編碼是一個道理你有你的我有我的會導致沖突等問題 所以出現了 :ISO(國際標準化組織) ISO是干嘛的呢?
  • ? ? ?他是一個非盈利性國際組織 這個組織制定了一個用于計算機或通訊系統間的互聯網標準體系
  • ? ? ?叫OSI模型??不僅包括一系列抽象的術語或概念,也包括具體的協議
  • ? ? ?OSI公有七層 :
  • ? ??應用層:?提供用戶服務,具體的內容由特定的程序規定
  • ? ??表示層:?提供數據的加密和壓縮優化
  • ? ??會話層: 確定建立應用鏈接,選擇傳輸服務
  • ? ??傳輸層:?提供數據傳輸服務,進行流量控制
  • ? ??網絡層:?路由選著,網絡互聯
  • ? ??鏈路層: 提供鏈路交換,具體消息的發送
  • ? ??物理層: 物理硬件,接口,網卡的規定
  • 四層模型:
  • ? ? 應用層 :? 應用層? ?表示層? 會話層
  • ? ? 傳輸層 :? 傳輸層
  • ? ? 網絡層 :? 網絡層
  • ? ? 物理鏈路層: 鏈路層和物理層
  • 五層模型(tcp/ip模型):
  • ? ? 應用層 : 應用層? ?表示層? 會話層
  • ? ? 傳輸層 : 傳輸層
  • ? ? 網絡層 : 網絡層
  • ? ? 鏈路層 : 鏈路層
  • ? ? 物理層 : 物理層
  • ? OSI模型優點
    • ? ? ? ? ? ? ?將功能分開 降低網絡中的耦合度,
    • ? ? ? ? ? ? ?使用開發流程更加清晰,每部分各司其職
    高內聚低耦合:
  • ? 高內聚:每個模塊功能盡量單一,不會多個功能摻雜
  • ? 低耦合:盡量降低每個模塊之間的關聯性
  • 網絡協議:
    • ? ? ? ? ? 在網絡通訊中協議必須遵守的規定,
    • ? ? ? ? ? 如建立什么連接,消息結構如何解析等
    • 應用層:TFTP(文件傳輸)、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):
    • ? ? ? ? ?面向無連接不可靠的傳輸?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()??阻塞狀態 功能:
    • 阻塞等待并處理客戶端鏈接
    返回值:
  • ? ? ? ? ? ?connfd:新的套接字,用于和客戶端通訊
  • ? ? ? ? ???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")breakprint("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 == "":breaksockfd.send(msg.encode())data = sockfd.recv(1024)# if msg == "Bye":# breakprint(data.decode()) sockfd.close()

    ?

    簡單的消息傳輸:

    ?

    ?

    轉載于:https://www.cnblogs.com/ParisGabriel/p/9434378.html

    總結

    以上是生活随笔為你收集整理的Python网络编程(OSI模型、网络协议、TCP)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。