天天看點

網絡程式設計運輸層TCP/UDP面試知識點(中)4 TCP(Transmission Control Protocol)5 TCP 封包段的首部格式

4 TCP(Transmission Control Protocol)

TCP是傳輸控制協定,一種面向連接配接的、可靠的、基于位元組流的傳輸層通信協定,由IETF的RFC 793定義。

4.1 特點

面向連接配接

連接配接需要先建立再使用,建立連接配接的三次握手有一定開銷。兩個使用 TCP的應用在交換資料前必須先建立一個 TCP 連接配接,在一個 TCP 連接配接中,僅有兩方進行彼此通信,廣播和多點傳播不能用于 TCP

每條 TCP 連接配接隻能有兩個端點(endpoint)

每條 TCP 連接配接隻能是點對點(一對一)

可靠傳遞

全雙工通信

面向位元組流

兩個應用程式通過 TCP 連接配接,TCP 不在位元組中插入記錄辨別符。TCP對位元組流内容不做任何編解碼解釋,不知道傳輸的位元組流資料是二進制資料還是 ASCII 字元或其它類型資料,對位元組流的編解碼由TCP連接配接雙方的應用層協商。

位元組是發送資料的最小單元,TCP協定本身無法區分哪幾個位元組是完整的消息體,也無法感覺是否有多個用戶端在使用同一個TCP連接配接,TCP隻是一個讀寫資料的管道。

TCP 面向流的概念

網絡程式設計運輸層TCP/UDP面試知識點(中)4 TCP(Transmission Control Protocol)5 TCP 封包段的首部格式
網絡程式設計運輸層TCP/UDP面試知識點(中)4 TCP(Transmission Control Protocol)5 TCP 封包段的首部格式

注意

  • TCP 連接配接是一條虛連接配接而不是一條真正的實體連接配接
  • TCP 對應用程序一次把多長的封包發送到TCP 的緩存中是不關心的
  • TCP 根據對方給出的視窗值和目前網絡擁塞的程度來決定一個封包段應包含多少個位元組(而UDP 發送的封包長度是應用程序給出的)
  • TCP 可把太長的資料塊劃分短一些再傳送

    TCP 也可等待積累有足夠多的位元組後再構成封包段發送出去

4.2 TCP 的連接配接

TCP 把連接配接作為最基本的抽象,每一條 TCP 連接配接有兩個端點。TCP 連接配接的端點不是主機、主機的IP 位址、應用程序、運輸層的協定端口,TCP 連接配接的端點叫做套接字(socket)!端口号拼接到(contatenated with) IP 位址即構成了套接字。

4.2.1 套接字 (Socket)

Socket = (IP位址: 端口号) 。每一條 TCP 連接配接唯一地被通信兩端的兩個端點(即兩個套接字)所确定,即:

TCP 連接配接 ::= {socket1, socket2} 
          = {(IP1: port1), (IP2: port2)}        

是以一個 socket 就是一個網絡通信資源組。

Socket的多重含義

  • 應用程式設計接口 API 稱為 socket API,簡稱為 socket
  • socket API 中使用的一個函數名也叫作 socket
  • 調用 socket 函數的端點稱為 socket
  • 調用 socket 函數時其傳回值稱為 socket 描述符,可簡稱為 socket
  • 在作業系統核心中連網協定的 Berkeley 實作,稱為 socket 實作

4.2.2 三次握手

  • TCP建立連接配接的三次握手
  • 網絡程式設計運輸層TCP/UDP面試知識點(中)4 TCP(Transmission Control Protocol)5 TCP 封包段的首部格式
  • 第一次握手

    建立連接配接時,用戶端發送syn包(syn=j)到伺服器,進入

    SYN_SEND

    态,待伺服器确認
SYN:同步序列編号(Synchronize Sequence Numbers)

第二次握手

伺服器收到syn包,必須确認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,伺服器進入SYN_RECV态

第三次握手

用戶端收到伺服器的SYN+ACK包,向伺服器發送确認包ACK(ack=k+1),此包發送完畢,用戶端和伺服器進入ESTABLISHED狀态,完成三次握手

完成三次握手,也就建立了用戶端與服務端的連接配接。用戶端與伺服器開始傳送資料。一個完整的三次握手也就是:請求—應答—再次确認。

那說到現在,到底什麼是連接配接?也就是經過 TCP 三次握手後,雙方主機準備好資料傳輸的資源(比如各種資料結構)。

4.2.3 四次揮手

由于TCP連接配接是全雙工,是以每個方向都必須

單獨進行關閉

原則

當一方完成它的資料發送任務後,就能發送一個FIN來終止這個方向的連接配接。

收到一個 FIN隻代表這一方向上沒有資料流動,一個TCP連接配接在收到一個FIN後仍能發送資料。

首先進行關閉的一方将執行主動關閉,另一方執行被動關閉。

工作流程

  • 用戶端A發送一個FIN,以關閉Client A ---->>>Server B的資料傳送
  • B收FIN,發ACK,确認序号為收到的序号加1
  • B關閉與A的連接配接,發FIN給A
  • A發ACK封包确認,并将确認序号設定為收到序号加1
  • 網絡程式設計運輸層TCP/UDP面試知識點(中)4 TCP(Transmission Control Protocol)5 TCP 封包段的首部格式
  • 如下圖中上框就是三次揮手,下框内即是四次揮手
  • 網絡程式設計運輸層TCP/UDP面試知識點(中)4 TCP(Transmission Control Protocol)5 TCP 封包段的首部格式

4.2.4 為什麼建立連接配接是三次握手,而關閉連接配接卻四次握手

服務端的

listen

狀态下的socket當收到syn封包的連接配接請求後,它可把ACK和SYN(ACK起應答作用,SYN起同步作用)放在同一個封包發送。

但關連接配接時,當收到對方的FIN封包時,僅表示對方沒有資料發送給你了,但未必你所有的資料都全部發送給對方了,是以你大可不必立即關閉socket,即你可能還需發送一些資料後,再發FIN來表示你也可以關連接配接了,是以這裡的ACK封包和FIN封包多數情況下都是分開發送的。

4.3 可靠傳輸

4.3.1 工作原理

網絡程式設計運輸層TCP/UDP面試知識點(中)4 TCP(Transmission Control Protocol)5 TCP 封包段的首部格式

  • 在發送完一個分組後,必須

    暫時保留已發送的分組的副本

  • 分組和确認分組都必須進行編号
  • 逾時計時器的重傳時間應當比資料在分組傳輸的平均往返時間更長一些
  • 網絡程式設計運輸層TCP/UDP面試知識點(中)4 TCP(Transmission Control Protocol)5 TCP 封包段的首部格式

4.3.2 可靠傳輸的實作

TCP 通過下列方式提供可靠性

  • 将應用資料分割為 TCP 認為最合适發送的資料塊
  • 逾時重傳
  • 當 TCP 發出一個段後,他啟動一個定時器,等待目的端确認收到這個封包段

若不能及時收到一個确認,将重發這個封包段

當 TCP 收到發自 TCP 連結另一端的資料時,它将發送一個确認(對于收到的請求,給出确認響應)

這個确認不是立即發送,通常将推遲幾分之一秒(之是以推遲,可能是要對包做完校驗)

若 TCP 收到包,校驗出包有錯,丢棄封包段,不給出響應,TCP 發送端會逾時重傳

對于失序資料進行重排序,然後交給應用層

TCP 封包段作為 ip 資料報進行傳輸,而 ip 資料報的到達會失序,是以 TCP 封包段的到達也可能失序。若必要,TCP 将對收到的資料進行重新排列,以正确的順序交給應用層

對于重複資料,直接丢棄。

TCP 可以進行流量控制,防止較快主機緻使較慢主機的緩沖區溢出。

使用上述的确認和重傳機制,我們就可以在不可靠的傳輸網絡上實作可靠的通信

這種可靠傳輸協定常稱為自動重傳請求ARQ (Automatic Repeat reQuest)

  • ARQ表明重傳的請求是自動進行的

    接收方不需要請求發送方重傳某個出錯的分組

4.3.3 TCP 可靠通信的具體實作

TCP 連接配接的每一端都必須設有兩個視窗

  • 一個發送視窗
  • 一個接收視窗

TCP 的可靠傳輸機制用位元組的序号進行控制:所有的确認都是基于序号而不是基于封包段

TCP 兩端的四個視窗經常處于動态變化中

TCP 連接配接的往返時間 RTT 也不是固定不變的:需要使用特定的算法估算較為合理的重傳時間

應用場景

聊天消息傳輸、推送,單人語音、視訊聊天等。幾乎UDP能做的都能做,但需要考慮複雜性、性能問題。

限制

無法進行廣播、多點傳播等操作

5 TCP 封包段的首部格式

網絡程式設計運輸層TCP/UDP面試知識點(中)4 TCP(Transmission Control Protocol)5 TCP 封包段的首部格式

源/目的端口——各占 2 位元組

端口是運輸層與應用層的服務接口:運輸層的複用和分用都要通過端口實作

序号——占 4 位元組

傳送的資料流中的每一個位元組都編上一個序号:序号的值則指的是本封包段所發送資料的第一個位元組的序号

确認号——占 4 位元組

期望收到對方下一個封包段的資料的第一個位元組的序号

資料偏移(首部長度)——占 4 位

指出封包段的資料起始處距離封包段的起始處有多遠:“資料偏移”的機關是 32 位字(以 4 位元組為計算機關)

保留——占 6 位

為今後使用,但目前應置為 0

緊急 URG

URG = 1:緊急指針字段有效.它告訴系統此封包段中有緊急資料,應盡快傳送(相當于高優先級的資料)

确認 ACK

隻有當 ACK = 1 時确認号字段才有效;

當 ACK = 0 時,确認号無效

推送 PSH (PuSH)

接收 TCP 收到 PSH = 1 的封包段,就盡快地傳遞接收應用程序,而不再等到整個緩存都填滿了後再向上傳遞

複位 RST (ReSeT)

當 RST = 1 時:TCP 連接配接中出現嚴重差錯(如由于主機崩潰或其他原因),必須釋放連接配接,然後再重建立立運輸連接配接

同步 SYN

SYN = 1:這是一個連接配接請求或連接配接接受封包

終止 FIN (FINis)

用來釋放一個連接配接

FIN = 1:此封包段的發送端的資料已發送完畢,并要求釋放運輸連接配接

視窗字段 —— 占 2 位元組

用來讓對方設定發送視窗的依據,機關為位元組(發送方的接收視窗)

檢驗和 —— 占 2 位元組

檢驗的範圍包括首部和資料兩部分

在計算檢驗和時,要在 TCP 封包段的前面加上 12 位元組的僞首部

緊急指針字段 —— 占 16 位

指出在本封包段中緊急資料共有多少個位元組(緊急資料放在本封包段資料的最前面)

選項 —— 長度可變

TCP 最初隻規定了一種選項:最大封包段長度(MSS).

MSS 告訴對方 TCP:“我的緩存所能接收的封包段的資料字段的最大長度是 MSS 個位元組。”

MSS (Maximum Segment Size)

是 TCP 封包段中的資料字段的最大長度.

資料字段加上 TCP 首部,才等于整個的 TCP 封包段。

視窗擴大 ——占 3 位元組

有一個位元組表示移位值 S。

新的視窗值等于TCP 首部中的視窗位數增大到(16 + S),相當于把視窗值向左移動 S 位後獲得實際的視窗大小

時間戳選項——占10 位元組

其中最主要的字段時間戳值字段(4 位元組)和時間戳回送回答字段(4 位元組)

選擇确認選項

填充

這是為了使整個首部長度是 4 位元組的整數倍

繼續閱讀