網絡-TCP

TCP介紹

TCP協議,傳輸控制協議(英語:Transmission Control Protocol,縮寫爲 TCP是一種面向鏈接的、可靠的、基於字節流的傳輸層通訊協議,由IETF的RFC 793定義。服務器

TCP通訊須要通過建立鏈接、數據傳送、終止鏈接三個步驟。網絡

TCP通訊模型中,在通訊開始以前,必定要先創建相關的鏈接,才能發送數據,相似於生活中,"打電話".socket

TCP特色

1. 面向鏈接

通訊雙方必須先創建鏈接才能進行數據的傳輸,雙方都必須爲該鏈接分配必要的系統內核資源,以管理鏈接的狀態和鏈接上的傳輸。tcp

雙方間的數據傳輸均可以經過這一個鏈接進行。函數

完成數據交換後,雙方必須斷開此鏈接,以釋放系統資源。操作系統

這種鏈接是一對一的,所以TCP不適用於廣播的應用程序,基於廣播的應用程序請使用UDP協議。翻譯

2. 可靠傳輸

  1. TCP採用發送應答機制

TCP發送的每一個報文段都必須獲得接收方的應答才認爲這個TCP報文段傳輸成功3d

  1. 超時重傳

發送端發出一個報文段以後就啓動定時器,若是在定時時間內沒有收到應答就從新發送這個報文段。code

TCP爲了保證不發生丟包,就給每一個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。而後接收端實體對已成功收到的包發回一個相應的確認(ACK);若是發送端實體在合理的往返時延(RTT)內未收到確認,那麼對應的數據包就被假設爲已丟失將會被進行重傳。cdn

  1. 錯誤校驗

TCP用一個校驗和函數來檢驗數據是否有錯誤;在發送和接收時都要計算校驗和。

  1. 流量控制和阻塞管理

流量控制用來避免主機發送得過快而使接收方來不及徹底收下。

TCP與UDP的不通點

  • 面向鏈接(確認有建立三方交握,鏈接已建立才做傳輸。)
  • 有序數據傳輸
  • 重發丟失的數據包
  • 捨棄重複的數據包
  • 無差錯的數據傳輸
  • 阻塞/流量控制

UDP通訊模型

udp通訊模型中,在通訊開始以前,不須要創建相關的連接,只須要發送數據便可,相似於生活中,"寫信"

TCP通訊模型

udp通訊模型中,在通訊開始以前,必定要先創建相關的連接,才能發送數據,相似於生活中,"打電話"

TCP注意點

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

UDP/TCP流程

UDP流程 TCP客戶端流程 TCP服務器
socket socket socket
bind bind bind
send/recv connect listen
close close accept
send/recv
close

TCP三次握手

在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鏈接成功). 此時三次握手完畢.

圖解以下

相關文章
相關標籤/搜索