?網(wǎng)絡編程中最基本的概念就是面向連接(connection-oriented)和無連接(connectionless)協(xié)議。盡管本質(zhì)上來說,兩者之間的區(qū)別并不難理解,但對那些剛剛開始進行網(wǎng)絡編程的人來說,卻是個很容易混淆的問題。這個問題與上下文有些關聯(lián):很顯然,如果兩臺計算機要進行通信,就必須以某種形式“連接”起來,那“無連接通信”又是什么意思呢?
??答案是:面向連接和無連接指的都是協(xié)議。也就是說,這些術語指的并不是物理介質(zhì)本身,而是用來說明如何在物理介質(zhì)上傳輸數(shù)據(jù)的。面向連接和無連接協(xié)議可以,而且通常也確實會共享同一條物理介質(zhì)。
??如果兩者的區(qū)別與承載數(shù)據(jù)的物理介質(zhì)無關,又和什么有關呢?它們的本質(zhì)區(qū)別在于,對無連接協(xié)議來說,每個分組的處理都獨立于所有其他分組,而對面向連接的協(xié)議來說,協(xié)議實現(xiàn)則維護了與后繼分組有關的狀態(tài)信息。
一、無連接協(xié)議和面向連接協(xié)議的概念
??無連接協(xié)議中的分組被稱為數(shù)據(jù)報(datagram),每個分組都是獨立尋址,并由應用程序發(fā)送的。從協(xié)議的角度來看,每個數(shù)據(jù)報都是一個獨立的實體,與在兩個相同的對等實體之間傳送的任何其他數(shù)據(jù)報都沒有關系,這就意味著協(xié)議很可能是不可靠的。也就是說,網(wǎng)絡會盡最大努力傳送每一個數(shù)據(jù)報,但并不保證數(shù)據(jù)報不丟失、不延遲或者不錯序傳輸。
??另一方面,面向連接的協(xié)議則維護了分組之間的狀態(tài),使用這種協(xié)議的應用程序通常都會進行長期的對話。記住這些狀態(tài),協(xié)議就可以提供可靠的傳輸。比如,發(fā)送端可以記住哪些數(shù)據(jù)已經(jīng)發(fā)送出去了但還未被確認,以及數(shù)據(jù)是什么時候發(fā)送的。如果在某段時間間隔內(nèi)沒有收到確認,發(fā)送端可以重傳數(shù)據(jù)。接收端可以記住已經(jīng)收到了哪些數(shù)據(jù),并將重復的數(shù)據(jù)丟棄。如果分組不是按序到達的,接收端可以將其保存下來,直到邏輯上先于它的分組到達為止。
??典型的面向連接協(xié)議有三個階段。第一階段,在對等實體間建立連接。接下來是數(shù)據(jù)傳輸階段,在這個階段中,數(shù)據(jù)在對等實體間傳輸。最后,當對等實體完成數(shù)據(jù)傳輸時,連接被拆除。
??一種標準的類比是:使用無連接協(xié)議就像寄信,而使用面向連接的協(xié)議就像打電話。
二、UDP和TCP協(xié)議
??既然無連接協(xié)議有這么多的缺點,大家可能會奇怪,為什么還要使用這種協(xié)議呢?我們會看到,在很多情況下,使用無連接協(xié)議構建應用程序都是有意義的。比如,使用無連接協(xié)議可以很方便地支持一對多和多對一通信,而面向連接協(xié)議通常都需要多個獨立的連接才能做到。但更重要的是,無連接協(xié)議是構建面向連接協(xié)議的基礎。TCP/IP 是基于一個4層的協(xié)議棧,如下圖所示:
??如圖所示,TCP 和 UDP 都是構建在 IP 之上的。因此,IP 是構建整個 TCP/IP 協(xié)議族的基礎。但 IP 提供的是一種盡力而為的、不可靠的無連接服務。它接收來自其上層的分組,將它們封裝在一個 IP 分組中,根據(jù)路由為分組選擇正確的硬件接口,從這個接口將分組發(fā)送出去。一旦將分組發(fā)送出去了,IP 就不再關心這個分組了。和所有無連接協(xié)議一樣,它將分組發(fā)送出去之后就不再記得這個分組了。這種簡單性也是 IP 的主要優(yōu)點。
1、TCP—面向連接服務
它為 TCP 段中的數(shù)據(jù)提供了校驗和。這樣有助于確保抵達目的地的數(shù)據(jù)在傳輸過程中不會被網(wǎng)絡損壞;
它為每字節(jié)分配了一個序列號,這樣,如果數(shù)據(jù)抵達目的地時真的錯序了,接收端也能夠按照恰當?shù)捻樞驅(qū)⑵渲匮b起來。當然,TCP 并沒有為每字節(jié)都附加一個序列號。實際上,每個 TCP 段的首部都包含了段中第一字節(jié)的序列號。這樣,就隱含地知道了段中其他字節(jié)的序列號。
TCP 提供了一種確認-重傳機制,以確保最終每個段都會被傳送出去。
2、UDP—無連接服務
??回到與電話/寄信的類比中來,我們可以把 TCP 連接中的網(wǎng)絡地址當作一個辦公室總機的電話號碼,把端口號當作辦公室中某臺正被呼叫的特定電話的分機號。同理,可以將UDP網(wǎng)絡地址當作一座公寓樓的地址,并把端口號當作公寓樓大廳中的個人郵箱。
面向連接的通信具有數(shù)據(jù)的保序性, 而面向無連接的通信不能保證接收數(shù)據(jù)的順序與發(fā)送數(shù)據(jù)的順序一致。面向連接分為三個階段,第一是建立連接,在此階段,發(fā)出一個建立連接的請求。只有在連接成功建立之后,才能開始數(shù)據(jù)傳輸,這是第二階段。接著,當數(shù)據(jù)傳輸完畢,必須釋放連接。而面向無連接沒有這么多階段,它直接進行數(shù)據(jù)傳輸。
面向連接方法中,在兩個端點之間建立了一條數(shù)據(jù)通信信道(電路)。這條信道提供了一條在網(wǎng)絡上順序發(fā)送報文分組的預定義路徑,這個連接類似于語音電話。發(fā)送方與接收方保持聯(lián)系以協(xié)調(diào)會話和報文分組接收或失敗的信號。但這并不意味著面向連接的信道比無連接的信道使用了更多的帶寬,兩種方法都只在報文分組傳輸時才使用帶寬。
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請
點擊舉報。