day28 網路協議OSI 及socket模組
反射都是操作物件中的__dict__的內容
class Student:
def study(self):
print("正在學習....")
stu = Student()
if not hasattr(stu,"name"):
setattr(stu,"name","比格")
print(stu.name)
delattr(stu,"name")
# print(stu.name)
print(stu.study)
# delattr(stu,"study")
delattr(Student,"study")
def test():
pass
stu.test = test
print(stu.__dict__)
delattr(stu,"test")
print(stu.__dict__)
# 反射操作的都是物件__dict__中的內容
異常處理的目的 是提高程式的健壯性
### 網路通訊的基本要素
1.物理介質,網線,光纖,無線網路
2.通訊協議 用於規定雙方如何交換資料
網路通訊的基本要素
1.物理介質 網線 光纖 無線網路
2.通訊協議 用於規定雙方如何交換資料
OSI七層模型
OSI五層
應用層
傳輸層
網路層
資料鏈路層
物理層
物理層能夠傳輸01101二進位制
00001020120 102102102101021 02102100210201021020 102102102002102 1020120102121020
單純的二進位制是沒有意義的 必須得知道如何解析這些二進位制 這就有了資料鏈路層
工作在資料鏈路層的協議是乙太網協議
以太協議的主要功能
1.定義電信訊號的分組方式 一組有幾個 那個部分代表什麼含義
一組電信好最大為 1518
必須包含 head 和data
[head,data]
2.每個計算機必須具備網絡卡 網絡卡具備一個全球唯一的mac地址 可以用來表示唯一的一臺計算機
3.由於不知道對方的mac地址 乙太網通過廣播的方式來進行通訊
網路層
工作在網路層是ip協議
會給每個計算機分配一個ip地址
四位的點分十進位制
0.0.0.0 - 255.255.255.255
192.168.1.2
前三位稱之為網路號
最後一位稱為主機號
由於c類地址是共享的 所以 單獨使用網路號 是無法區分子網
所以引入了子網掩碼 專門用來驗證兩個ip地址是否屬於同一個子網
子網掩碼 只是區分而已
具體如何找 得靠網路號 通過路由協議來找到對方的閘道器
有了ip協議之後
可以通過網路號來定位全球範圍內的某個區域網
通過主機號 來定位區域網中具體的某臺計算機
雖然可以定位到以太計算機 但是 無法定位到某個應用程式
傳輸層
工作在傳輸層的兩個協議 TCP/UDP
傳輸層要求必須為每一個需要聯網應用程式繫結一個埠號 用於區分是哪一個應用程式
埠號就是一個整數 最大不超過65535
埠號在同一臺計算機中不能重複 0 - 1024 是系統保留的埠
注意:不要使用常見的程式已經佔用的埠 比如apache 的8080 mysql的 3306 FTP 21
這一堆網路協議 其實本質的就做兩個事情
1.如何找到對方
2.資料如何傳送
ip用來 標識一個區域網中的一臺電腦 埠用於標識某個應用程式 至此 我們就可以準確的定位到某個計算機中的某個程式
TCP 是一種可靠的傳輸協議
可以保證資料傳輸是完整的
如何保證資料傳輸的完整的?
TCP在傳輸資料前 會經過一個三次握手的過程 來驗證資料傳輸是否可靠
在斷開連線前 會經過四次揮手的過程 來保證資料完整傳輸了
在三次握手時 的確保證了資料傳輸是可靠 但是後續 有可能 由於種種原因 例如網路中斷 ,,丟包等等 導致資料不完整
所以 TCP的解決方案
每次傳送資料報 都需要對方返回一個確認資訊
如果一段時間後 對方沒有返回 就重複傳送
直到重試的次數 超過某個指定的值 就判斷連線已經丟失
TCP的優點: 可以保證資料完整性
由於需要接收確認資訊 所以整體傳輸效率較低
物理層能夠傳輸0101二進位制
單純的二進位制是沒有意義的,必須知道如何解析這些二進位制
A類B類地址的查詢需要使用網路層協議,通過ip地址確認子網和主機,在A類和B類地址下,可以建立很多c類區域網,子網掩碼就使用區分在找到ip地址的情況下,確認計算機是否在其下面的同一子網使用的
TCP
三次握手
連線是虛擬的概念,不存在
資料傳輸的過程就是我方電腦層層封包,對方電腦層層解包的過程
### socket使用
"""
socket是什麼?
socket是Python提供的一個模組 當然其他的任何語言也都有
用於處理網路傳輸相關的操作 其實就是封裝了
底層複雜 醜陋的TCP和UDP協議
對外提高簡單 優雅的使用介面
socket的作用?
減少網路程式設計的工作量
如何使用socket模組
"""
import socket
# 預設使用的是TCP協議
# 建立socket物件
# CS構架的程式必然有客戶端程式 和 伺服器端程式
# 為了統一使用方式 伺服器端和客戶端使用的都是socket
soc = socket.socket()
# 作為伺服器放必須為socket指定 ip和埠號
soc.bind(("192.168.12.141",1988)) # 埠不能超過65535 明確飯店地址
# 開始監聽埠 相當於飯店開門了 等著顧客來
soc.listen()
# 接收客戶端的連線請求
client,address = soc.accept()
# 接收
data = client.recv(1024)
print(data.decode("utf-8"))
# 傳送
client.send("我是你的伺服器 ".encode("utf-8"))
# 要注意 在服務端 收發資料是客戶端socket來完成的 伺服器端的sock 只做處理連線
# 收發資料都是bytes型別
# 關閉socket 回收資源
soc.close()
#### socket客戶端
import socket
# 建立socket物件
client = socket.socket()
# 連線伺服器
client.connect(("192.168.12.141",1988)) # 就是在做三次握手
# 收發資料
client.send("你好".encode("utf-8"))
data = client.recv(1024)
print(data.decode("utf-8"))
# 關閉連線
client.close() # 在做四次揮手操作