3次握手+4次揮手+11種狀態集
- 2019 年 12 月 13 日
- 筆記
2
TCP的介紹
TCP也叫傳輸控制協議(Transmission Control Protocol)是一種面向連接的、可靠的、基於位元組流的傳輸層通訊協議,由IETF的RFC 793定義。
3
TCP的特點
1
面向連接
✦ TCP通訊需要經過創建連接、數據傳送、終止連接三個步驟。
✦ 在通訊開始之前,先建立相關的鏈接,才能發送數據,類似於生活中,"打電話"。
✦ 完成數據交換後,雙方必須斷開此連接,以釋放系統資源。
✦ 這種連接是一對一的,因此TCP不適用於廣播的應用程式,基於廣播的應用程式請使用UDP協議。
可靠傳輸
✦ TCP發送的每個報文段都必須得到接收方的應答才認為這個TCP報文段傳輸成功
✦ 發送端發出一個報文段之後就啟動定時器,如果在定時時間內沒有收到應答就重新發送這個報文段。
✦ TCP為了保證不發生丟包,就給每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。
✦ TCP用一個校驗和函數來檢驗數據是否有錯誤,在發送和接收時都要計算校驗和。
4
TCP通訊模型
TCP通訊模型中,在通訊開始之前,一定要先建立相關的鏈接,才能發送數據,類似於生活中,"打電話"

5
TCP客戶端構建流程
比如一個人想打10086求助人工服務。 tcp的客戶端要比伺服器端簡單很多,客戶端只需要找一個電話亭,拿起電話撥打即可。
示例程式碼:
from socket import * # 創建socket tcp_client_socket = socket(AF_INET, 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("gbk")) # 接收對方發送過來的數據,最大接收1024個位元組 recvData = tcp_client_socket.recv(1024) print('接收到的數據為:', recvData.decode('gbk')) # 關閉套接字 tcp_client_socket.close()
6
TCP服務端構建流程

在程式中,要完成一個tcp伺服器的功能,需要的流程如下:
- socket創建一個套接字;
- bind綁定ip和port;
- listen使套接字變為可以被動套接字;
- accept取出一個客戶端連接 用以服務;
- recv/send接收發送數據;
示例程式碼:
from socket import * # 創建socket tcp_server_socket = socket(AF_INET, SOCK_STREAM) # 本地資訊 address = ('', 7788) # 綁定 tcp_server_socket.bind(address) # 使用socket創建的套接字 tcp_server_socket.listen(128) # 如果有新的客戶端來鏈接伺服器,那麼就產生一個新的套接字專門為這個客戶端服務 client_socket, clientAddr = tcp_server_socket.accept() # 接收對方發送過來的數據 recv_data = client_socket.recv(1024) print('接收到的數據為:', recv_data.decode('gbk')) # 發送一些數據到客戶端 client_socket.send("thank you !".encode('gbk')) # 關閉為這個客戶端服務的套接字 client_socket.close()
7
TCP的3次握手
SYN
請求建立連接欄位:1表示與對方要進行網路連接建立 ,0 表示默認沒有連接建立請求。
ACK
確認控制欄位:1表示上一次發送的數據對方接收了,0 表示沒有接收到上次發送的數據資訊。
seq
隨機序列號。

8
TCP的4次揮手
FIN
請求斷開連接欄位:1表示與對方斷開網路連接,0 表示默認沒有斷開連接請求。
ack
隨機序號回復(ack=seq+1)。
ctl
控制欄位號。

9
TCP的11種狀態集

TCP十一種狀態轉移總結 |
|||
---|---|---|---|
出現方式 |
出現環境 |
狀態名稱 |
狀態描述 |
TCP建立過程 |
服務端/客戶端 |
CLOSED |
默認初始化狀態 |
服務端 |
LISTEN |
建立socket,進入監聽狀態 |
|
客戶端 |
SYN_SENT |
發送syn報文,進入syn發送狀態 |
|
服務端 |
SYN_RCVD |
接受syn報文,並回復ack及syn報文 |
|
服務端/客戶端 |
ESTABLISHED |
接受syn報文,回復ack建立連接(客戶端)接受ack報文,建立連接(服務端) |
|
TCP斷開過程 |
服務端/客戶端 |
ESTABLISHED |
默認斷開前初始化狀態 |
客戶端 |
FIN_WAIT1 |
發送斷開請求FIN報文 |
|
服務端 |
CLOSE_WAIT |
收到FIN後向客戶端發送ACK |
|
客戶端 |
FIN_WAIT2 |
收到服務端返回的ACK報文,等待數據傳輸。 |
|
服務端 |
LAST_ACK |
發送FIN斷開請求報文 |
|
客戶端 |
TIME_WAIT |
回復FIN斷開請求,發送ack報文 |
|
服務端/客戶端 |
CLOSED |
收到ack報文立即轉換為斷開狀態,等待2MSL後,轉變為斷開狀態 |
|
客戶端 |
CLOSEING |
沒有收到回復FIN報文的ACK,直接收到FIN |
10
tcp/ip協議簇
- 為了把全世界的所有不同類型的電腦都連接起來,就必須規定一套全球通用的協議,為了實現互聯網這個目標,互聯網協議族(Internet Protocol Suite)就是通用協議標準。
- 互聯網協議包含了上百種,最重要的是TCP和IP協議,所以,互聯網的協議簡稱TCP/IP協議(族)
TCP/IP協議簇之間的關係

TCP/IP協議傳輸示意圖
