天天看點

IP協定不可靠無連接配接 為什麼不把它設計為可靠的?

網際網路使用的ip協定是無連接配接的,是以其傳輸是不可靠的。這樣容易使人們感到網際網路很不可靠,那為什麼當初不直接把它設計為可靠的?

先打一個比方。郵局寄送的平信很像無連接配接的ip資料報。每封平信可能走不同的傳送路徑,同時平信也不保證不丢失。當我們發現收信人沒有收到寄出的平信時,去找郵局索賠是沒有用的。郵局會說:“平信不保證不丢失。怕丢失就請你寄挂号信”。但是大家并不會将所有的信件都用挂号方式郵寄,這是因為郵局從來不會随意地将平信丢棄,而丢失平信的機率并不大,況且寄挂号信要多花些錢,還要去郵局排隊,太麻煩。總之,盡管寄平信有可能會丢失,但絕大多數的信件還是平信,因為寄平信友善、便宜。

我們知道,傳統的電信網的最主要的用途是進行電話通信。普通的電話機很簡單,沒有什麼智能,是以電信公司就不得不把電信網設計得非常好,這種電信網可以保證使用者通話時的通信品質。這點對使用非常簡單的電話機的使用者則是非常友善的。但電信公司為了建設能夠確定傳輸品質的電信網則付出了巨大的代價(使用昂貴的程控交換機和網管系統)。

資料的傳送顯然必須是非常可靠的。當初美國國防部在設計 arpanet 時有一個很重要的讨論内容就是:“誰應當負責資料傳輸的可靠性?”這時出現了兩種對立的意見。一種意見是主張應當像電信網那樣,由通信網絡負責資料傳輸的可靠性(因為電信網的發展曆史及其技術水準已經證明了人們可以将網絡設計得相當可靠)。但另一種意見則堅決主張由使用者的主機負責資料傳輸的可靠性。這裡最重要的理由是:這樣可以使計算機網絡便宜、靈活,同時還可以滿足軍事上的各種特殊的需求。

下面用一個簡單例子來說明這一問題。

設主機 a 通過網際網路向主機 b 傳送檔案(如下圖所示)。怎樣才能實作檔案資料的可靠傳輸呢?

IP協定不可靠無連接配接 為什麼不把它設計為可靠的?

如按照電信網的思路,就是設法(這需要花費相當多的錢)将不可靠的網際網路做成為可靠的網際網路。

但設計計算機網絡的人采用另外一種思路,即設法實作端到端的可靠傳輸。

提出這種思路的人認為,計算機網絡和電信網的一個重大差別就是終端裝置的性能差别很大。電信網的終端是非常簡單的、沒有什麼智能的電話機。是以電信網的不可靠必然會嚴重地影響人們利用電話的通信。但計算機網絡的終端是有很多智能的主機。這樣就使得計算機網絡和電信網有兩個重要差別。第一,即使傳送資料的網際網路有一些缺陷(如造成比特差錯或分組丢失),但具有很多智能的終端主機仍然有辦法實作可靠的資料傳輸(例如,能夠及時發現差錯并通知發送方重傳剛才出錯的資料)。第二,即使網絡可以實作 100% 地無差錯傳輸,端到端的資料傳輸仍然有可能出現差錯。

為了說明這點,我們可以用一個簡單例子來說明這個問題。這就是主機 a 向主機 b 傳送一個檔案的情況。

檔案是通過一個檔案系統存儲在主機 a 的硬碟中。主機 b 也有一個檔案系統,用來接收和存儲從 a 發送過來的檔案。應用層使用的應用程式現在就是檔案傳送程式,這個程式一部分在主機 a 運作,另一部分在主機 b 運作。

現在讨論檔案傳送的大緻步驟:

(1)主機 a 的檔案傳送程式調用檔案系統将檔案從硬碟中讀出。然後檔案系統将檔案傳遞給檔案傳送程式。

(2)主機 a 請求資料通信系統将檔案傳送到主機 b。這裡包括使用一些通信協定和将資料檔案劃分為适當大小的分組。

(3)通信網絡将這些資料分組逐個傳送給主機 b。

(4)在主機 b,資料通信協定将收到的資料傳遞給檔案傳送應用程式在主機 b 運作的那一部分。

(5)在主機 b,檔案傳送程式請求主機 b 的檔案系統将收到的資料寫到主機 b 的硬碟中。

在以上的幾個步驟中,都存在使資料受到損傷的一些因素。例如:

(1)雖然檔案原來是正确寫在主機 a 的硬碟上,但在讀出後就可能出現差錯(如在磁盤存儲系統中的硬體出現了故障)。

(2)檔案系統、檔案傳送程式或資料通信系統的軟體在對檔案中的資料進行緩存或複制的過程中都有可能出現故障。

(3)主機 a 或 b 的硬體處理機或存儲器在主機 a 或 b 進行資料緩存或複制的過程中也有可能出現故障。

(4)通信系統在傳輸資料分組時有可能産生檢測不出來的比特差錯或甚至丢失某些分組。

(5)主機 a 或 b 都有可能在進行資料處理的過程中突然崩潰。

由此可看出,即使對于這樣一個簡單的檔案傳送任務,僅僅使通信網絡非常可靠并不能保證檔案從主機 a 硬碟到主機 b 硬碟的傳送是可靠的。也就是說,花費很多的錢将通信網絡做成為非常可靠的,對傳送計算機資料來說是得不償失的。既然現在的終端裝置有智能,就應當把網絡設計得簡單些,而讓具有智能的終端來完成“使傳輸變得可靠”的任務。

于是,計算機網絡的設計者采用了一種政策,這就是“端到端的可靠傳輸”。更具體些,就是在運輸層使用面向連接配接的 tcp 協定,它可保證端到端的可靠傳輸。隻要主機 b 的 tcp 發現了資料的傳輸有差錯,就告訴主機 a 将出現差錯的那部分資料重傳,直到這部分資料正确傳送到主機 b 為止。而 tcp 發現不了資料有差錯的機率是很小的。采用這樣的建網政策,既可以使網絡部分價格便宜和靈活可靠,又能夠保證端到端的可靠傳輸。

這樣,我們可以這樣想像,将網際網路的範圍稍微擴大一些,即擴大到主機中的運輸層。由于運輸層使用了 tcp 協定,使得端到端的資料傳輸成為可靠的,是以這樣擴大了範圍的網際網路就成為可靠的網絡。

是以,說“網際網路提供的資料傳輸是不可靠的”或“網際網路提供的資料傳輸是可靠的”這兩種說法都可以在文獻中找到,問題是是怎樣界定網際網路的範圍。如果說網際網路提供的資料傳輸是不可靠的,那麼這裡的網際網路指的是不包括主機在内的網絡(僅有下三層)。說網際網路提供的資料傳輸是可靠的,就表明網際網路的範圍已經擴大到主機的運輸層。

再回到通過郵局寄平信的例子。當我們寄出一封平信後,可以等待收信人的确認(通過他的回信)。如果隔了一些日子還沒有收到回信,我們可以将該信件再寄一次。這就是将“端到端的可靠傳輸”的原理用于寄信的例子。

繼續閱讀