1. 程式人生 > 實用技巧 >Python TCP 協議網路程式設計《一》

Python TCP 協議網路程式設計《一》

TCP協議介紹

  • TCP協議,傳輸控制協議(英語:Transmission Control Protocol,縮寫為 TCP)

  • TCP是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。

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

  • TCP通訊模型中,在通訊開始之前,一定要先建立相關的連結,才能傳送資料,類似於生活中,"打電話",而UDP類似於生活中的"發簡訊"。

TCP三次握手

  1. 首先Client(客戶)端傳送連線請求報文(第一次握手)。

  2. Server(伺服器)端接受連線後回覆ACK報文(第二次握手),併為這次連線分配資源。

  3. Client端接收到ACK報文後也向Server段發生ACK報文(第三次握手),並分配資源,這樣TCP連線就建立了。

詳細三次握手過程如下:
第一次握手:起初兩端都處於CLOSED關閉狀態,Client將標誌位SYN置為1,隨機產生一個值seq=x,並將該資料包傳送給Server,Client進入SYN-SENT狀態,等待Server確認;

第二次握手:Server收到資料包後由標誌位SYN=1得知Client請求建立連線,Server將標誌位SYN和ACK都置為1,ack=x+1,隨機產生一個值seq=y,並將該資料包傳送給Client以確認連線請求,Server進入SYN-RCVD狀態,此時作業系統為該TCP連線分配TCP快取和變數;

第三次握手:Client收到確認後,檢查ack是否為x+1,ACK是否為1,如果正確則將標誌位ACK置為1,ack=y+1,並且此時作業系統為該TCP連線分配TCP快取和變數,並將該資料包傳送給Server,Server檢查ack是否為y+1,ACK是否為1,如果正確則連線建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client和Server就可以開始傳輸資料。

TCP四次揮手

客戶端主動發起請求,服務端被動關閉。
首先是client向server發起斷開連線請求,server響應client等會兒斷開,server響應client可以斷開了,client告知server已經斷開連結。

詳細過程如下:
第一次揮手:起初client和server處於ESTABLISHED狀態——client發出連線釋放報文段並處於FIN-WAIT-1狀態

第二次揮手:server發出確認報文段且進入CLOSE-WAIT狀態——A收到確認後。

第三次揮手:client進入FIN-WAIT-2狀態,等待server的連線釋放報文段。

第四次揮手:server沒有要向client發出的資料,server就發出連線釋放報文段且進入LAST-ACK狀態——client發出確認報文段且進入TIME-WAIT狀態——server收到確認報文段後進入CLOSED狀態——client經過等待計時器時間2MSL後,進入CLOSED狀態。

TCP服務端建立流程

    1. socket建立一個套接字

    2. bind繫結ip和port

    3. listen使套接字變為可以被動連結

    4. accept等待客戶端的連結

    5. recv/send接收發送資料

 1server.py檔案內容如下:
 2
 3from socket import socket,SOCK_STREAM,AF_INET #匯入模組
 4def tcp_server():
 5    tcp_server_socket=socket(AF_INET,SOCK_STREAM) #建立TCP服務端套接字對接,UDP是SOCK_DGRAM
 6    server_address=('127.0.0.1',8888)#定義本TCP服務端的ip and port
 7    tcp_server_socket.bind(server_address) #繫結本機的8888埠
 8    tcp_server_socket.listen() #執行監聽
 9    client_socket,client_info = tcp_server_socket.accept() #接收客戶端的socker and info
10    data=client_socket.recv(1024)#接收客戶端發過來的訊息
11    print("the data is:%s, it's from %s",(client_info,data.decode("utf-8")))#列印客戶端的訊息
12    client_socket.close()#關閉客戶端的連線
13    tcp_server_socket.close()#關閉服務端的連線
14
15if __name__ == '__main__':
16    print("the TCP server is running ...")
17    tcp_server()
18
19
20
21client.py檔案內容如下:
22from socket import socket,SOCK_STREAM,AF_INET #匯入模組
23def tcp_client():
24    tcp_client_socket=socket(AF_INET,SOCK_STREAM) #建立TCP客戶端套接字對接
25    server_address=('127.0.0.1',8888)#定義本TCP服務端的ip and port
26    tcp_client_socket.connect(server_address) #連線到服務端
27    message="hello my name is tony" #定義要傳送的訊息
28    tcp_client_socket.send(message.encode("utf-8"))#向服務端傳送訊息
29    tcp_client_socket.close()#關閉客戶端的連線
30
31
32if __name__ == '__main__':
33    print("the TCP client is running ...")
34    tcp_client()
35    print("the message was send")

輸出內容為:

1 #server.py檔案輸出內容如下:
2 the TCP server is running ...
3 the data is:%s, it's from %s (('127.0.0.1', 50929), 'hello my name is tony')
4
5
6 #client.py檔案輸出內容如下:
7 the TCP client is running ...
8 the message was send

歡迎關注【無量測試之道】公眾號,回覆【領取資源】,
Python程式設計學習資源乾貨、
Python+Appium框架APP的UI自動化、
Python+Selenium框架Web的UI自動化、
Python+Unittest框架API自動化、

資源和程式碼 免費送啦~
文章下方有公眾號二維碼,可直接微信掃一掃關注即可。

備註:我的個人公眾號已正式開通,致力於測試技術的分享,包含:大資料測試、功能測試,測試開發,API介面自動化、測試運維、UI自動化測試等,微信搜尋公眾號:“無量測試之道”,或掃描下方二維碼:

新增關注,讓我們一起共同成長!