【T01】理解面向連線和無連線協議之間的區別

Andy Niu發表於2017-02-11
1、面向連線和無連線指的是協議,本質區別在於:對於無連線協議來說,每個分組的處理都獨立於其他的分組。
    而對於面向連線的協議,協議實現維護了當前分組與後繼分組有關的狀態資訊。
2、無連線就是指udp,分組稱為資料包(datagram),每個分組都獨立定址,udp會盡最大努力傳送資料包,
    但是不保證資料包不丟失,不延遲,不錯序。
    注意:對於udp,可以在應用層維護資料包的狀態。
3、面向連線就是tcp,tcp的分組稱為段(segment),協議維護了分組之間的狀態,記住這些狀態,協議可以提供可靠的傳輸。
4、一個標準的類比就是:udp就像寄明信片,tcp就像打電話。
5、udp有這麼多缺點,為什麼還要使用這種協議呢?
    a、面向連線只支援一對一通訊,無連線很方便地支援一對多和多對一的通訊,面向連線需要多個獨立的連線才能實現。
    b、更重要的是,無連線是面向連線的基礎,udp和tcp在ip協議之上,ip協議只轉發分組,不對底層做任何假設,
        ip就是不可靠的無連線服務。
6、tcp是怎麼提供可靠的傳輸?
    tcp在ip協議上增加了3項功能:
    a、為tcp段中的資料提供校驗和,在接收端檢查資料是否損壞
    b、tcp為每個位元組提供序列號,即使在接收端錯序了,可以根據恰當的順序重灌起來
        注意:tcp並沒有為每一個位元組附加一個序列號,而是在tcp傳送的段中為第一個位元組標識了序號,
        這樣就隱含了段中其它位元組的序列號
    c、tcp提供了確認重傳機制
7、確認重傳機制是如何工作的?
    tcp是全雙工的,每一端既是接收端又是傳送端。
8、站在接收端的角度,接收端維護了接收視窗,左邊界是期望接收的下一個位元組的序號,右邊界表示接收緩衝區的能容納的最大位元組序號。
    接收端通過告訴傳送端自己的接收視窗,可以用於流量控制,防止緩衝區溢位。
    對於接收的資料(一組位元組,會覆蓋接收視窗的一個區間),如果在左邊界之前,說明是已收到的資料,丟棄。
    如果在右邊界之後,說明是沒有對應的緩衝區儲存,丟棄。
    如果不是所期望的下一個位元組,說明是錯序的,需要等待前面缺少的資料到達。
    如果是所期望的下一個位元組,通知應用程式有資料可讀。這時候所期望接收的位元組序號加上段中的位元組個數,進行更新,
    視窗向右滑動。同時向傳送端傳送ack,告知所期望接收的下一個位元組序號。
9、站在傳送端的角度,傳送端維護髮送視窗,視窗劃分成兩部分,已傳送但還未被確認的位元組,可以傳送但還未傳送的位元組。
    對於已傳送但還未被確認的位元組,會啟動RTO(Retransmission TimeOut 超時重傳)定時器,超時認為丟失了,重新傳送。
    注意:RTO超時並不意味著原來的資料沒有到達目的地,有可能是ack丟失了,也有可能是網路延遲,導致收到ack的時候已經超時。
    重傳不會導致什麼問題,因為接收端會丟棄重新收到的資料。
10、udp在ip協議上增加了2項功能,分別如下:
    a、提供了可選的校驗和用來檢測資料是否損壞。ip也有校驗和,但是ip的校驗和只是對ip分組的首部進行計算,
        而udp和tcp提供的校驗和用於保護他們自己的首部和資料。
    b、udp增加了埠的概念(當然tcp也是),ip地址對應主機,埠對應主機上的程式。

相關文章