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. 三次握手的狀態分析
u 第一次握手:客戶端首先將標誌位SYN置為1,然後隨機產生一個值seq=X的包,並將該資料包傳送給server端,Client進入SYN_SENT狀態,等待server確認。
u 第二次握手:server收到資料包後由標誌位SYN=1知道Client請求建立連線,Server將標誌位SYN和ACK都置為1,ack numbern=X+1,隨機產生一個值seq=K,並將該資料包傳送給Client以確認連線請求,Server進入SYN_RCVD狀態。
u 第三次握手:Client收到確認後,檢查ack number是否為X+1,ACK是否為1,如果正確則將標誌位ACK置為1,ack=K+1,並將該資料包傳送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連線建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client與Server之間可以開始傳輸資料了。
感謝原始碼時代教學講師提供此文章! 本文為原創文章,轉載請註明出處!