天天看點

TCP協定基本概念

  1. TCP協定最主要的特點
    1. TCP是面向連接配接的運輸層協定。這就是說,應用程式在使用TCP協定之前,必須要建立TCP連接配接,且在傳輸完畢後,還要斷開連接配接。
    2. 每一條TCP連接配接隻能有兩個端點,每一條TCP連接配接隻能是點對點(一對一),并且按序到達。
    3. TCP提供全雙工通信。TCP允許通信雙方的應用程序可以在任何時候都能發送時資料。TCP連接配接的兩端都設有發送緩存和接收緩存,用來臨時存放雙向通信的資料。在發送的時候,應用程序把資料傳送給TCP緩存後,就可以做自己的事情,而TCP會在合适的時候把資料發送出去。在接受時,TCP把接受到的資料放入緩存,上層的應用程序會在合适的時候讀取緩存中的資料。
    4. 面向位元組流,TCP中的”流“指的是流入到程序或者從程序流出的位元組序列。”面向位元組流“的含義是:雖然應用程序和TCP互動是一次一個資料塊(大小不等),但TCP把應用程式交下來的資料僅僅看成一連串的”無結構的位元組流“。TCP并不知道所傳送的位元組流的含義。
    5. 如圖TCP連接配接是一條虛連接配接:并不是真正的實體連接配接。TCP封包段先要傳送到IP層,加上IP首部,再傳送到資料鍊路層。再加上資料鍊路層的首部和尾部,才離開主機發送到物聯鍊路。
      TCP協定基本概念
  2. TCP的連接配接

    ​ TCP把連接配接作為最基本的抽象,TCP許多的特性都與TCP面向連接配接相關。每一條TCP連接配接有兩個端點,TCP連接配接的端點,不是主機,不是主機IP,不是應用程序,也不是運輸層的協定端口,而是叫做套接字(socket)或者插口,根據RFC793規定:端口号拼接到IP位址即構成了套接字==》套接字socket=(IP位址:port端口号)。

    每一條TCP連接配接唯一位址通信的兩端(及兩個套接字所規定):

    TCP連接配接::={socket1,socket2}={(IP1:Port1),(IP2:Port2)}
  3. 可靠傳輸的工作原理

    ​ 我們知道,TCP發送封包的時候是交給IP層,但是IP層隻能提供盡最大努力服務,也就是說,TCP下面的網絡層提供的是不可靠傳輸,是以TCP就必須采取适當的措施要使得兩個運輸層之間通信變得可靠。

    理想的傳輸條件有以下兩個特點:

    1. 傳輸信道不産生差錯。
       	2. 不管發送方以多塊的資料發送資料,接受方總能及時的來處理這些資料。
               
    然而實際的網絡并不具備以上兩個理想條件,但我們可以采用一些可靠傳輸協定,當出現差錯的時候讓發送方重傳發送錯誤的資料,同時在接收方來不及處理的時候及時報告發送方适當降低發送資料的速度。這樣一i來,本來不可靠的傳輸信道就能夠實作可靠傳輸了。下面從最簡單的停止等待協定說起。
  4. 停止等待下協定
    全雙工通信的雙方既是發送方也是接收方,下面是我們僅考慮A發送資料而B接收資料并發送确認。是以A叫做發送方,B叫做接收方。
    1. 無差錯情況
    TCP協定基本概念
    1. A發送分組M1,發送完就暫停發送,等待B的确認。B接收到M1就向就向A發送确認。A在接收到對M1确認的後,就再發送下一個分組M2。一次類推。
    1. 出現差錯
    1. B接收到M1時檢測到了差錯,就丢棄M1,其他什麼也不做(并不會通知A收到有差錯的分組)。也可能是M1在傳輸的過程中丢失了,這時候B當然什麼也不知道。在這兩種情況下,B都不會發送任何資訊。可靠傳輸協定是這樣設計的:A隻要超過了一段時間仍然沒有接收到确認,就認為剛才發送的分組丢失了,因而重傳錢前面發送過的分。這就叫做‘重傳’。要實作如何重傳,就要在每發完一份分組,就設定一個逾時計時器,如果在規定的時間内收到對方的确認,就撤銷已設定的逾時計時器
    TCP協定基本概念
    其實在圖5-10(a)中,A為每一個已發送的分組都設定了一個逾時計時器,但A在逾時計時器之前都收到了相應的确認,就撤銷該逾時計時器。這裡應該注意三點:
    1. A在發送完一個分組後,還必須要保留一個已經發送分組的副本(在發送重傳的時候使用),隻有在接收到相應的确認後才能清楚暫時保留分分組副本。
    1. 分組和确認分組就必須要進行編号,這樣才能明确是哪一個發送出去的分組收到了确認,而哪一個分組還沒有收到确認。
    1. 逾時計時器設定的重傳時間應該比資料在分組傳輸的平均往返時間要長一些,如圖5-9(b)中的一條虛線辨別如果如果M1正到達B處同時A也正确的收到确認封包的過程,可見重傳時間也應該比平均往返時間更長一些,顯然,如果重傳時間設定特别的長,那麼通信的效率就會很低,但如果重傳的設定的太短,以緻産生不必要的重傳,就浪費了網絡資源。關于重傳時間如何處理和選擇,我們會在後面讨論。
    1. 确認丢失和确認遲到:圖5-10(a)說明的是另一種情況,B發送的對M1分組确認丢失了,A在設定的逾時重傳時間内沒有收到确認,并無法知道是自己發出的分組錯誤,丢失,還是B發送的确認丢失了。是以A在逾時計時器到後期就要重傳M1分組。現在應該注意到B的動作。假如B接收到了重傳的分組M1,這時候應該采取兩個行動:
    1. 丢棄這個重複的分組M1,不向上層傳遞。
    2. 向A發送确認,就算是重傳封包M1,也要發送确認封包。
    通常情況下A最終總是能可以收到所有發出分組确認,如果A不斷重傳分組但總是收不到确認,說明這條通信線路太差了,不能進行通信。
    使用上述的确認和重傳機制,我們就可以在不可靠的傳輸網絡上實作可靠的通信。
    像上述的這種可靠傳輸協定稱之為自動重傳請求ARQ(Automatic Respeat ReQuest),意思是重傳的請求是自動進行的,接收方不需要請求發送方重傳某個出錯的分組。
  5. 信道使用率
    停止等待的協定優點是簡單,但缺點是信道使用率太低了,我麼可以用圖5-11來說明這個問題
    TCP協定基本概念

    假定A發送分組需要的時間是TD。顯然,TD等于分組長度除以資料率。再假定分組确認到達B後,B處理分組的時間可以忽略不計,同時立即發送一個确認。假定B發送一個确認分組需要時間為TA,如果A确認處理分組的時間也忽略不計,那麼A在經過時間(TD+RTT+TA)後就可以在發送下一個分組,RTT是往返時間,是以信道的使用率U=TD/(TD+RTT+TA).

    舉個例子,假定1200km 的信道往返時間為RTT=20ms。分組長度為1200bit,發送速率為1M/S,則可以計算出信道使用率U=5.66%,若把發送速率提高到10B/S,則U=5.96X10^-4,信道在大多數時間都是空閑的。

    是以,為了提高傳輸效率,發送方可以不使用低效率的停止等待協定,而是采用流水線傳輸,(如圖5-12)

    TCP協定基本概念

    流水線傳輸就是發送方可以連續發送多個分組,不必沒發完一個分組就停止等待對迪阿敏确認,這樣可以使信道上的一直有資料不間斷的發送,顯然這種傳輸效率可以得到很大的提高。

    當使用流水線傳輸時候,就要介紹下面要使用的連接配接ARQ協定,滑動視窗協定

  6. 連續ARQ協定
    滑動視窗協定比較複雜,是TCP協定的精髓所在,
    TCP協定基本概念

    圖5-13(a)表示發送方維持的發送視窗,它的意義是:位于發送視窗内的5個分組都可以連續發出去,而不需要等待對方确認,這樣,信道的使用率就高了。

    連續ARQ協定規定,發送方每收到一個确認,就把發送視窗向前滑動一個分組的位置。圖5-13(b)表示發送方接收到了對第一個分組的确認,于是把發送視窗向前移動一個分組的位置。

    接收方一般采用的是累計确認的方式。這就是說,接收方不必對接收到的分組逐個發送确認。而是收到幾個分組後,對按照順序到達最後一個分組發送确認,這就表明:到這個分組為止的所有分組都正确的收到了。

TCP封包段的首部格式

TCP雖然是面向位元組流的,但TCP傳送的資料單元卻是封包段。一個TCP封包段分為首部和資料兩部分,而TCP的全部功能都展現在它在首部中各字段的作用。
TCP協定基本概念
TCP封包首部前20位元組是固定的,後面4n位元組是根據需要而增加的選項。(TCP協定首部的最小長度為20位元組)
  1. 源端口和目的端口 (各占2位元組):分别寫入源端口号和目的端口号。
  2. 序号(4位元組):序号的範圍是【0,(232)-1】,共232個序号,在一個TCP連接配接中傳送的位元組流的每一個位元組按照順序編号,這個位元組也叫做封包段序号。
  3. 确認号(4位元組):是期望收到對方的下一個封包段的第一個資料位元組的序号,例如:B正确的接收到了A發送過來的一個封包段,其序列号字段為501,而資料長度是200位元組(序号為501-700),這表明B正确的接收到了A發送的到序号700為止的資料,。是以,B希望收到A下一個資料序号為701的資料,于是A在A發送給A确認号設定為701。總之就是要記住:确認号=N:到序号N-1為止的所有資料都已正常的收到了。
  4. 資料偏移(4位):它指出的TCP封包段的資料部分的其實部分距離TCP封包段的起始位置,其實就是指出了TCP封包段首部的長度,(TCP封包首部最大的長度為60位元組)。
  5. 保留位(6位):保留為今後使用,目前是0。
  6. 下面是6個控制位
  7. 緊急URG(URGent):當URG=1,表示緊急指針字段有效,它告訴系統此封包段中有緊急資料,應該盡快送達,不要按照原來的排隊順序來傳送,發送方TCP就要把這個緊急封包插入到本封包隊列中的首部。
  8. 确認ACK(ACKnowledment)僅當ACK=1時候确認号字段才有效,當ACK=0時候,确認号無效。TCP規定,在連接配接建立後,所有傳送的封包段都必須把ACK設定為1
  9. 推送PSH(PuSH)當兩個應用程序進行互動式的通信的時候,有時在一端的應用程序希望在鍵入一個指令後能夠立即接受到對方的響應。在這種情況下,TCP就可以使用推送操作。當發送方把PDSH設定為1,并立即建立一個封包段發送出去,接收方TCP收到PSH=1的封包的時候,會把這個封包盡快 的交給付給應用程序。而并不是放到緩存中。
  10. 複位RST(ReSet):當RST=1時候,表明TCP連接配接中出現了嚴重的差錯,必須要釋放連接配接,然後重建立立運輸連接配接,RST=1還用來拒絕一個非法的封包段或者拒絕打開一個連結。
  11. 同步SYN(SYNchronization)在建立一個用來同步序号,當SYN=1而ACK=0,表明這是一個連接配接請求封包段,對方若同意建立連接配接,則應該在相應的封包段中使得SYV=1和ACK=1
  12. 終止FIN(FINis)用來釋放一個連接配接,當FIN=1時,表示此封包段的發送方發送的資料已經發送完畢,并要求釋放運輸層連接配接。
  13. 視窗(2位元組):視窗值為【0,(2^16)-1】,視窗指的是發送本封包的一方的接收視窗。視窗值告訴對方:從本封包段的确認号開始,接收方目前隻能接受對方的資料封包發送量。設定這個視窗值的原因是接收方的資料接收緩存是有限的。
  14. 檢驗和(2位元組):檢驗和字段檢驗的範圍包括首部和資料兩部分。和UDP一樣,在計算檢驗和時,要在TCP封包段的前面加上12位元組的僞首部,僞首部的格式和UDP僞首部的格式一樣。但應該要把僞首部的第四個字段值改為6(TCP的協定号為6),第5字段中UDP長度改為TCP長度。
  15. 緊急指針(2位元組):緊急指針僅僅在URG=1的時候才有意義,它指出本封包段的緊急資料的位元組數(緊急資料結束後就是普通資料),視窗期為0也是可以發送緊急資料。
  16. 選項(可變,最長為40位元組)

TCP可靠傳輸的實作

  1. 以位元組為機關的滑動視窗
​ TCP的滑動視窗是以位元組為機關的,現假定A收到了B發來的确認封包段,其中視窗是20位元組,而确認号是31(這表明B期望接收到的下一個序列号為31,而序号30為止的資料已經接收到了),根據這兩個資料,A就構造出了自己的發送視窗。
TCP協定基本概念

​ 我們首先讨論發送發A的發送視窗,發送視窗表示:在沒有收到B确認的情況下,A可以連續的把視窗内的資料都發送出去。凡是已經發送出去的資料,在未收到确認之前都必須暫時保留,以便在重傳時使用。

​ 發送視窗裡面的序号表示允許發送的序号,顯然,視窗越大,發送方就可以在收到對方确認之前發送的資料就越多,是以就可以提高傳輸速率。

​ 發送視窗後延部分表示已經已經發送且收到了确認。這些資料顯然不在需要保留了,發送視窗前沿的部分表示不允許發送,因為接收方還沒有為這部分資料提供緩存空間。

​ 發送視窗的位置由視窗前沿和後延位置共同确認,

  1. TCP緩存和視窗的關系
​ 發送方的應用程序把位元組流寫入了TCP的發送緩存中,接收方的應用程序從TCP的接收緩存中讀取位元組流資料。下面我們就讨論視窗和緩存之間的關系:
TCP協定基本概念
這裡首先明确兩點:
  1. 緩存空間和序号空間都是有限的,并且是循環使用的。
  2. 由于實際的緩存或視窗中的位元組數是非常大的。圖中隻是說明一下情況。
  • 發送緩存用來暫時存放:
  • 發送應用程式傳給發送方TCP準備發送的資料。
  • TCP已發出但尚未收到确認的資料。
  • 發送視窗隻是發送緩存的一部分,已被确認的資料應當從緩存中被删除。是以發送緩存和發送視窗的後延是重合的。發送應用程式最後寫入發送緩存的位元組減去最後被确認的位元組,就是還保留在發送傳中的被寫入的位元組數。發送應用程序必須控制寫入緩存中的速度。不能太快,否則發送緩存就沒有存放資料的空間。
  • 節後緩存暫時用來存放:
  • 按序到達,但尚未被應用程序接讀取的資料。
  • 為按序到達的資料。
  • 如果收到的分組有差錯,則要丢棄 。如果接受應用程序來不及讀取收到的資料,接收緩存中就會被填滿,使得減少到0。反之,如果接受應用程式接收到資料能夠及時從接受緩存中讀取到資料,接收視窗就可以不斷增大,但最大就不能超過接收緩存的大小。圖(b)還指出了下一個期待收到的位元組号,這個位元組号也是接收方給發送方的封包段中的首部确認号。
  • 雖然A的發送視窗是根據B接受視窗的大小而動态設定的,但是在同一時刻,A發送視窗和B的接受視窗并不是一樣大的。這是因為通過網絡傳輸需要經曆一定的時間滞後(延遲),除此之外,發送方還要根據當時的網絡環境要适當的調整自己的發送視窗。
  • 對于不按序到達的資料(位元組流),TCP标準并無明确規定,如果接受方把不按序的資料一律丢掉,那麼接收視窗的管理就會簡單很多,但是這回對網絡資源的利用不利(因為發送方會不斷的傳送較多的資料)。是以TCP通常會把不按序到達的資料先臨時放到存儲視窗中,等到位元組流所缺少的位元組接收到後,再按序傳遞上層的應用程序。
  • TCP要求接收方必須有積累确認的功能,這樣可以減少傳輸開銷,接收方可以在合适的時候發送确認,也可以在自己有資料要發送時把确認資訊捎上。但是這裡注意:
  • 一十接收方不應該過分推遲發送确認,否則這樣容易導緻發送方不必要的重傳,這樣反而浪費了網絡資源。TCP規定,确認推遲的時間不能超過0.5秒,若收到了一連串具有最大長度的封包,則必須每隔一個封包段就發送一個确認【RFC 1122】.
  • 二是捎帶确認實際上并不是經常發生,因為大多數應用很少同時在兩個方向上傳輸資料。
  • 最後強調:TCP通信是全雙工通信。通信中的每一方都在發送和接受封包段,是以,每一方都有自己的發送視窗和接收視窗。在談到這些視窗的時候,一定要厘清楚。