傳輸層
可靠資料傳輸(reliable data transfer)
想像你透過一條雜訊很重、字詞有時消失或變得亂七八糟的電話線,唸一張長長的購物清單給朋友聽。你要怎麼保證他在這條壞線上仍能完整、正確、依序地收到整張清單?你會替每個項目編號,請他覆誦聽到的內容,並把他漏掉或聽錯的地方重唸。可靠資料傳輸正是這套紀律,目的是讓應用程式看到一條完美的通道,即使底下的網路會丟失、損毀、亂序、重複資料。
它由一小組相互合作的工具構成。檢查碼偵測損毀的資料,讓壞的副本被丟掉。序號讓接收端能把資料排回正確次序,並發現重複或缺口。確認讓接收端告訴寄件者哪些東西到了。重送計時器在預期的確認沒能及時回來時觸發,促使寄件者重送。而與其送一份就等一份的確認(很慢),滑動視窗讓好幾份能同時在外(管線化),以求高得多的吞吐量,並用後退 N 或選擇性重送等方案來決定該重送什麼。
為什麼重要:這是網路最深刻的觀念之一——只用端對端的檢查與重送,在一個不提供任何保證的媒介之上,建立起保證。TCP 是網際網路在這方面的旗艦實作。這個原則是通用的:任何在會丟失的連結上跑的可靠協定,都會重新發明這同一組零件。一個誠實的提醒:可靠性要付出延遲的代價。為了依序傳遞,接收端必須把「在某個遺失片段之後才到達的資料」先扣住,直到缺口被填滿——這正是行頭阻塞背後的機制。
寄件者送出區段 1、2、3、4。區段 2 遺失了。接收端看到 1 然後 3 然後 4,於是把 3 和 4 對應用程式扣住,並持續只確認到 1 為止。寄件者針對 2 的計時器逾時,重送 2,唯有此時 2、3、4 才能依序被傳遞。
編號、確認、計時器與視窗,把會丟失的連結變得可靠。
可靠性不是免費的。依序傳遞迫使接收端緩衝並等待缺口填滿,增加延遲。正是這種取捨,讓對延遲敏感的應用程式有時改選 UDP、寧可接受一些丟失。
又称
另见