一、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,不再接收新的下載文件的請求
"""
參考代碼如下: