Linux网络编程——连接和面向连接的协议之间没有区别
網絡編程中最重要的概念就是連接取向(connection-oriented)和無連接(connectionless)協議。雖然本質。兩者之間的區別是不難理解,編程的人來說,卻是個非常easy混淆的問題。
這個問題與上下文有些關聯:非常顯然。假設兩臺計算機要進行通信,就必須以某種形式“連接”起來。那“無連接通信”又是什么意思呢?
答案是:面向連接和無連接指的都是協議。
也就是說,這些術語指的并非物理介質本身。而是用來說明怎樣在物理介質上數據傳輸的。面向連接和無連接協議能夠,并且通常也確實會共享同一條物理介質。
假設兩者的差別與承載數據的物理介質無關,又和什么有關呢?它們的本質差別在于,對無連接協議來說,每一個分組的處理都獨立于全部其它分組,而對面向連接的協議來說。協議實現則維護了與后繼分組有關的狀態信息。
無連接協議中的分組被稱為數據報(datagram)。每一個分組都是獨立尋址。并由應用程序發送的。從協議的角度來看。每一個數據報都是一個獨立的實體,與在兩個同樣的對等實體之間傳送的不論什么其它數據報都沒有關系,這就意味著協議非常可能是不可靠的。也就是說。網絡會盡最大努力傳送每一個數據報。但并不保證數據報不丟失、不延遲或者不錯序傳輸。
還有一方面,面向連接的協議則維護了分組之間的狀態。使用這樣的協議的應用程序通常都會進行長期的對話。記住這些狀態。協議就能夠提供可靠的傳輸。比方,發送端能夠記住哪些數據已經發送出去了但還未被確認。以及數據是什么時候發送的。
假設在某段時間間隔內沒有收到確認。發送端能夠重傳數據。
接收端能夠記住已經收到了哪些數據。并將反復的數據丟棄。假設分組不是按序到達的,接收端能夠將其保存下來,直到邏輯上先于它的分組到達為止。
典型的面向連接協議有三個階段。第一階段,在對等實體間建立連接。接下來是傳輸數據階段,在這個階段中,數據在對等實體間傳輸。最后,當對等實體完畢傳輸數據時。連接被拆除。
一種標準的類比是:使用無連接協議就像寄信。而使用面向連接的協議就像打電話。
給朋友寄信時,每封信都是一個獨立尋址且自包括的實體。
郵局在處理這些信件時不會考慮到兩個通信者之間的不論什么其它信件。郵局不會維護以往通信者的歷史記錄--也就是說,它不會維護信件之間的狀態。郵局也不保證信件不丟失、不延遲、不錯序。這樣的方式就相應于無連接協議發送數據報的方式。(用明信片進行類比會更合適一些,由于寫錯地址的信件會被退回發信人。而(和典型的無連接協議數據報一樣)明信片則不會。)
如今來看看不是給朋友寄信。而是打電話時會發生些什么事情。
首先。撥朋友的號碼來發起呼叫。朋友應答,會說“嗨”之類的話。然后我們回應:“嗨,Lucy。
我是 Mike。
”我們和朋友聊一會兒,然后互說再見并掛機。這是面向連接協議中發生的典型狀況。在連接建立階段,一端與其對等實體聯系,交換初始問候信息,對會話中要用到的一些參數和選項進行溝通。然后連接進入傳輸數據階段。
在電話交談的過程中。兩端用戶都知道他們在和誰說話,因此不是必需不停地說“這是 Mike 在跟 Lucy 說話”。也不是必需在每次說話之前都撥一次朋友的電話號碼——我們的電話已經連接起來了。同理。在面向連接協議的傳輸數據階段,也不是必需說明我們自己或對等實體的地址。連接為我們維護的狀態中包括了這些地址。我們僅僅要發送數據即可了,不須要考慮尋址或其它與協議相關的問題。
就像用電話交談一樣。連接的任一端完畢數據的傳輸時,都要通知其對等實體。兩端都完畢傳輸時,要依次將連接拆除。
既然無連接協議有這么多的缺點,大家可能會奇怪。為什么還要使用這樣的協議呢?我們會看到。在非常多情況下,使用無連接協議構建應用程序都是有意義的。比方,使用無連接協議能夠非常方便地支持一對多和多對一通信。而面向連接協議通常都須要多個獨立的連接才干做到。但更重要的是,無連接協議是構建面向連接協議的基礎。TCP/IP 是基于一個4層的協議棧,例如以下圖所看到的:
如圖所看到的,TCP 和 UDP 都是構建在 IP 之上的。因此,IP 是構建整個 TCP/IP 協議族的基礎。
但 IP 提供的是一種盡力而為的、不可靠的無連接服務。它接收來自其上層的分組,將它們封裝在一個 IP 分組中,依據路由為分組選擇正確的硬件接口。從這個接口將分組發送出去。一旦將分組發送出去了,IP 就不再關心這個分組了。和全部無連接協議一樣。它將分組發送出去之后就不再記得這個分組了。
這樣的簡單性也是 IP 的主要長處。由于它對底層的物理介質沒有作不論什么如果,所以在不論什么能夠承載分組的物理鏈路上都能夠執行 IP。比如,IP 能夠執行在簡單的串行鏈路、以太網和令牌環 LAN、X.25 和使用 ATM(Asychronous Transfer Mode。異步轉移模式)的 WAN、CDPD(Cellular Digital Packet Data,無線蜂窩數字分組數據)網,以及非常多其它網絡上。雖然這些網絡技術之間有非常大的差異,但 IP 對它們一視同仁。除了覺得它們能夠轉發分組之外沒有對其作不論什么如果。這樣的機制隱含了非常深的意義。IP 能夠執行在不論什么能夠承載分組的網絡上,所以整個 TCP/IP 協議族也能夠。
如今我們來看看 TCP 是如何利用這樣的簡單的無連接服務來提供可靠的面向連接服務的。TCP 的分組被稱為段(segment),是放在 IP 數據報中發送的。因此,根本無法假定這些分組會抵達目的地,更不用說保證分組無損壞且以原來的順序到達了。
為了提供這樣的可靠性,TCP 向主要的 IP 服務中加入了三項功能:
首先。它為 TCP 段中的數據提供了校驗和。這樣有助于確保抵達目的地的數據在傳輸過程中不會被網絡損壞。
第二,它為每字節分配了一個序列號,這樣,假設數據抵達目的地時真的錯序了,接收端也可以依照恰當的順序將其重裝起來。當然,TCP 并沒有為每字節都附加一個序列號。實際上,每一個 TCP 段的首部都包括了段中第一字節的序列號。這樣,就隱含地知道了段中其它字節的序列號。
第三。TCP 提供了一種確認-重傳機制,以確保終于每一個段都會被傳送出去。
還有一方面,UDP 為編寫應用程序的程序猿提供了一種不可靠的無連接服務。
其實,UDP 僅僅向底層的 IP 協議中加入了兩項功能。
首先,它提供了一個可選的校驗和來檢測數據的損壞情況。雖然 IP 也有校驗和,但它僅僅對 IP 分組首部進行計算,所以,TCP 和 UDP 也都提供了校驗和來保護它們自己的首部和數據。
其次,UDP 向 IP加入的第二項特性就是port的概念。
回到與電話/寄信的類比中來。我們能夠把 TCP 連接中的網絡地址當作一個辦公室總機的電話號碼,把port數作為一個站的辦公室被稱為一個特定的電話分機號碼。同樣,可以UDP網絡地址地址公寓大樓,而port數作為一座公寓樓的大堂在個人郵箱。
轉載于:https://www.cnblogs.com/mengfanrong/p/5012619.html
總結
以上是生活随笔為你收集整理的Linux网络编程——连接和面向连接的协议之间没有区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux——使用fidsk对linux
- 下一篇: windows和Linux内存的对齐方式