? ? ?前面的筆記記錄了Winsock的入門編程,領略了Winsock編程的樂趣。。但這并不能算是掌握了Winsock,加深理論知識的理解才會讓后續學習更加得心應手。。因此,這篇筆記將記錄一些有關Winsock的基本理論知識,由于是一篇筆記,鑒于看書速度有限,主要內容會慢慢地填入。。錯誤在所難免的,希望看客更正。。(*^__^*) 嘻嘻……
<一>:消息和流(摘錄自網上)
-
保護消息邊界,就是指傳輸協議把數據當作一條獨立的消息在網上傳輸,接收端只能接收獨立的消息.也就是說存在保護消息邊界,接收端一次只能接收發送端發出的一個數據包.
-
而面向流則是指無保護消息保護邊界的,如果發送端連續發送數據, 接收端有可能在一次接收動作中,會接收兩個或者更多的數據包.
-
我們舉個例子來說,例如,我們連續發送三個數據包,大小分別是2k, 4k , 8k,這三個數據包,都已經到達了接收端的網絡堆棧中
-
如果使用UDP協議,不管我們使用多大的接收緩沖區去接收數據,我們必須有三次接收動作,才能夠把所有的數據包接收完.
-
而使用TCP協議,我們只要把接收的緩沖區大小設置在14k以上,我們就能夠一次把所有的數據包接收下來,只需要有一次接收動作.
-
這就是因為UDP協議的保護消息邊界使得每一個消息都是獨立的.而流傳輸,卻把數據當作一串數據流,他不認為數據是一個一個的消息.
-
所以有很多人在使用tcp協議通訊的時候,并不清楚tcp是基于流的傳輸,當連續發送數據的時候,他們時常會認識tcp會丟包.其實不然,因為當他們使用的緩沖區足夠大時,他們有可能會一次接收到兩個甚至更多的數據包,而很多人往往會忽視這一點,只解析檢查了第一個數據包,而已經接收的其他數據包卻被忽略了.
-
根據以上所說,可以這樣理解,TCP為了保證可靠傳輸,盡量減少額外開銷(每次發包都要驗證),因此采用了流式傳輸,面向流的傳輸,相對于面向消息的傳輸,可以減少發送包的數量。從而減少了額外開銷。但是,對于數據傳輸頻繁的程序來講,使用TCP可能會容易粘包。
-
當然,對接收端的程序來講,如果機器負荷很重,也會在接收緩沖里粘包。這樣,就需要接收端額外拆包,增加了工作量。因此,這個特別適合的是數據要求可靠傳輸,但是不需要太頻繁傳輸的場合(兩次操作間隔100ms,具體是由TCP等待發送間隔決定的,取決于內核中的socket的寫法)
-
而UDP,由于面向的是消息傳輸,它把所有接收到的消息都掛接到緩沖區的接受隊列中,因此,它對于數據的提取分離就更加方便,但是,它沒有粘包機制,因此,當發送數據量較小的時候,就會發生數據包有效載荷較小的情況,也會增加多次發送的系統發送開銷(系統調用,寫硬件等)和接收開銷。因此,應該最好設置一個比較合適的數據包的包長,來進行UDP數據的發送。(UDP最大載荷為1472,因此最好能每次傳輸接近這個數的數據量,這特別適合于視頻,音頻等大塊數據的發送,同時,通過減少握手來保證流媒體的實時性)
?<二>:面向連接和無連接
-
Connection-oriented 面向連接:
? ? ?一種網絡協議,依賴發送方和接收器之間的顯示通信和阻塞以管理雙方的數據傳輸.網絡系統需要在兩臺計算機之間發送數據之前先建立連接的一種特性。面向連接網絡類似于電話系統,在開始通信前必須先進行一次呼叫和應答。
如果一種服務具有下列特征,就認為它是面向連接的:
? ? 1、建立一條虛電路(比如3次握手)
? ? 2、使用排序
? ? 3、使用確認
? ? 4、使用流量控制。流量控制的類型有:緩沖、窗口機制和擁堵避免。
? ? ?面向連接的服務就是通信雙方在通信時,要事先建立一條通信線路,其過程有建立連接、使用連接和釋放連接三個過程。TCP協議就是一種面向連接服務的協議,電話系統是一個面向連接的模式。
其特點是:
? ? ? 數據傳輸過程前必須經過建立連接、維護連接和釋放連接的3個過程;在數據傳輸過程中,各分組不需要攜帶目的節點的地址。面向連接服務的傳輸連接類似于一個通信管道,發送者在一端放入數據,接受者從另一端取出數據。面向連接數據傳輸的收發數據順序不變,因此傳輸的可靠性好,但需通信開始前的鏈接開銷,協議復雜,通信效率不高。 - Connectionless 無連接:
? ? ? 網絡系統允許一臺計算機在任何時刻發送數據給任何一臺其它的計算機的一種特性。無連接網絡類似于郵政系統,每封信件附有收信人地址,信件可在任何時刻發出。在無連接的網絡服務中,增加了更多的管理開銷。無連接的服務用來傳送不帶確認或流量的數據,它被認為是不可靠的。
<三>單播、多播、廣播
- 單播:
? ? ?網絡節點之間的通信就好像是人們之間的對話一樣。如果一個人對另外一個人說話,那么用網絡技術的術語來描述就是“單播”,此時信息的接收和傳遞只在兩個節點之間進行,參見圖1。?
圖1 單播:一對一
? ? ?單播在網絡中得到了廣泛的應用,網絡上絕大部分的數據都是以單播的形式傳輸的,只是一般網絡用戶不知道而已。例如,你在收發電子郵件、瀏覽網頁時,必須與郵件服務器、Web服務器建立連接,此時使用的就是單播數據傳輸方式。但是通常使用“點對點通信”(Point to Point)代替“單播”,因為“單播”一般與“多播”和“廣播”相對應使用。
優點:
服務器及時響應客戶機的請求、服務器針對每個客戶不通的請求發送不通的數據,容易實現個性化服務。
缺點:
? ? ? 服務器針對每個客戶機發送數據流,服務器流量=客戶機數量×客戶機流量;在客戶數量大、每個客戶機流量大的流媒體應用中服務器不堪重負;
? ? ? 現有的網絡帶寬是金字塔結構,城際省際主干帶寬僅僅相當于其所有用戶帶寬之和的5%。如果全部使用單播協議,將造成網絡主干不堪重負。現在的P2P應用就已經使主干經常阻塞,只要有5%的客戶在全速使用網絡,其他人就不要玩了。而將主干擴展20倍幾乎是不可能。 - 多播:
? ? ?“多播”可以理解為一個人向多個人(但不是在場的所有人)說話,這樣能夠提高通話的效率。如果你要通知特定的某些人同一件事情,但是又不想讓其他人知道,使用電話一個一個地通知就非常麻煩,而使用日常生活的大喇叭進行廣播通知,就達不到只通知個別人的目的了,此時使用“多播”來實現就會非常方便快捷,但是現實生活中多播設備非常少。多播如圖2所示。?
圖2 多播:一對多
? ? ?“多播”也可以稱為“組播”,在網絡技術的應用并不是很多,網上視頻會議、網上視頻點播特別適合采用多播方式。因為如果采用單播方式,逐個節點傳輸,有多少個目標節點,就會有多少次傳送過程,這種方式顯然效率極低,是不可取的;如果采用不區分目標、全部發送的廣播方式,雖然一次可以傳送完數據,但是顯然達不到區分特定數據接收對象的目的。采用多播方式,既可以實現一次傳送所有目標節點的數據,也可以達到只對特定對象傳送數據的目的。
優點:
? ? ? 需要相同數據流的客戶端加入相同的組共享一條數據流,節省了服務器的負載。具備廣播所具備的優點;
? ? ? 由于組播協議是根據接受者的需要對數據流進行復制轉發,所以服務端的服務總帶寬不受客戶接入端帶寬的限制。IP協議允許有2億6千多萬個(268435456)組播,所以其提供的服務可以非常豐富;
? ? ? 此協議和單播協議一樣允許在Internet寬帶網上傳輸。
缺點:
? ? ? 與單播協議相比沒有糾錯機制,發生丟包錯包后難以彌補,但可以通過一定的容錯機制和QOS加以彌補。
? ? ? 現行網絡雖然都支持組播的傳輸,但在客戶認證、QOS等方面還需要完善,這些缺點在理論上都有成熟的解決方案,只是需要逐步推廣應用到現存網絡當中 - 廣播:
“廣播”可以理解為一個人通過廣播喇叭對在場的全體說話,這樣做的好處是通話效率高,信息一下子就可以傳遞到全體,如圖3所示。
圖3 廣播:一對全體
“廣播”在網絡中的應用較多,如客戶機通過DHCP自動獲得IP地址的過程就是通過廣播來實現的。但是同單播和多播相比,廣播幾乎占用了子網內網絡的所有帶寬。拿開會打一個比方吧,在會場上只能有一個人發言,想象一下如果所有的人同時都用麥克風發言,那會場上就會亂成一鍋粥。
在網絡中不能長時間出現大量的廣播包,否則就會出現所謂的“廣播風暴”。廣播風暴就是網絡長時間被大量的廣播數據包所占用,正常的點對點通信無法正常進行,外在表現為網絡速度奇慢無比。出現廣播風暴的原因有很多,一塊有故障的網卡,就可能長時間向網絡上發送廣播包而導致廣播風暴。
集線器由于其工作原理決定了不可能過濾廣播風暴,一般的交換機也沒有這一功能,不過現在有的網絡交換機(如全向的QS系列交換機)也有過濾廣播風暴功能了,路由器本身就有隔離廣播風暴的作用。
廣播風暴不能完全杜絕,但是只能在同一子網內傳播,就好像喇叭的聲音只能在同一會場內傳播一樣,因此在由幾百臺甚至上千臺電腦構成的大中型局域網中,一般進行子網劃分,就像將一個大廳用墻壁隔離成許多小廳一樣,以達到隔離廣播風暴的目的。
在IP網絡中,廣播地址用IP地址“255.255.255.255”來表示,這個IP地址代表同一子網內所有的IP地址。
優點:
? ? ? 網絡設備簡單,維護簡單,布網成本低廉
? ? ? 由于服務器不用向每個客戶機單獨發送數據,所以服務器流量負載極低。
缺點:
? ? ? 無法針對每個客戶的要求和時間及時提供個性化服務。
? ? ? 網絡允許服務器提供數據的帶寬有限,客戶端的最大帶寬=服務總帶寬。例如有線電視的客戶端的線路支持100個頻道(如果采用數字壓縮技術,理論上可以提供 500個頻道),即使服務商有更大的財力配置更多的發送設備、改成光纖主干,也無法超過此極限。也就是說無法向眾多客戶提供更多樣化、更加個性化的服務。
?