網路傳輸方式——TCP
阿新 • • 發佈:2018-12-16
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。