1. 程式人生 > >網路傳輸方式——TCP

網路傳輸方式——TCP

TCP概念

TCP:英文全稱(Transmission Control Protocol)簡稱傳輸控制協議,他是一種面向連線的,可靠的,基於位元組流的傳輸層技術協議。

特點:

1)面向連線
2)可靠傳輸:採用應答機制,超時重傳,錯誤校驗,流量控制和阻塞管理。
3)可靠,穩定,適合大資料傳輸,但是傳輸速度慢,佔用系統資源高。

TCP客戶端程式碼

import  socket


#建立socket套接字
tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_ip = ""
server_port = 8080
# 設定連線
tcp_client_socket.connect((server_ip,server_port))
# 設定傳送的資料
send_data = ''
# 傳送資料
tcp_client_socket.send(send_data.encode('gbk'))
# 接受對方傳送的資料
recv_data = tcp_client_socket.recv(1024)
# 解碼
recv_content = recv_data.decode('gbk')
# 關閉套接字
tcp_client_socket.close()

tcp服務端程式碼

import socket

# 建立socket套接字
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 設定本地資訊
address = ('',8080)
# 設定繫結
tcp_server_socket.bind(address)
# 設定監聽,使用socket設定的套接字預設的屬性是主動的,使用listen將其設定為被動的,這樣就可以接受別人的連線了.128表示最大連線等待數,服務端只能一個服務一個客戶端,會堵塞在accept處等待,服務一個完成後,才會連結下一個。
tcp_server_socket.listen(128)
# 如果有新的連結請求來連線伺服器,那麼就產生一個新的套接字為他服務.client_socket用來為這個客戶服務,tcp_server_socket就可以為別的客戶服務了
client_socket,client_addr = tcp_server_socket.accept()
# 接受傳送過來的資料
recv_data = client_socket.recv(1024)
# 傳送一些資料到客戶端
client_socket.send('thankyou'.encode('gbk'))
# 關閉套接字
client_socket.close()
# 關閉總套接字
tcp_client_socket.close()

TCP注意點:

tcp伺服器一般情況下都需要繫結埠號,否則客戶端找不到這個伺服器
tcp客戶端一般不繫結埠號,使用隨機生成的埠號即可
當tcp客戶端和服務端建立好連線才可以收發資料,udp是不需要建立連線,直接就可以傳送資料
當一個tcp客戶端和服務端連線成功後,伺服器端會有1個新的套接字,這個套接字用來標記這個客戶端,單獨為這個客戶端服務
listen後的套接字是被動套接字,用來接收新的客戶端的連結請求的,而accept返回的新套接字是標記這個新客戶端的
關閉listen後的套接字意味著被動套接字關閉了,會導致新的客戶端不能夠連結伺服器,但是之前已經連結成功的客戶端正常通訊。
關閉accept返回的套接字意味著這個客戶端已經服務完畢
當客戶端的套接字呼叫close後,伺服器端會recv解堵塞,並且返回的長度為0,因此伺服器可以通過返回資料的長度來區別客戶端是否已經下線

TCP的三次握手和四次揮手

在這裡插入圖片描述

解釋:
第一次握手:Client將標誌位SYN置為1,隨機產生一個值seq=J,並將該資料包傳送給Server,Client進入SYN_SENT狀態,等待Server確認。

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

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

在這裡插入圖片描述
說明:

第一次揮手:Client傳送一個FIN,用來關閉Client到Server的資料傳送。
第二次揮手:Server收到FIN後,傳送一個ACK給Client,確認序號為收到序號+1。
第三次揮手:Server傳送一個FIN,用來關閉Server到Client的資料傳送。
第四次揮手:Client收到FIN後,接著傳送一個ACK給Server,確認序號為收到序號+1。