Python 基於 TCP 傳輸協議的網路通訊實現

2022-09-23 04:36:15 字數 3817 閱讀 1730

什麼是網路程式設計?

指在網路環境中,如何實現不在同一物理位置中的計算機之間進行資料通訊

如果要保證資料通訊順利完成,則需要先了解如下幾個概念:

不同計算機內的程序之間進行資料通訊時,需要先對資料進行封裝或打包後方可以進行傳輸。所謂協議指通訊雙方需要共同遵守的資料打包格式。

如同現實世界裡郵寄商品一樣:

商品相當於要傳送給對方的資料:在傳輸之前,需要商品擁有者對商品進行打包,並在打包時填寫上收件人位址、收什人姓名、發件人位址……這是第一次封裝,在此次封裝過程中遵守的打包格式是由商品打包者完成,這層打包標準可稱為應用層標準或應用層協議

包裹會被物流公司收納,物流公司每天會收到需要傳送至全國各地的包裹,所以,需要再次進行分檢,把傳送至同乙個地區的包裹收納在一起,並再次進行打包,並按相應的標準進行資訊填寫。可認為第二次打包的標準是郵局標準或郵局協議.

郵局打包後的包裹會傳送至相關的運輸部門,運輸部門會把從不同郵局收集來的包裹按目的地進行歸類打包,再選擇不同運輸工具進行傳輸,可選擇飛機、貨車、火車……這次打包協議可稱為傳輸層協議。

協議是保證資料能被正確傳輸出去的第一操作要素,網際網路上所遵守的協議規範稱為 tcp/ip 協議。

在網路環境中,需要為每一台計算機指定乙個位址,這個位址叫 ip 位址,其實 ip 位址是乙個邏輯位址,而每一台計算機還有乙個實體地址,便是網絡卡上的 mac 位址。

ip 位址和 mac 位址的區別?

一台計算機上可以安裝多款網路軟體,如qq、瀏覽器、網路遊戲……

作業系統如何區分同一時刻自于網路的多個資料應該交給哪乙個軟體處理?

埠相當於作業系統為每乙個網路軟體分配的乙個門牌識別符號號,用來把從網路上輸入進來的多資料流正確的分流到對應的程序。

當一台計算機向另一台計算機傳送資料時:

首先對資料按協議格式進行打包

另需要知道對方計算機的位址且還要知道對應程序所監聽的埠號.ip+埠號也稱為套接字,或叫socket

有點類似於拜訪朋友時:

先封裝乙個禮物盒

然後根據朋友告訴自己的位址和門牌號前去拜訪

tcp 是一種傳輸層協議,是可靠的面向連線的傳輸層協議.

定義乙個函式用來進行具體的資料互動,由子執行緒呼叫.

import socket   # socket 模組

import time #時間模組

import threading #執行緒模組

def session(sock, addr):

print('歡迎新 %s:%s...' % addr)

sock.send(b'welcome!')

while true:

data = sock.recv(1024)

time.sleep(1)

# 解碼資料

if not data or data.decode('utf-8') == 'exit':

break

sock.send(('hello, %s!' % data.decode('utf-8')).encode('utf-8'))

sock.close()

print('來自於 %s:%s 連線被關閉.' % addr)

建立 socket 監聽物件:

#建立 tcp socket

server=socket.socket(socket.af_inet,socket.sock_stream)

#監聽埠

server.bind(('127.0.0.1',1234))

server.listen(5)

print('伺服器正在等待客戶的連線……')

建立服務監聽套接字,需要指定服務型別:

socket.af_unix

只能夠用於單一的unix系統程序間通訊

socket.af_inet

伺服器之間網路通訊

socket.af_inet6

ipv6

socket.sock_stream

流式socket , for tcp

socket.sock_dgram

資料報式socket , for udp

socket.sock_raw

原始套接字,普通的套接字無法處理icmp、igmp等網路報文,而sock_raw可以;其次,sock_raw也可以處理特殊的ipv4報文;此外,利用原始套接字,可以通過ip_hdrincl套接字選項由使用者構造ip頭。

socket.sock_seqpacket

可靠的連續資料報服務

while true:

# 接受乙個新連線:

sock, addr = s.accept()

# 建立新執行緒來處理tcp連線:

t = threading.thread(target=session, args=(sock, addr)) t.start()

當有客戶連線後,啟動執行緒完成具體的資料處理.

客戶端**相對而言較簡單.

import socket

client = socket.socket(socket.af_inet, socket.sock_stream)

# 建立連線:

client.connect(('127.0.0.1', 1234))

# 接收歡迎訊息:

print(client.recv(1024).decode('utf-8'))

for data in [b'rose', b'think', b'babala']:

# 傳送資料:

s.send(data)

print(s.recv(1024).decode('utf-8'))

s.send(b'exit')

s.close()

測試結果 :伺服器端

客戶端:

python 提供了相關的模組,封裝了底層的具體**邏輯,對於開發者而言,只需要按流程按部就班就可以,如果需要更好的理解整個網路通訊的過程,則需要了解相關的網路知識. 

傳輸協議 TCP

一tcp可靠資料傳輸 1 封裝tcp報文段 2 發出報文後啟動乙個計時器 3 通過校驗和發現資料差錯 4 通過序號重新排序,丟棄重複報文 5 流量控制 tcp的可靠傳說實現機制包括差錯編碼 確認 序號 重傳 計時器等 tcp的可靠資料傳輸是基於滑動視窗協議,但是傳送的視窗大小動態變化 二tcp流量控...

TCP 傳輸控制協議

推薦 tcp ip 簡直是程式設計師的福音 tcp 協議是 面向連線的,可靠的,流傳輸,協議。流 是指 不間斷 的資料結構,可以想象成排水管道中的水流。當應用程式採用 tcp 傳送訊息的時候,雖然可以保證傳送的順序,但是還是猶如沒有任何間隔的資料流,傳送給接收端。可以這麼理解 在傳送端,應用程式傳送...

TCP傳輸控制協議

tcp是網際網路中的傳輸層協議,使用三次握手協議建立連線。當主動方發出syn連線請求後,等待對方回答syn ack 1 並最終對對方的 syn 執行 ack 確認。這種建立連線的方法可以防止產生錯誤的連線,tcp使用的流量控制協議是可變大小的滑動視窗協議 tcp三次握手的過程如下 客戶端傳送syn ...