?????????? 理解面向連接和無連接協議之間的區別
???????? 網絡編程中最基本的概念就是面向連接(connection-oriented)和無連接(connectionless)協議。
???????? 面向連接和無連接指的都是協議。也就是說,這些術語指的并不是無理介質本身,而是用來說明如何在物理介質上傳輸數據。面向連接和無連接協議可以,而且通常也確實會共享一條物理介質。
???????? 它們的本質區別在于,對無連接協議來說,每個分組的處理信息都獨立于所有其他分組,而對面向連接的協議來說,協議實現則維護了與后繼分組有關的狀態信息。
???????? 無連接協議中的分組被稱為數據報(datagram),每個分組都是獨立尋址。
???????? 面向連接的協議則維護了分組之間的狀態,使用這種協議的應用程序通常都會進行長時間的對話。記住這些狀態,協議就可以提供可靠的傳輸。
???????? 典型的面向連接協議有三個階段。第一階段,在對等實體間建立連接。接下來是數據傳輸階段,在這個階段中,數據在對等實體間傳輸。最后,當對等實體完成數據傳輸時,連接被拆除。
???????? 連接為我們維護的狀態中包含了這些地址。我們只要發送數據就行了,不需要考慮尋址或其他與協議相關的數據。
??????????????????
???????? 使用無連接協議可以很方便地支持一對多和多對一通信,而面向連接協議通常都需要多個獨立的連接才能做到。但更重要的是,無連接協議 是構建面向連接協議 的基礎。
?
???????? TCP和UDP都是建立在IP之上的。因此,IP是構建整個TCP/IP協議族的基礎。但IP提供的是一種盡力而為的、不可靠的無連接服務。它接收來自其上層的分組,將它們封裝在一個IP分組中,根據路由為分組選擇正確的硬件接口,從這個接口將分組發送出去。一旦將分組發送出去了,IP就不在關心這個分組了。
???????? IP可以運行在任何能夠承載分組的網絡上。
?
???????? TCP的分組被稱為段(segment), 是放在IP數據報中發送的,因此,根本無法假定這些分組會抵達目的地,更不用說保證分組無損壞且已原來的順序到達了。為了提供可靠性,TCP向基本的IP服務添加了三項功能。首先,它為TCP段中的數據提供了校驗和。這樣有助于確保抵達目的地的數據在傳輸過程中不會被網絡損壞。第二,它為每個字節分配了一個序列號,這樣,如果數據抵達目的地時真的錯序了,接受端也能夠按照恰當的順序將其重裝起來。第三,TPC提供了一種確認-重傳機制,以確保最終每個端都會被傳送出去。
?
???????? TCP連接的每一端都維護了一個接受窗口(receive window),接受窗口就是可以從對等實體接受的數據序列號范圍。除了接受窗口之外,每個TCP還維護了一個發送窗口(send window),發送窗口被劃分為兩部分:已發送還未被確認的字節,以及可以發送但還未發送的字節。
?
???????? RTO(Retransmission Timeout) 超時重傳。
?
???????? UDP只向底層IP協議中添加了兩項功能。首先,它提供了一個可選的校驗和來檢測數據的損壞情況。盡管IP也有校驗和,但它只對IP分組首部進行計算。UDP向??? IP添加的第二項特性就是端口的概念。
?
???????? 應用程序可以通過顯式的bind調用來設置這個端口,也可以有操作系統為其選擇。分組到達時,內核會搜索器套接字列表,查找一個與分組中的協議、地址、和端口號相匹配的套接字。如果找到了匹配的套接字,就由指定的協議來處理數據,并將這些數據提供給所有打開了匹配套接字的應用程序。