计算机网络-TCP协议
目錄
- 1 概述
- 2 TCP的主要特點
- 3 TCP的連接
- 4 可靠傳輸的工作原理
- 4.1 停止等待協議
- 4.1.1 無差錯情況
- 4.1.2 出現差錯
- 4.2 自動重傳請求ARQ
- 4.3 連續 ARQ 協議
- 4.3.1 基本思想
- 5 TCP的流量控制
- 6 TCP的擁塞控制
- 7 TCP的運輸連接管理
- 8 TCP報文段的首部格式
1 概述
傳輸控制協議(TCP,Transmission Control Protocol),它是為了在不可靠的互聯網絡上提供可靠的端到端字節流而專門設計的一個傳輸協議
2 TCP的主要特點
面向字節流:
- TCP 中的“流”(stream) 指的是流入或流出進程的字節序列
- “面向字節流”的含義是:雖然應用程序和 TCP 的交互是一次一個數據塊,但 TCP 把應用程序交下來的數據看成僅僅是一連串無結構的字節流,也就是說其實數據都是有一定結構的,但是在TCP眼里它都是無結構的字節串
- TCP 不保證接收方應用程序所收到的數據塊和發送方應用程序所發出的數據塊具有對應大小的關系,也就是說發送方發送一定規格和數量的數據塊,接收方不一定最后收到的是同樣規格和數量的數據塊,但是能保證的是最后得到的數據,一定是無差錯的
- 但接收方應用程序收到的字節流必須和發送方應用程序發出的字節流完全一樣,在發送過程中到底如何分塊,TCP不關心,TCP只關心最后數據肯定是和發送方發送過來的數據完全一樣
注意:
3 TCP的連接
TCP的連接是一條點對點的連接:
套接字我們認為是TCP連接的一端,有了兩個套接字,我們就可以 建立一條TCP連接
4 可靠傳輸的工作原理
4.1 停止等待協議
TCP協議是一個很復雜的協議,它在面向連接的基礎上,通過若干控制,可以達到可靠傳輸,擁塞控制,連接管理等功能
- 在運輸層之下的網絡層,IP協議能夠做到盡最大努力交付,也就是說IP數據報從一臺主機到達另一臺主機是可以通過路由來找到一條合適的路徑到達對方,但是最后能不能到達對方,中間會不會出錯,這個IP協議是不能保證的
- 在IP之上,運輸層當中的TCP協議,在連接的基礎之上,可以做到在不可靠的通信鏈路上實現可靠傳輸
我們可以想象,理想的傳輸條件應該具有以下兩個特點:
然而實際的網絡都不具備以上兩個理想條件。必須使用一些可靠傳輸協議,在不可靠的傳輸信道實現可靠傳輸,其中停止等待協議就是其中典型的一個協議,
停止等待協議:
- “停止等待”就是每發送完一個分組就停止發送,等待對方的確認。在收到確認后再發送下一個分組,對方確認保證了數據的無差錯,由于發送的數據也是按順序發送的,所有最后數據的順序也不會出現錯亂
- 全雙工通信的雙方既是發送方也是接收方,但為了討論方便,這里僅說明其中一方發送,另一方接收的情況
4.1.1 無差錯情況
4.1.2 出現差錯
在接收方 B 會出現兩種情況:
M1 在傳輸過程中丟失了,這時 B 當然什么都不知道,也什么都不做,但A都必須重發分組,直到B正確接收為止,這樣才能實現可靠通信,但是此時又出現了如下問題
問題1:A如何知道 B 是否正確收到了 M1 呢?
解決辦法:超時重傳
問題2:若分組正確到達B,但B回送的確認丟失或延遲了,A未收到B的確認,會超時重發。B 可能會收到重復的 M1 。B如何知道收到了重復的分組,需要丟棄呢?
解決辦法:編號
問題3:若B正確收到了A的報文,并發送了確認報文給A,但是這個確認報文丟失了怎么辦?
解決辦法:超時重傳
問題4:若B正確收到了A的報文,并發送了確認報文給A,但是這個確認報文遲到了怎么辦?
解決方法:丟棄
注意:
4.2 自動重傳請求ARQ
- 通常 A 最終總是可以收到對所有發出的分組的確認。如果 A 不斷重傳分組但總是收不到確認,就說明通信線路太差,不能進行通信
- 使用上述的確認和重傳機制,我們就可以在不可靠的傳輸網絡上實現可靠的通信
- 像上述的這種可靠傳輸協議常稱為自動重傳請求 ARQ (Automatic Repeat reQuest)。意思是重傳的請求是自動進行的,接收方不需要請求發送方重傳某個出錯的分組
4.3 連續 ARQ 協議
通過上述描述,我們發現若是每次發送一個數據報,然后等待確認,這樣信道利用率是非常低的,如下圖所示:
為了提高信道利用率,采用了流水線工作方式,即批量發送數據,然后逐個等待確認,注意每次發送數據的量是有限制的,如下圖所示:
4.3.1 基本思想
- 發送方一次可以發出多個分組,使用滑動窗口協議控制發送方和接收方所能發送和接收的分組的數量和編號
滑動窗口:
- 位于滑動窗口內的分組才能夠發送
- 位于滑動窗口內的分組才能確認接收
- 每收到一個確認,發送方就把發送窗口向前滑動
向前滑動:
- 接收方一般采用累積確認的方式
累積確認:
- 即不必對收到的分組逐個發送確認,而是對按序到達的最后一個分組發送確認,這樣就表示:到這個分組為止的所有分組都已正確收到了
- 采用回退N(Go-Back-N)方法進行重傳
回退N:
- 如果發送方發送了前 5 個分組,而中間的第 3 個分組丟失了。這時接收方只能對前兩個分組發出確認。發送方無法知道后面三個分組的下落,而只好把后面的三個分組都再重傳一次
- 這就叫做 Go-back-N(回退 N),表示需要再退回來重傳已發送過的 N 個分組
5 TCP的流量控制
- 一般說來,我們總是希望數據傳輸得更快一些。但如果發送方把數據發送得過快,接收方就可能來不及接收,這就會造成數據的丟失
- 流量控制 (flow control) 就是讓發送方的發送速率不要太快,既要讓接收方來得及接收,也不要使網絡發生擁塞
- 利用滑動窗口機制可以很方便地在 TCP 連接上實現流量控制
6 TCP的擁塞控制
- TCP的擁塞控制詳細內容請參考我的這篇文章:計算機網絡-TCP擁塞控制
7 TCP的運輸連接管理
- TCP的運輸連接管理詳細內容請參考我的這篇文章:計算機網絡-TCP運輸連接管理
8 TCP報文段的首部格式
- 源端口和目的端口字段——各占 2 字節。端口是運輸層與應用層的服務接口。運輸層的復用和分用功能都要通過端口才能實現
- 序號字段——占 4 字節。TCP 連接中傳送的數據流中的每一個字節都編上一個序號。序號字段的值則指的是本報文段所發送的數據的第一個字節的序號
序號字段:
- 現有3000個字節的數據。假設報文段的最大數據長度為1000個字節,初始序號為1001
- 報文段 1 序號 = 1001 (數據字節序號:1001 ~ 2000)
- 報文段 2 序號 = 2001 (數據字節序號:2001 ~ 3000)
- 報文段 3 序號 = 3001 (數據字節序號:3001 ~ 4000)
- 確認號字段——占 4 字節,是期望收到對方的下一個報文段的數據的第一個字節的序號
- 數據偏移(即首部長度)——占 4 位,它指出 TCP 報文段的數據起始處距離 TCP 報文段的起始處有多遠。“數據偏移”的單位是 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 (FINish) —— 用來釋放一個連接。FIN=1 表明此報文段的發送端的數據已發送完畢,并要求釋放運輸連接
- 窗口字段 —— 占 2 字節,用來讓對方設置發送窗口的依據,單位為字節
- 檢驗和 —— 占 2 字節。檢驗和字段檢驗的范圍包括首部和數據這兩部分。在計算檢驗和時,要在 TCP 報文段的前面加上 12 字節的偽首部
- 緊急指針字段 —— 占 16 位,指出在本報文段中緊急數據共有多少個字節(緊急數據放在本報文段數據的最前面)
- 選項字段 —— 長度可變。TCP 最初只規定了一種選項,即最大報文段長度 MSS。MSS 告訴對方 TCP:“我的緩存所能接收的報文段的數據字段的最大長度是 MSS 個字節。”
- 填充字段 —— 這是為了使整個首部長度是 4 字節的整數倍
總結
以上是生活随笔為你收集整理的计算机网络-TCP协议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络-UDP协议
- 下一篇: 计算机网络-TCP拥塞控制