TCP協議,傳輸控制協議(英語:Transmission Control Protocol,縮寫爲 TCP是一種面向鏈接的、可靠的、基於字節流的傳輸層通訊協議,由IETF的RFC 793定義。服務器
TCP通訊須要通過建立鏈接、數據傳送、終止鏈接三個步驟。網絡
TCP通訊模型中,在通訊開始以前,必定要先創建相關的鏈接,才能發送數據,相似於生活中,"打電話".socket
通訊雙方必須先創建鏈接才能進行數據的傳輸,雙方都必須爲該鏈接分配必要的系統內核資源,以管理鏈接的狀態和鏈接上的傳輸。tcp
雙方間的數據傳輸均可以經過這一個鏈接進行。函數
完成數據交換後,雙方必須斷開此鏈接,以釋放系統資源。操作系統
這種鏈接是一對一的,所以TCP不適用於廣播的應用程序,基於廣播的應用程序請使用UDP協議。翻譯
TCP發送的每一個報文段都必須獲得接收方的應答才認爲這個TCP報文段傳輸成功3d
發送端發出一個報文段以後就啓動定時器,若是在定時時間內沒有收到應答就從新發送這個報文段。code
TCP爲了保證不發生丟包,就給每一個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。而後接收端實體對已成功收到的包發回一個相應的確認(ACK);若是發送端實體在合理的往返時延(RTT)內未收到確認,那麼對應的數據包就被假設爲已丟失將會被進行重傳。cdn
TCP用一個校驗和函數來檢驗數據是否有錯誤;在發送和接收時都要計算校驗和。
流量控制用來避免主機發送得過快而使接收方來不及徹底收下。
udp通訊模型中,在通訊開始以前,不須要創建相關的連接,只須要發送數據便可,相似於生活中,"寫信"
udp通訊模型中,在通訊開始以前,必定要先創建相關的連接,才能發送數據,相似於生活中,"打電話"
UDP流程 | TCP客戶端流程 | TCP服務器 |
---|---|---|
socket | socket | socket |
bind | bind | bind |
send/recv | connect | listen |
close | close | accept |
send/recv | ||
close |
在UDP中, 一大特色是咱們發的數據,接收端有沒有收到咱們並不知
而TCP的特色, 操做系統的底層會相互打交道告訴對方消息收到了
更詳細的過程請看百度百科三次握手
縮寫 | 全稱 | 翻譯 | 描述 |
---|---|---|---|
SYN | Synchronize Sequence Numbers | 同步序列編號 | TCP鏈接的第一個包,很是小的一種數據包。在客戶機和服務器之間創建正常的TCP網絡鏈接時,客戶機首先發出一個SYN消息。 |
ACK | Acknowledgement | 確認字符 | 在TCP/IP協議中,若是接收方成功的接收到數據,那麼會回覆一個ACK數據。 |
SYN_SENT | Transmission Control Protocol, TCP | 傳輸控制協議 | SYN_SENT表示請求鏈接,當你要訪問其它的計算機的服務時首先要發個同步信號給該端口,此時狀態爲SYN_SENT,若是鏈接成功了就變爲ESTABLISHED,此時SYN_SENT狀態很是短暫。 |
SYN_RECV | SYN_RECV是指,服務端被動打開後,接收到了客戶端的SYN而且發送了ACK時的狀態。再進一步接收到客戶端的ACK就進入ESTABLISHED狀態。 | ||
ESTABLISHED | 含義TCP:鏈接成功,establish的過去式 |
至於爲何是三次握手, 知乎上也有不少人解答TCP 爲何是三次握手,而不是兩次或四次?
簡單梳理一下流程
第一次握手
client(客戶端)
向server(服務器)
發送一個SYN(同步序列編號) = j
的包, 同時進入SYN_SENT
狀態, 等待服務器回覆
第二次握手
server(服務器)
收到client(客戶端)
的SYN(同步序列編號)
包, 會進行確認獲得ACK = j+1
.與此同時本身也會發送一個(SYN(同步序列編號) = k)
+ACK(確認字符)
的包給client(客戶端)
, 此時服務器進入SYN_RECV
的狀態, 等待客戶端再次回覆
第三次握手
client(客戶端)
收到server(服務器)
的SYN(同步序列編號)
+ACK(確認字符)
包, 會再次向server(服務器)
發送一個ACK(確認字符) = k+1
確認包, 此包發送完畢,客戶端會進入ESTABLISHED(TCP鏈接成功)
狀態. 若是服務器有收到這個ACK(確認字符)
, 服務器也進入ESTABLISHED(TCP鏈接成功)
. 此時三次握手完畢.
圖解以下