python — TCP協議與UDP協議


1. TCP協議 / UDP協議

1.1 TCP協議

  • 1.可靠、慢、全雙工通信

  • 2.建立連接的時候 : 三次握手

  • 3.斷開連接的時候 : 四次揮手

  • 4.在建立起連接之后

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

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

  • 5.長連接 :會一直占用雙方的端口

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

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

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

  • 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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM