tcp總結與簡單實現

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()
相關文章
相關標籤/搜索