1. 程式人生 > >python下socket程式設計之TCP連線狀態

python下socket程式設計之TCP連線狀態

1. 引言

python作為一門膠水語言,可以在各個領域上作為快速開發的工具,大大提高開發者處理事務的效率。在網際網路行業中,不管是對網路伺服器的開發,還是對網路客戶端,例如爬蟲的開發中,都會涉及到底層的執行原理,那就是socket程式設計,那麼今天,我們將對python下的socket程式設計開發中,TCP協議中連線狀態做一個介紹,通過本篇文章,可以讓大家對網路程式設計中底層的TCP協議的連線有一定的認識。

2. 什麼是TCP協議

TCP協議,傳輸控制協議(Transmission Control Protocol,縮寫為TCP)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議,它能提供高可靠性通訊(即資料無誤、資料無丟失、資料無失序、資料無重複到達的通訊):

主要的適用場景:

n 適合於對傳輸質量要求較高,以及傳輸大量資料的通訊。

n 在需要可靠資料傳輸的場合,通常使用TCP協議。

n HTTP/HTTPS等即網路服務都採用TCP協議。

 

TCP通訊需要經過建立連線、資料傳送、終止連線三個步驟。

3. TCP伺服器程式設計

在python中,提供了一個socket模組,他裡面封裝了系統底層socket介面的python格式API,對於Python開發者來說,只需要匯入該模組就可以實現socket程式設計了。

from socket import *

 

# 建立socket

tcpSerSocket = socket(AF_INET, SOCK_STREAM)

# 繫結本地資訊

address = ('', 7788)

tcpSerSocket.bind(address)

# 使用socket建立的套接字預設的屬性是主動的,使用listen將其變為被動的,這樣就可以接收別人的連結了

tcpSerSocket.listen(5)

 

# 如果有新的客戶端來連結伺服器,那麼就產生一個新的套接字專門為這個客戶端伺服器

# newSocket用來為這個客戶端服務

# tcpSerSocket就可以省下來專門等待其他新客戶端的連結

newSocket, clientAddr = tcpSerSocket.accept()

 

# 接收對方傳送過來的資料,最大接收1024個位元組

recvData = newSocket.recv(1024)

print '接收到的資料為:',recvData

 

# 傳送一些資料到客戶端

newSocket.send("thank you !")

 

# 關閉為這個客戶端服務的套接字,只要關閉了,就意味著為不能再為這個客戶端服務了,如果還需要服務,只能再次重新連線

newSocket.close()

 

# 關閉監聽套接字,只要這個套接字關閉了,就意味著整個程式不能再接收任何新的客戶端的連線

tcpSerSocket.close()

4. TCP客戶端

TCP客戶端的核心介面API是connect,由於TCP要求的是穩定傳輸,所以在後面數據傳輸前,需要藉助三次握手的協議特點去實現連線。而connect函式則是三次握手協議的發起者。

from socket import *

 

# 建立socket

tcpClientSocket = socket(AF_INET, SOCK_STREAM)

 

# 連結伺服器

serAddr = ('192.168.1.102', 7788)

tcpClientSocket.connect(serAddr)

 

# 提示使用者輸入資料

sendData = input("請輸入要傳送的資料:")

 

tcpClientSocket.send(sendData)

 

# 接收對方傳送過來的資料,最大接收1024個位元組

recvData = tcpClientSocket.recv(1024)

print '接收到的資料為:',recvData

 

# 關閉套接字

tcpClientSocket.close()

5. TCP的連線狀態

我們可以把剛剛的2個程式,放到2臺虛擬機器上,或者一臺虛擬機器,一臺物理機上,然後使用wireshark抓包工具來對其通訊過程進行資料包底層狀態的分析。

可以看到圖上,前3個包就是3次握手的結構。

中間2個包,是我們傳送資料,伺服器接收資料的包。

最後4個包,是連線斷開後,進行的4次揮手的結構。

6. 三次握手的狀態分析

第一次握手:客戶端首先將標誌位SYN置為1,然後隨機產生一個值seq=X的包,並將該資料包傳送給server端,Client進入SYN_SENT狀態,等待server確認。

第二次握手:server收到資料包後由標誌位SYN=1知道Client請求建立連線,Server將標誌位SYN和ACK都置為1,ack numbern=X+1,隨機產生一個值seq=K,並將該資料包傳送給Client以確認連線請求,Server進入SYN_RCVD狀態。

第三次握手:Client收到確認後,檢查ack number是否為X+1,ACK是否為1,如果正確則將標誌位ACK置為1,ack=K+1,並將該資料包傳送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連線建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client與Server之間可以開始傳輸資料了。

   感謝原始碼時代教學講師提供此文章!   本文為原創文章,轉載請註明出處!