TCP通信詳解


一、TCP簡介

  1.TCP介紹

    a>TCP協議:TCP協議,傳輸控制協議(英語:Transmission Control Protocol,縮寫為:TCP)是一種面向連接的、可靠的、基於字節流的通信協議

    1.面向連接:先連接,再通信,好比打電話模型

    2.可靠的,相對於UDP,TCP傳輸更可靠,TCP通過一序列的機制(面向連接機制、發送應答機制)來保障傳輸的可靠性

    3.基於字節流的,UDP創建UDP socket——DGRAM:基於數據報通信方式,每一次發送的數據都是一個獨立的整體,包含目標主機的ip地址、端口號及發送數據的內容

    b>TCP通信的三個步驟

    基於面向連接的:1.與服務端建立連接

            2.收發數據

            3.關閉連接

  2.TCP特點

    a>面向連接

    1.先建立連接,再進行通信

    2.TCP連接是一對一的,而UDP可以一對一或一對多,UDP適合做廣播程序

    a>可靠傳輸:通過一序列機制來保障TCP傳輸數據比UDP更可靠

    1.傳送應答機制

    2.超時重傳機制

    3.錯誤校驗

    4.流量控制/阻塞管理

  3.TCP與UDP的不同點

    1.面向連接

    2.有序數據傳輸

    3.重發丟失的數據包

    4.丟棄重復的數據包

    5.無差錯的數據傳輸

    6.阻塞/流量控制

  4.TCP與UDP的應用場景

    1.TCP的應用場景:適合通信質量要求較高的場景,http傳輸、文件傳輸、smtp等等,目前大部分的傳輸都是基於TCP協議傳輸

    2.UDP的應用場景:相對於TCP傳輸,UDP傳輸速度更快,實時性更好,耗資源更少,但穩定性、可靠性比TCP差,適合對網絡通訊質量要求不高,速度要求盡量快,更實時,比如QQ語音,QQ視頻

  5.UDP與TCP的通信模型

    a>UDP通信模型

      面向無連接,好比寫信模型,沒有嚴格的服務端與客戶端之分

    b>TCP通信模型

      面向連接的,好比打電話模型,有嚴格的服務端與客戶端之分

二、TCP網絡程序-客戶端(重點)

  1、TCP客戶端實現流程

    1、創建一個TCP的socket對象

    2、與TCP服務端建立連接

    3、使用TCP socket 收發數據

    4、關閉連接

  參考代碼如下:

          

                                    

三、TCP網絡程序-服務端(重點)

  1.TCP服務端創建流程:

    1、創建服務端的server_socket,用於監聽客戶端的請求

    2、綁定端口

    3、server_socket開啟監聽,有主動連接改變為被動連接模式

    4、假如有客戶端的請求,則立即接收,且創建一個與客戶端對接的socket,與客戶端進行通信

    5、使用新創建的socket與客戶端通信

    6、關閉與客戶端通信的socket,當該socket被關閉,則不再與當前客戶端通信

    7、關閉用於監聽客戶端發送請求的socket,當該socket關閉,則不再接收新的客戶端請求

  參考代碼如下:

         

           

 

   2、同時為多個客戶端提供服務:

        參考代碼如下:

                              

                              

  4、為同一個客戶端提供多次服務

    參考代碼如下:

        

        

        

 

四、TCP注意點:

  

tcp服務端一般情況下都需要綁定,否則客戶端找不到這個服務端
tcp客戶端一般不綁定,因為是主動連接服務端,所以只要確定好服務端的ip、port等信息就好,本地客戶端可以隨機
tcp服務端中通過listen可以將socket創建出來的主動套接字變為被動的,這是做tcp服務端時必須要做的
當客戶端需要連接服務端時,就需要使用connect進行連接,udp是不需要連接的而是直接發送,但是tcp必須先連接,只有連接成功才能通信
當一個tcp客戶端連接服務端時,服務端會有1個新的套接字,這個套接字用來標記這個客戶端,單獨為這個客戶端服務
listen后的套接字是被動套接字,用來接收新的客戶端的連接請求的,而accept返回的新套接字是標記這個新客戶端的
關閉listen后的套接字意味着被動套接字關閉了,會導致新的客戶端不能夠連接服務端,但是之前已經連接成功的客戶端正常通信。
關閉accept返回的套接字意味着這個客戶端已經服務完畢
當客戶端的套接字調用close后,服務端會recv解堵塞,並且返回的長度為0,因此服務端可以通過返回數據的長度來區別客戶端是否已經下線


五、三次握手、四次揮手(了解)

a> 三次握手
第一次握手: 客戶端A向服務端B發送連接請求(客戶端-->服務端方向)
第二次握手: 服務端B向客戶端A發送確認連接,同時向客戶端A發送連接請求(服務端-->客戶端方向)
第三次握手: 客戶端A收到服務端的確認信息,正確無誤后,再向客戶端發送確認連接信息(客戶端-->服務端方向)

b> 四次揮手

六、 服務器如何復用同一個端口而不會提示端口被占用
"""
socket.setsockopt(level,option,value) :配置socket
level:等級,對哪個等級操作(ip,tcp,udp,socket等級)
option:設置哪個選項
socket.SO_REUSEADDR: 復用地址
value: True:表示復用,False,表示不復用
"""
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 提示:socket.setsockopt()方法要在 socket.bind()之前設置

   

 七、案列:文件下載器

  a>客戶端實現:

    “”“文件下載器客戶端實現流程

       1、創建一個TCP socket

       2、連接服務端

       3、獲取用戶輸入的文件名

          4、把要下載的文件名發給服務端

          5、等待接收服務端回傳的文件內容

        6、假如內容不為空,則寫入到文件中

        7、關閉TCP socket

    ”“”

    參考代碼如下:

           

           

  b>服務端實現

    

""" 文件下載服務端實現流程
1. 創建服務端的socket,用來做監聽的
2. 綁定端口
3. 開啟監聽 listen
4. 循環接收客戶端的下載請求
5. 獲取客戶端發送過來的要下載的文件名
6. 通過函數取得要下載的文件的內容
7. 把內容回傳給客戶端
8. 關閉與客戶端對接的socket
9. 關閉服務端server_socket,不再接收新的下載文件的請求
"""

參考代碼如下:

      

      

      

 

    

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM