初識Tcp

still6發表於2018-04-29

TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議,由IETF的RFC 793定義。

在簡化的計算機網路OSI模型中,它完成第四層傳輸層所指定的功能,使用者資料包協議(UDP)是同一層內另一個重要的傳輸協議。

在因特網協議族(Internet protocol suite)中, TCP層是位於IP層之上,應用層之下的中間層。

眾所周知, Tcp是傳輸層, Http是應用層, 以下是初識Tcp的知識 。

1.OSI七層網路模型

OSI是Open System Interconnection的縮寫,意為開放式系統互聯。國際標準化組織(ISO)制定了OSI模型,該模型定義了不同計算機互聯的標準,是設計和描述計算機網路通訊的基本框架。OSI模型把網路通訊的工作分為7層,分別是物理層、資料鏈路層、網路層、傳輸層、會話層、表示層和應用層。首先來看看OSI的七層模型:

OSI七層網路模型

2.TCP/IP參考模型

TCP/IP是傳輸控制協議/網路互聯協議的簡稱。早期的TCP/IP模型是一個四層結構,從下往上依次是網路介面層、網際網路層、傳輸層和應用層。後來在使用過程中,借鑑OSI七層參考模型,將網路介面層劃分為了物理層和資料鏈路層,形成五層結構。

TCP/IP參考模型

3.傳輸層

傳輸層是面向連線的、可靠的的程式到程式通訊的協議。TCP提供全雙工服務,即資料可在同一時間雙向傳播。TCP將若干個位元組構成一個分組,此分組稱為報文段(Segment)。提供了一種端到端的連線。 傳輸層的協議主要是TCP ,TCP(Transimision Control Protocal)是一種可靠的、面向連線的協議,傳輸效率低。

4.TCP格式

TCP格式

  • 源埠號和目標埠號,計算機通過埠號識別訪問哪個服務,比如http服務或ftp服務,傳送方埠號是進行隨機埠,目標埠號決定了接收方哪個程式來接收。
  • 32位序列號 TCP用序列號對資料包進行標記,以便在到達目的地後重新重灌,假設當前的序列號為 s,傳送資料長度為 l,則下次傳送資料時的序列號為 s + l。在建立連線時通常由計算機生成一個隨機數作為序列號的初始值。
  • 確認應答號 它等於下一次應該接收到的資料的序列號。假設傳送端的序列號為 s,傳送資料的長度為 l,那麼接收端返回的確認應答號也是 s + l。傳送端接收到這個確認應答後,可以認為這個位置以前所有的資料都已被正常接收。
  • 首部長度:TCP 首部的長度,單位為 4 位元組。如果沒有可選欄位,那麼這裡的值就是 5。表示 TCP 首部的長度為 20 位元組。
  • 控制位 TCP的連線、傳輸和斷開都受這六個控制位的指揮
    • PSH(push急迫位) 快取區將滿,立刻傳輸速度
    • RST(reset重置位) 連線斷了重新連線
    • URG(urgent緊急位) 緊急訊號
    • ACK(acknowledgement 確認)為1表示確認號
    • SYN(synchronous建立聯機) 同步序號位 TCP建立連線時要將這個值設為1
    • FIN傳送端完成位,提出斷開連線的一方把FIN置為1表示要斷開連線
  • 視窗值 說明本地可接收資料段的數目,這個值的大小是可變的。當網路通暢時將這個視窗值變大加快傳輸速度,當網路不穩定時減少這個值可以保證網路資料的可靠傳輸。它是來在TCP傳輸中進行流量控制的。
  • 視窗大小:用於表示從應答號開始能夠接受多少個 8 位位元組。如果視窗大小為 0,可以傳送視窗探測。
  • 效驗和: 用來做差錯控制,TCP校驗和的計算包括TCP首部、資料和其它填充位元組。在傳送TCP資料段時,由傳送端計算校驗和,當到達目的地時又進行一次檢驗和計算。如果兩次校驗 和一致說明資料是正確的,否則 將認為資料被破壞,接收端將丟棄該資料。
  • 緊急指標:盡在 URG(urgent緊急) 控制位為 1 時有效。表示緊急資料的末尾在 TCP 資料部分中的位置。通常在暫時中斷通訊時使用(比如輸入 Ctrl + C)。

5.三次握手

TCP是面向連線的,無論哪一方向另一方傳送資料之前,都必須先在雙方之間建立一條連線。在TCP/IP協議中,TCP 協議提供可靠的連線服務,連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號 並交換 TCP視窗大小資訊。

TCP格式

為了方便描述我們將主動發起請求的172.16.17.94:8080 主機稱為客戶端,將返回資料的主機172.16.17.94:8080稱為伺服器,以下也是。

  • 第一次握手: 建立連線。客戶端傳送連線請求,傳送SYN報文,將seq設定為0。然後,客戶端進入SYN_SEND狀態,等待伺服器的確認。
  • 第二次握手: 伺服器收到客戶端的SYN報文段。需要對這個SYN報文段進行確認,傳送ACK報文,將ack設定為1。同時,自己還要傳送SYN請求資訊,將seq為0。伺服器端將上述所有資訊一併傳送給客戶端,此時伺服器進入SYN_RECV狀態。
  • 第三次握手: 客戶端收到伺服器的ACK和SYN報文後,進行確認,然後將ack設定為1,seq設定為1,向伺服器傳送ACK報文段,這個報文段傳送完畢以後,客戶端和伺服器端都進入ESTABLISHED狀態,完成TCP三次握手。

6.資料傳輸

TCP格式

  • 客戶端先向伺服器傳送資料,該資料包是長度為159的資料。
  • 伺服器收到報文後, 也向客戶端傳送了一個資料進行確認(ACK),並且返回客戶端要請求的資料,資料的長度為111,將seq設定為1,ack設定為160(1 + 159)。
  • 客戶端收到伺服器返回的資料後進行確認(ACK),將seq設定為160, ack設定為112(1 + 111)。

7.四次揮手

TCP格式

  • 第一次揮手:客戶端向伺服器傳送一個FIN報文段,將設定seq為160和ack為112,;此時,客戶端進入 FIN_WAIT_1狀態,這表示客戶端沒有資料要傳送伺服器了,請求關閉連線。
  • 第二次揮手:伺服器收到了客戶端傳送的FIN報文段,向客戶端回一個ACK報文段,ack設定為1,seq設定為112;伺服器進入了CLOSE_WAIT狀態,客戶端收到伺服器返回的ACK報文後,進入FIN_WAIT_2狀態。
  • 第三次揮手:伺服器會觀察自己是否還有資料沒有傳送給客戶端,如果有,先把資料傳送給客戶端,再傳送FIN報文;如果沒有,那麼伺服器直接傳送FIN報文給客戶端。請求關閉連線,同時伺服器進入LAST_ACK狀態。
  • 第四次揮手:客戶端收到伺服器傳送的FIN報文段,向伺服器傳送ACK報文段,將seq設定為161,將ack設定為113,然後客戶端進入TIME_WAIT狀態;伺服器收到客戶端的ACK報文段以後,就關閉連線;此時,客戶端等待2MSL後依然沒有收到回覆,則證明Server端已正常關閉,客戶端也可以關閉連線了。

8.總結

注意:在握手和揮手時確認號應該是對方序列號加1,傳輸資料時則是對方序列號加上對方攜帶應用層資料的長度。