【Linux網絡編程】因特網的IP協議是不可靠無連接的,那爲什麼當初不直接把它設計爲可靠的?

因特網使用的IP協議是無連接的,因此其傳輸是不可靠的。這樣容易使人們感到因特網很不可靠,那爲什麼當初不直接把它設計爲可靠的?

先打一個比方。郵局寄送的平信很像無連接的IP數據報。每封平信可能走不同的傳送路徑,同時平信也不保證不丟失。當我們發現收信人沒有收到寄出的平信時,去找郵局索賠是沒有用的。郵局會說:“平信不保證不丟失。怕丟失就請你寄掛號信”。但是大家並不會將所有的信件都用掛號方式郵寄,這是因爲郵局從來不會隨意地將平信丟棄,而丟失平信的概率並不大,況且寄掛號信要多花些錢,還要去郵局排隊,太麻煩。總之,儘管寄平信有可能會丟失,但絕大多數的信件還是平信,因爲寄平信方便、便宜。

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

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

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

設主機 A 通過因特網向主機 B 傳送文件(如下圖所示)。怎樣才能實現文件數據的可靠傳輸呢?

【Linux網絡編程】因特網的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 協議,使得端到端的數據傳輸成爲可靠的,因此這樣擴大了範圍的因特網就成爲可靠的網絡。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章