1. 程式人生 > 其它 >網路併發程式設計01--OSI七層協議

網路併發程式設計01--OSI七層協議

1. 回顧python

# 變數與常量

# 基本資料型別

# 內建方法

# 字元編碼&檔案操作

# 函式
	函式引數,閉包函式,裝飾器

# 面向物件
	封裝,"繼承",多型

"""
什麼是物件
    整合資料和功能,將來想要呼叫直接物件加點...就可以了
    資料與功能的結合體(類似於工具包,化妝盒)

什麼是類
    類,最主要的功能是為了簡化程式碼
    多個物件公共的資料與功能的結合體

什麼是父類
    多個類,公共的資料與功能的結合體

物件必須要由 類 產生!!!

"""

# 自定義json類,實現其他資料型別與json的序列化
import json
from datetime import datetime, date

class MyJsonClass(json.JSONEncoder):
    def default(self, o):
        # 正常是用於當資料不符合預設序列化類別的時候報錯
        if isinstance(o, datetime):
            return o.strftime('%Y-%m-%d %X')
        elif isinstance(o, date):
            return o.strftime('%Y-%m-%d')
        return super().default(o)

# 定義字典
d = {'k1': datetime.today(), 'k2': date.today()}
print(d)
# 序列化
res = json.dumps(d, cls=MyJsonClass)
print(res)

"""
時間型別預設不支援json序列化
方式一:str()包裹一下
方式二:面向物件之繼承(繼承父類,重寫方法,呼叫父類方法)
也就是自定義一個json類來實現序列化,參照上面程式碼
"""

2. 軟體開發架構

兩大類

C/S架構(client/server)
# 客戶端/服務端

"""
將客戶端看作是去店裡消費的客人

將服務端看成是提供服務的店面
    eg:手機端app,就是各大軟體客戶端

服務端需要具備三大特徵:
    1. 24小時不間斷提供服務(24小時監聽)
    2. 固定的地址(IP地址)
    3. 能夠服務多個使用者(高併發)

"""

B/S架構(browser/server)
# 瀏覽器/伺服器

"""
瀏覽器統一充當各個服務端的客戶端

本質:bs架構本質上也是cs架構

目前bs架構居多
"""

統一:統一介面的思想,也是各大網際網路巨頭正在做的事情
    eg:
        微信小程式(微信自主提供開發小程式軟體)
        支付寶小程式(各大程式介面)

# 總結:
    網路程式設計學完,可以開發cs架構的軟體(簡易版本)
    併發程式設計,前端,資料庫,後端框架學完,可以開發bs架構軟體
    # 任何型別的軟體!!


3. 網路程式設計前戲

網路程式設計就是研究程式之間的資料通訊。

:基於遠端傳輸的技術最早誕生於美國軍方
#(前沿技術通常是由軍事產生)

遠端資料傳輸發展史(民用):
	1.有線電話    電話線互聯
	2.無線電話    訊號發射器
	3.打屁股電腦  網線
	4.筆記本      網絡卡
    ...

# 想要實現遠端資料互動的前提是
    必須要有物理連線介質

# 除了有物理連線介質之外,還應該有一些能夠保證資料彼此無障礙互動的東西
# 也就是一些標準 OSI七層協議



4. OSI七層協議

協議規定了遠端傳輸必須有的東西(計算機)

# 所有的計算機都必須有這七層

應用層
表示層
會話層
傳輸層
網路層
資料鏈路層
物理連線層

# 開發層面可以歸納為五層
應用層(包含應用層,表示層,會話層)
傳輸層
網路層
資料鏈路層
物理連線層


針對七層協議,從下向上研究


"1. 物理連線層:"
    為了保證必須要有物理連線介質/介面
    可以是網線,網絡卡...

	
"2. 資料鏈路層:"
    1. 規定了電訊號的分組方式
    2. 乙太網協議
        規定了計算機必須有一塊網絡卡,並且網絡卡上面要有一個固定的一串數字
        12位的十六進位制數
        前六位:廠商編號
        後六位:流水線號
        也稱之為計算機的mac地址(乙太網地址/網絡卡地址)
        類似於身份證號,是獨一無二的(其實可以改,但是不要改)

		
"3. 網路層:"
IP協議:規定了接入網際網路的計算機都必須有一個IP地址,用於唯一標識。

IP協議的兩個版本
    IPV4:點分十進位制
        最小0.0.0.0
        最大255.255.255.255
        255**4
    IPV6:能夠表示出地球上的每一粒沙子

# IP地址能夠唯一 標識接入網際網路的一臺獨一無二的計算機
公網IP 和 私網IP
    公網IP需要花錢購買並申請
    私網IP自帶的,但是無法直接基於網際網路訪問

# arp協議 -- 不屬於哪個層
# 地址解析協議
用來做IP地址和mac地址之間的轉換
將IP地址轉換成mac地址(基於網路請求完成的)


"4. 傳輸層:"
# 協議最多
TCP協議
UDP協議
(稍後)

# 埠協議:
    範圍:0 ~ 65535
    特性:動態分配
        eg:第一次執行微信,系統隨機取一個埠號2022
            關閉微信重新啟動,埠號系統隨機再分配
    埠號基本使用
        0 ~ 1024一般是系統預設需要使用的
        1024~8000常見軟體埠號
        以後我們開發的軟體最好使用8000之後的埠

# 埠號(port):能夠唯一標識一臺計算機上面正在執行的一款應用程式
"""
埠衝突可能會導致程式起不來
埠號在同一計算機,同一時刻,不能重複

"""

"總結:"
    IP + port
    能夠唯一標識世界上某一臺接入網際網路的計算機上面的某一個正在執行的應用程式。


"5. 應用層:"
# 協議相對也較多
# 都是人為自定義的協議標準,可遵循,也可不遵循

最經典的協議有:http協議,ftp協議...


4.1 TCP&UDP協議

協議不同連線和傳輸資料的細節也會不同。

  • TCP(Transmission Control Protocol)傳輸控制協議,是面向連線的協議,也就是說,在收發資料前,必須和對方建立可靠的連線,然後再進行收發資料(如果資料丟失了還會重發。)

  • UDP(User Data Protocol)使用者資料報協議,是一個無連線的簡單的面向資料報的傳輸層協議。UDP不提供可靠性,他只是把應用程式傳給IP層的資料報傳送出去,但是並不能保證他們能到達目的地。由於UDP在傳輸資料報前不用在客戶和伺服器之間建立一個連線,且沒有超時重發等機制,故而傳輸速度很快,節省資源。

下面我們詳細來看

"TCP協議"
# 也叫流式協議,可靠協議

"面試題:"TCP協議之所以可靠的原因在於有雙向通道,對不對???
不對
# 可靠的原因在於,接收資料時有反饋機制

# 流式協議
像流水一樣,連續不斷的發過去

TCP將在兩個應用程式之間建立一個全雙工(full-duplex)的通訊。


"三次握手"
三次握手    建立連結
# 重要狀態
    listen監聽態:等待對方發請求
    syn_rcvd態: 忙於回覆確認建立請求
        # 洪水攻擊:服務端在同一時間接收到了大量的要求建立連結的請求
        # 通過壓力,數量,讓你的伺服器癱瘓

"四次揮手"
四次揮手    斷開連線
    不能合併成三次
    # 因為另一方還要檢視有沒有未完成的資料傳送給對方


"UDP協議"
# 不可靠協議
速度快,節省資源
資料傳送沒有通道的概念,傳送出去就不管了

"""
TCP協議相當於打電話,你一句我一句
# 網站,手機app資料獲取等。。

UDP協議相當於發簡訊,只負責傳送,不管看不看
# 語音通話,視訊通話,實時遊戲畫面等。。
"""

常見硬體

交換機:能夠使接入該機器的所有計算機之間彼此互聯
區域網:由交換機組成的網路
網際網路:將所有區域網全部連起來
       簡單的理解為是多個區域網之間彼此互聯

"基於mac地址的資料傳輸"
# mac地址只能在區域網內使用
# 廣播風暴

路由器:能夠連線多個區域網,並實現區域網之間的資料傳輸。