python TCP協議與UDP協議

1. TCP協議 / UDP協議

1.1 TCP協議

  • 1.可靠、慢、全雙工通訊python

  • 2.創建鏈接的時候 : 三次握手程序員

  • 3.斷開鏈接的時候 : 四次揮手緩存

  • 4.在創建起鏈接以後微信

    • 發送的每一條信息都有回執網絡

    • 爲了保證數據的完整性,還有重傳機制socket

  • 5.長鏈接 :會一直佔用雙方的端口tcp

  • 6.IO(input,output)操做,輸入和輸出是相對內存來講的code

    • write / send -----> 輸出 outputserver

    • read / recv ------> 輸入 inputip

  • 7.可以傳遞的數據長度幾乎沒有限制

1.2 UDP協議

  • 1.無鏈接的 速度快
  • 2.可能會丟消息
  • 3.可以傳遞的數據的長度是有限的,是根據數據傳遞設備的設置有關係

1.3 應用場景

  • TCP 文件的上傳下載(發送郵件、網盤、緩存電影)
  • UDP 即時通訊類的(qq、微信、飛秋)

2. osi七層模型 /osi五層協議

osi七層模型 osi五層協議 協議 物理設備
應用層
表示層
會話層
(三層總結成一層)
五層 應用層 http / https / ftp / smtp 協議
python代碼:hello
傳輸層 四層 傳輸層 tcp協議 / udp協議 端口 四層路由器、四層交換機
網絡層 三層 網絡層 ipv4 / ipv6 協議 (三層)路由器、三層交換機
數據鏈路層 二層 數據鏈路層 mac地址 arp協議 網卡、(二層)交換機
物理層 一層 物理層

3. socket(套接字)

socket 是一個工做在應用層和傳輸層之間的抽象層。

  • 幫助咱們完成了全部信息的組織和拼接
  • sokcet對於程序員來講 已是網絡操做的底層了

socket歷史:

  • (初期)基於文件通訊 -------- 完成同一臺機器上的兩個服務之間的通訊的
  • (如今)基於網路通訊 -------- 完成了多臺機器之間的多個服務通訊

3.1 socket用於TCP協議

# server.py 服務端
import socket

sk = socket.socket()  
# socket()參數中:family(基於……通訊)=AF_INET(網絡通訊), type(協議)=SOCK_STREAM(TCP協議),TCP協議默認不用寫,若是想要寫協議必須是:type=socket.SOCK_STREAM
sk.bind(('192.168.12.25',9000))
sk.listen()
while True:
    conn,addr = sk.accept()
    while True:
        msg = conn.recv(1024)
        if msg.decode('utf-8').upper() == 'Q':
            break
        print(msg.decode('utf-8'))
        cont = input('內容(輸入Q斷開):')
        conn.send(cont.encode('utf-8'))
        if cont.upper() == 'Q':
            break
    conn.close()
sk.close()

# client.py 客戶端
import socket

sk = socket.socket()
sk.connect(('127.0.0.1',9000))
while True:
    msg = sk.recv(1024)
    if msg.decode('utf-8').upper() == 'Q':
        break
    print(msg.decode('utf-8'))
    cont = input('內容(輸入Q斷開):')
    sk.send(cont.encode('utf-8'))
    if cont.upper() == 'Q':
        break
sk.close()

sk.accept() 與 sk.connect() 是創建三次握手的過程

3.2 socket用於UDP協議

# server.py 服務端
import socket

sk = socket.socket(type = socket.SOCK_DGRAM) # UDP協議必須加上 type=socket.SOCK_DGRAM
sk.bind(('127.0.0.1',9000))
while True:
    msg,client_addr = sk.recvfrom(1024) # recvfrom用於不知道對方ip時,獲取到ip給client_addr
    msg = msg.decode('utf-8')
    print(msg)
    msg1 = input('>>>').encode('utf-8')
    sk.sendto(msg1,client_addr)
sk.close()

# client.py 客戶端
import socket

sk = socket.socket(type = socket.SOCK_DGRAM)
while True:
    inp = input('>>>').encode('utf-8')
    sk.sendto(inp,('127.0.0.1',9000))
    msg = sk.recv(1024).decode('utf-8') # 這裏不須要使用recvfrom,由於知道對方ip地址
    print(msg)

sk.close()
相關文章
相關標籤/搜索