TCP協議
Transmission Control Protocol
傳輸控制協議,屬於傳輸層通訊協議,基於TCP的應用層協議有Htt,smtp,ftp等
TCP的特性
-
面向連線: 傳輸資料之前會先建立連線,資料傳輸完畢之後釋放連線
-
全雙工通訊:連線建立以後,通訊雙方能互相傳送資料
-
安全可靠:通過TCP傳送的資料不丟失,無差錯,按序到達
-
TCP 使用校驗和,確認和重傳機制來保證可靠傳輸
-
資料以位元組流的方式傳輸
-
傳輸效率較低,因為需要建立連線和傳送確認包等
注意: TCP 並不能保證資料一定會被對方接收到,因為這是不可能的。TCP 能夠做到的是,如果有可能,就把資料遞送到接收方,否則就(通過放棄重傳並且中斷連線這一手段)通知使用者。因此準確說 TCP 也不是 100% 可靠的協議,它所能提供的是資料的可靠遞送或故障的可靠通知。
TCP建立連線的過程(三次握手)
三次握手指的是建立一個TCP連線需要客戶端和伺服器一共傳送3個包。三次握手的目的是連線伺服器指定埠,建立 TCP 連線,並同步連線雙方的序列號和確認號,交換 TCP 視窗大小資訊。在 socket 程式設計中,客戶端執行 connect() 時。將觸發三次握手。
通過抓包可以看到具體,紅框表示三次握手,黃框表示四次揮手。可以看到傳送的標記為和序列號和確認號。
首先,客戶端和服務端都是處於關閉的狀態,直到客戶端主動開啟連線,服務端會被動開啟連線,服務端現在處於listen
狀態。
SYN,ACK,Seq到底是什麼東西
SYN,ACK 是TCP的標記位,TCP的標記位一共有6種。
-
SYN(synchronous建立聯機)
-
ACK(acknowledgement 確認)
-
PSH(push傳送)
-
FIN(finish結束)
-
RST(reset重置)
-
URG(urgent緊急)
-
Sequence number(順序號碼)
-
Acknowledge number(確認號碼)
1. 第一次握手(SYN=1,seq=x)
客戶端A傳送一個位碼 SYN = 1,然後會隨機產生一個序列號 seq = 1234567的資料包到伺服器,這個時候伺服器收到SYN=1知道了客戶端A要求建立連線。客戶端A此時處於SYN_SEND
狀態
2. 第二次握手(SYN = 1, ACK = 1,seq = y, ack = x + 1)
伺服器收到請求連線資訊之後要確認聯機資訊,向主機A傳送ack number =(主機A的seq + 1 ),SYN = 1,ACK = 1,隨機產生一個序列號 seq = 7654321。 伺服器此時處於 SYN_RCVD
狀態。
3. 第三次握手(ACK = 1 ,ack = y + 1)
主機A收到後檢查ack number是否正確,即第一次傳送的seq number+1,以及位碼ack是否為1,若正確,主機A會再傳送ack number=(伺服器seq+1),ack=1,然後主機A進入ESTABLISHED
狀態。伺服器收到後確認seq值與ack=1則連線建立成功。伺服器也進入ESTABLISHED
狀態。
Q1:為什麼TCP建立連線要進行三次握手
防止伺服器端因接收了早已失效的連線請求報文,從而一直等待客戶端請求,最終導致形成死鎖、浪費資源
TCP釋放連線的過程(四次揮手)
通訊結束之後,雙方都需要釋放連線,需要四次揮手
1. 第一次揮手(FIN = 1,seq = u)
客戶端想要關閉連線,會傳送一個標記位FIN = 1的包,表明已經沒有資料可以傳送了,但是仍可以接收資料。
此時客戶端處於FIN_WAIT_1
狀態
2. 第二次揮手(ACK = 1 , ack = u+1)
服務端收到了客戶端的FIN包,然後傳送一個ACK = 1 的確認包,表明自己接收到了客戶端的關閉連線的請求,但是還沒準備好關閉。服務端傳送完畢之後,進入CLOSE_WAIT
狀態。客戶端收到這個包的時候進入FIN_WAIT_2
狀態。
3. 第三次揮手(FIN = 1,seq = w)
當服務端準備好關閉連線的時候,向客戶端傳送FIN=1,表明自己準備好關閉連線了。傳送完畢之後服務端進入LASK_ACK
狀態,等待客戶端的最後一個確認ACK。
4. 第四次揮手(ACK = 1,ack = w+1)
客戶端接收到了服務端的的關閉請求之後,傳送最後一個ACK=1確認包,然後進入到TIME_WAIT
狀態,等待可能出現的ACK包。伺服器收到最後一個ACK之後,確認關閉連線,進入CLOSE
狀態。
客戶端在等待了某個固定時間之後,沒有收到服務端的ACK,就認為服務端已經正常關閉連線了,於是也將自己的連線關閉了,進入CLOSE
狀態。
UDP協議
UDP 是一個簡單的傳輸層協議。
UDP的特性
-
無連線。UDP的客戶端和伺服器不必存在長期連線的關係。UDP在傳送資料包之前也不用先與服務端建立連線
-
不可靠。UDP 本身不提供確認,序列號,超時重傳等機制。UDP 資料包可能在網路中被複制,被重新排序。即 UDP 不保證資料包會到達其最終目的地,也不保證各個資料包的先後順序,也不保證每個資料包只到達一次。
-
資料包是有長度限制的。
-
UDP支援廣播和多播。
-
傳輸效率高
本篇文章主要介紹了TCP建立連線的三次握手和釋放連線的四次揮手。
參考: