IP協(xié)議不可靠無連接 為什么不把它設計為可靠的?
因特網(wǎng)使用的IP協(xié)議是無連接的,因此其傳輸是不可靠的。這樣容易使人們感到因特網(wǎng)很不可靠,那為什么當初不直接把它設計為可靠的?
先打一個比方。郵局寄送的平信很像無連接的IP數(shù)據(jù)報。每封平信可能走不同的傳送路徑,同時平信也不保證不丟失。當我們發(fā)現(xiàn)收信人沒有收到寄出的平信時,去找郵局索賠是沒有用的。郵局會說:“平信不保證不丟失。怕丟失就請你寄掛號信”。但是大家并不會將所有的信件都用掛號方式郵寄,這是因為郵局從來不會隨意地將平信丟棄,而丟失平信的概率并不大,況且寄掛號信要多花些錢,還要去郵局排隊,太麻煩??傊?,盡管寄平信有可能會丟失,但絕大多數(shù)的信件還是平信,因為寄平信方便、便宜。
我們知道,傳統(tǒng)的電信網(wǎng)的最主要的用途是進行電話通信。普通的電話機很簡單,沒有什么智能,因此電信公司就不得不把電信網(wǎng)設計得非常好,這種電信網(wǎng)可以保證用戶通話時的通信質(zhì)量。這點對使用非常簡單的電話機的用戶則是非常方便的。但電信公司為了建設能夠確保傳輸質(zhì)量的電信網(wǎng)則付出了巨大的代價(使用昂貴的程控交換機和網(wǎng)管系統(tǒng))。
數(shù)據(jù)的傳送顯然必須是非??煽康摹.敵趺绹鴩啦吭谠O計 ARPANET 時有一個很重要的討論內(nèi)容就是:“誰應當負責數(shù)據(jù)傳輸?shù)目煽啃?”這時出現(xiàn)了兩種對立的意見。一種意見是主張應當像電信網(wǎng)那樣,由通信網(wǎng)絡負責數(shù)據(jù)傳輸?shù)目煽啃?因為電信網(wǎng)的發(fā)展歷史及其技術水平已經(jīng)證明了人們可以將網(wǎng)絡設計得相當可靠)。但另一種意見則堅決主張由用戶的主機負責數(shù)據(jù)傳輸?shù)目煽啃?。這里最重要的理由是:這樣可以使計算機網(wǎng)絡便宜、靈活,同時還可以滿足軍事上的各種特殊的需求。
下面用一個簡單例子來說明這一問題。
設主機 A 通過因特網(wǎng)向主機 B 傳送文件(如下圖所示)。怎樣才能實現(xiàn)文件數(shù)據(jù)的可靠傳輸呢?
如按照電信網(wǎng)的思路,就是設法(這需要花費相當多的錢)將不可靠的因特網(wǎng)做成為可靠的因特網(wǎng)。
但設計計算機網(wǎng)絡的人采用另外一種思路,即設法實現(xiàn)端到端的可靠傳輸。
提出這種思路的人認為,計算機網(wǎng)絡和電信網(wǎng)的一個重大區(qū)別就是終端設備的性能差別很大。電信網(wǎng)的終端是非常簡單的、沒有什么智能的電話機。因此電信網(wǎng)的不可靠必然會嚴重地影響人們利用電話的通信。但計算機網(wǎng)絡的終端是有很多智能的主機。這樣就使得計算機網(wǎng)絡和電信網(wǎng)有兩個重要區(qū)別。***,即使傳送數(shù)據(jù)的因特網(wǎng)有一些缺陷(如造成比特差錯或分組丟失),但具有很多智能的終端主機仍然有辦法實現(xiàn)可靠的數(shù)據(jù)傳輸(例如,能夠及時發(fā)現(xiàn)差錯并通知發(fā)送方重傳剛才出錯的數(shù)據(jù))。第二,即使網(wǎng)絡可以實現(xiàn) 100% 地無差錯傳輸,端到端的數(shù)據(jù)傳輸仍然有可能出現(xiàn)差錯。
為了說明這點,我們可以用一個簡單例子來說明這個問題。這就是主機 A 向主機 B 傳送一個文件的情況。
文件是通過一個文件系統(tǒng)存儲在主機 A 的硬盤中。主機 B 也有一個文件系統(tǒng),用來接收和存儲從 A 發(fā)送過來的文件。應用層使用的應用程序現(xiàn)在就是文件傳送程序,這個程序一部分在主機 A 運行,另一部分在主機 B 運行。
現(xiàn)在討論文件傳送的大致步驟:
(1)主機 A 的文件傳送程序調(diào)用文件系統(tǒng)將文件從硬盤中讀出。然后文件系統(tǒng)將文件傳遞給文件傳送程序。
(2)主機 A 請求數(shù)據(jù)通信系統(tǒng)將文件傳送到主機 B。這里包括使用一些通信協(xié)議和將數(shù)據(jù)文件劃分為適當大小的分組。
(3)通信網(wǎng)絡將這些數(shù)據(jù)分組逐個傳送給主機 B。
(4)在主機 B,數(shù)據(jù)通信協(xié)議將收到的數(shù)據(jù)傳遞給文件傳送應用程序在主機 B 運行的那一部分。
(5)在主機 B,文件傳送程序請求主機 B 的文件系統(tǒng)將收到的數(shù)據(jù)寫到主機 B 的硬盤中。
在以上的幾個步驟中,都存在使數(shù)據(jù)受到損傷的一些因素。例如:
(1)雖然文件原來是正確寫在主機 A 的硬盤上,但在讀出后就可能出現(xiàn)差錯(如在磁盤存儲系統(tǒng)中的硬件出現(xiàn)了故障)。
(2)文件系統(tǒng)、文件傳送程序或數(shù)據(jù)通信系統(tǒng)的軟件在對文件中的數(shù)據(jù)進行緩存或復制的過程中都有可能出現(xiàn)故障。
(3)主機 A 或 B 的硬件處理機或存儲器在主機 A 或 B 進行數(shù)據(jù)緩存或復制的過程中也有可能出現(xiàn)故障。
(4)通信系統(tǒng)在傳輸數(shù)據(jù)分組時有可能產(chǎn)生檢測不出來的比特差錯或甚至丟失某些分組。
(5)主機 A 或 B 都有可能在進行數(shù)據(jù)處理的過程中突然崩潰。
由此可看出,即使對于這樣一個簡單的文件傳送任務,僅僅使通信網(wǎng)絡非??煽坎⒉荒鼙WC文件從主機 A 硬盤到主機 B 硬盤的傳送是可靠的。也就是說,花費很多的錢將通信網(wǎng)絡做成為非常可靠的,對傳送計算機數(shù)據(jù)來說是得不償失的。既然現(xiàn)在的終端設備有智能,就應當把網(wǎng)絡設計得簡單些,而讓具有智能的終端來完成“使傳輸變得可靠”的任務。
于是,計算機網(wǎng)絡的設計者采用了一種策略,這就是“端到端的可靠傳輸”。更具體些,就是在運輸層使用面向連接的 TCP 協(xié)議,它可保證端到端的可靠傳輸。只要主機 B 的 TCP 發(fā)現(xiàn)了數(shù)據(jù)的傳輸有差錯,就告訴主機 A 將出現(xiàn)差錯的那部分數(shù)據(jù)重傳,直到這部分數(shù)據(jù)正確傳送到主機 B 為止。而 TCP 發(fā)現(xiàn)不了數(shù)據(jù)有差錯的概率是很小的。采用這樣的建網(wǎng)策略,既可以使網(wǎng)絡部分價格便宜和靈活可靠,又能夠保證端到端的可靠傳輸。
這樣,我們可以這樣想像,將因特網(wǎng)的范圍稍微擴大一些,即擴大到主機中的運輸層。由于運輸層使用了 TCP 協(xié)議,使得端到端的數(shù)據(jù)傳輸成為可靠的,因此這樣擴大了范圍的因特網(wǎng)就成為可靠的網(wǎng)絡。
因此,說“因特網(wǎng)提供的數(shù)據(jù)傳輸是不可靠的”或“因特網(wǎng)提供的數(shù)據(jù)傳輸是可靠的”這兩種說法都可以在文獻中找到,問題是是怎樣界定因特網(wǎng)的范圍。如果說因特網(wǎng)提供的數(shù)據(jù)傳輸是不可靠的,那么這里的因特網(wǎng)指的是不包括主機在內(nèi)的網(wǎng)絡(僅有下三層)。說因特網(wǎng)提供的數(shù)據(jù)傳輸是可靠的,就表明因特網(wǎng)的范圍已經(jīng)擴大到主機的運輸層。
再回到通過郵局寄平信的例子。當我們寄出一封平信后,可以等待收信人的確認(通過他的回信)。如果隔了一些日子還沒有收到回信,我們可以將該信件再寄一次。這就是將“端到端的可靠傳輸”的原理用于寄信的例子。