Python TCP 協議網路程式設計《一》
TCP協議介紹
-
TCP協議,傳輸控制協議(英語:Transmission Control Protocol,縮寫為 TCP)
-
TCP是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。
-
TCP通訊需要經過建立連線、資料傳送、終止連線三個步驟。
-
TCP通訊模型中,在通訊開始之前,一定要先建立相關的連結,才能傳送資料,類似於生活中,"打電話",而UDP類似於生活中的"發簡訊"。
TCP三次握手
-
首先Client(客戶)端傳送連線請求報文(第一次握手)。
-
Server(伺服器)端接受連線後回覆ACK報文(第二次握手),併為這次連線分配資源。
-
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服務端建立流程
-
socket建立一個套接字
-
bind繫結ip和port
-
listen使套接字變為可以被動連結
-
accept等待客戶端的連結
-
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自動化測試等,微信搜尋公眾號:“無量測試之道”,或掃描下方二維碼:
新增關注,讓我們一起共同成長!