1、TCP簡介安全
1. TCP介紹服務器
1)TCP協議,傳輸控制協議(Transmission Control Protocol,縮寫爲 TCP)是一種面向鏈接的、可靠的、基於字節流的傳輸層通訊協議
2)tcp通訊的三個步驟
建立鏈接、數據傳輸、終止鏈接網絡
2. TCP特色
1)面向鏈接
1. 通訊雙方必須先創建鏈接才能進行數據的傳輸
2. 雙方間的數據傳輸均可以經過這個鏈接進行,完成數據交換後,雙方斷開此鏈接,以釋放系統資源
3. 鏈接是一對一的,所以TCP不適用於廣播的應用程序,基於廣播的應用程序請使用UDP協議socket
2)可靠傳輸,經過一套機制來實現可靠傳輸
1. 發送應答機制
2. 超時重傳
3. 錯誤校驗
4. 流量控制-阻塞管理tcp
3)基於字節流的:以字節流的形式傳遞給目標主機spa
3. TCP與UDP的不一樣點
- 面向鏈接
- 有序數據傳輸
- 重發丟失的數據包
- 捨棄重複的數據包
- 無差錯的數據傳輸
- 阻塞/流量控制code
4.tcp與upd使用場景:視頻
1) udp: 廣播數據時, 用udp 當對網絡通信質量要求不高的時候,要求網絡通信速度能儘可能的快,這時就可使用UDP ,好比QQ語音,QQ視頻
2) tcp: tcp比udp更安全,穩定,可是速度沒有udp那麼快,使用場景很是多;
例如: http傳輸,文件傳輸,要求比較高的數據傳輸都會用tcp,目前大部分的傳輸都是基於tcp協議傳輸server
5. UDP與TCP的通訊模型
1) udp通訊模型
udp通訊模型中,在通訊開始以前,不須要創建相關的鏈接,只須要發送數據便可,相似於生活中,"寫信"",沒有嚴格的客戶端和服務端之分
2) tcp通訊模型
tcp通訊模型中,在通訊開始以前,必定要先創建相關的鏈接,才能發送數據,相似於生活中,"打電話"",tcp有嚴格的客戶端與服務端之分對象
2、TCP網絡程序-客戶端
1. TCP客戶端實現流程
tcp流程步驟:
1)建立tcp socket客戶端對象
2)與服務端創建鏈接
3)收發數據(讀寫數據)
4)關閉鏈接
2.示例代碼:
import socket # 建立socket tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 目的信息 server_ip = input("請輸入服務器ip:") server_port = int(input("請輸入服務器port:")) # 鏈接服務器 tcp_client_socket.connect((server_ip, server_port)) # 提示用戶輸入數據 send_data = input("請輸入要發送的數據:") tcp_client_socket.send(send_data.encode("utf-8")) # 接收對方發送過來的數據,最大接收1024個字節 recv_data = tcp_client_socket.recv(1024) print('接收到的數據爲:', recvData.decode('gbk')) # 關閉套接字 tcp_client_socket.close()
3、TCP網絡程序-服務端
1. TCP服務端建立及實現流程
tcp流程步驟:
1)建立一個server_socket ,用於監聽客戶端的請求
2)綁定端口
3)server_socket開啓監聽listen,server_socket由主動模擬模式變爲被動鏈接模式
4)等待接收客戶端的鏈接請求,一有客戶端的鏈接請求,當即接受,而且建立一個與客戶端socket對接的socket,新建立的socket用來與客戶端的socket進行通訊
5)使用新建立的socket與客戶端的socket進行通訊(收發數據)
6)關閉新建立的socket,該socket關閉後, 再也不與當前客戶端通訊,結束與當前客戶端的通訊
7)關閉server_socket,該server_socket關閉後,再也不接收新的客戶端請求
2.示例代碼:
import socket # 建立socket tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 本地信息 address = ('', 8090) # 元組 # 綁定端口,tcp服務端必須綁定端口 tcp_server_socket.bind(address) # 使用socket建立的套接字默認的屬性是主動的,使用listen將其變爲被動的,這樣就能夠接收別人的鏈接請求 tcp_server_socket.listen(5) # backlog=5 表示積壓的客戶端鏈接請求最多5個, 超過5個,則拒絕鏈接 # 若是有新的客戶端來鏈接服務器,那麼就產生一個新的套接字專門爲這個客戶端服務 # client_socket用來爲這個客戶端服務 # tcp_server_socket就能夠省下來專門等待其餘新客戶端的鏈接 client_socket, client_addr = tcp_server_socket.accept() # 接收對方發送過來的數據 recv_data = client_socket.recv(1024) # 最多接收1024個字節 print('接收到的數據爲:', recv_data.decode('gbk')) # 發送一些數據到客戶端 client_socket.send("thank you !".encode('gbk')) # 關閉爲這個客戶端服務的套接字,只要關閉了,就意味着爲不能再爲這個客戶端服務了,若是還須要服務,只能再次從新鏈接 client_socket.close()