Python网络编程(OSI模型、网络协议、TCP)
生活随笔
收集整理的這篇文章主要介紹了
Python网络编程(OSI模型、网络协议、TCP)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言:
什么是網絡?
網絡是由節點和連線構成,表示諸多對象及其相互聯系。
在數學上,網絡是一種圖,一般認為專指加權圖。
網絡除了數學定義外,還有具體的物理含義,即網絡是從某種相同類 型的實際問題中抽象出來的模型
在計算機領域中,網絡是信息傳輸、接收、共享的虛擬平臺,通過它把各個點、面、體的信息聯系到一起,從而實現這些資源的共享。
網絡是人類發展史來最重要的發明,提高了科技和人類社會的發展。
在1999年之前,人們一般認為網絡的結構都是隨機的。但隨著Barabasi和Watts在1999年分別發現了網絡的無標度和小世界特性并分別在世界著名的《科學》和《自然》? ? ? ? ? ?雜志上 發表了他們的發現之后,人們才認識到網絡的復雜性。
網絡會借助文字閱讀、圖片查看、影音播放、下載傳輸、游戲、聊天等軟件工具從文字、圖片、聲音、視頻等方面給人們帶來極其豐富的生活和美好的享受。
網絡目的: 網絡傳輸的目的是什么?- ? ? ? ? ?沒錯就是:數據傳輸
- ? ? ?他是一個非盈利性國際組織 這個組織制定了一個用于計算機或通訊系統間的互聯網標準體系
- ? ? ?叫OSI模型??不僅包括一系列抽象的術語或概念,也包括具體的協議
- ? ? ?OSI公有七層 :
- ? ? ? ? ? ? ?將功能分開 降低網絡中的耦合度,
- ? ? ? ? ? ? ?使用開發流程更加清晰,每部分各司其職
- ? ? ? ? ? 在網絡通訊中協議必須遵守的規定,
- ? ? ? ? ? 如建立什么連接,消息結構如何解析等
- 應用層:TFTP(文件傳輸)、HTTP(超文本傳輸協議)、DNS(域名解析)、SMTP(郵件傳輸)
- 傳輸層:TCP、UDP
- 網絡層:IP
- 物理層:IEEE
- ? ? ifconfig:查看本機IP (ens33:本地IP? lo:本地回還)
- ? ? ipconfig:windoes中
- ? ? socket.gethostname() :? ? ? ? ? ? ? ? ? ? ? 獲取本機主機名
- ? ? socket.gethostbyname('tedu') :? ? ? ? 利用主機名獲取ip
- ? ? socket.gethostbyname('localhost'):? ?獲取本地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 自用端口
- ? ? ? ? 傳輸特征:
- ? ? ? ? ? ? ? ?可靠的數據傳輸:
- ? ? ? ? ? ? ? ? ? ? ??可靠性:無失序、無差錯、無重復、無丟失
- ? ? ? ? ? ? ? ? ? ? ? 在數據傳輸前和傳輸后需要建立連接和斷開鏈接
- ? ? ? ?面向傳輸服務建立連接的過程:‘三次握手’
- ? ? ? ? ? 面向傳輸服務斷開鏈接的過程:‘四次揮手’
- ? ? ? ? 應用情況:
- ? ? 適用于傳輸較大的內容或文件,網絡良好,
- ? ? 需要保證傳輸可靠性的情況
- ? ? e.g.? 信息聊天,文件上傳下載,郵件,網頁獲取
- 適用情況:?
- ? ? 網絡情況較差,對可靠性要求不高,收發消息的兩端
- ? ? e.g.:網絡視頻,群聊,廣播等
- 通過編程語言提供的套接字編程接口
- ? ? ? ? ? 可以更簡單的完成基于tcp/udp的編程
- 是完成上述目標的一種編程手段
- ? ? ? ? ?傳輸層基于套接字的協議通信
- ? ? ? ? ?面向連接可靠的傳輸??tcp的傳輸? ?流式套接字
- ? ? ? ? ?面向無連接不可靠的傳輸?udp的傳輸? 數據報套接字
- 訪問底層協議套接字
- 創建套接字
- ?sock_family地址族類型? ?AF_INET:IPV4網絡通訊
- ?sock_tpye:套接字類型? ?SICK_STREAM :流式? ?SOCK_DGRAM:數據報
- ?proto:通常為0? 選定子協議類型
- ?返回值:返回一個套接字對象
- 綁定地址
- addr--->元組? (ip, port) ("0.0.0.0", 8888)
- 將套接字設置為監聽套接字,創建監聽隊列
- 監聽隊列大小
- 一個監聽套接字可以連接多個客戶端
- 阻塞等待并處理客戶端鏈接
- ? ? 當程序運行到阻塞函數位置,如果某種條件
- ? ? 沒有達成則暫停程序運行,直到條件達成結束阻塞
- 接受消息
- ? ? ? ?一次接受消息的大小 字節
- ? ? ? ? 返回值:返回接受的內容
- 發送消息
- 要發送的內容(bytes格式)
- ? ? ? ? 返回值:返回實際發送的字節數
- 向服務端發起鏈接
- 服務器地址? (元組)
?
這里本機測試可以利用兩個進行 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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 青岛港a股上市时间
- 下一篇: HDU 3308 线段树求区间最长连续上