Winsock網絡編程筆記(4)----基本的理論知識

? ? ?前面的筆記記錄了Winsock的入門編程,領略了Winsock編程的樂趣。。但這并不能算是掌握了Winsock,加深理論知識的理解才會讓后續學習更加得心應手。。因此,這篇筆記將記錄一些有關Winsock的基本理論知識,由于是一篇筆記,鑒于看書速度有限,主要內容會慢慢地填入。。錯誤在所難免的,希望看客更正。。(*^__^*) 嘻嘻……

<一>:消息和流(摘錄自網上)

  1. 保護消息邊界,就是指傳輸協議把數據當作一條獨立的消息在網上傳輸,接收端只能接收獨立的消息.也就是說存在保護消息邊界,接收端一次只能接收發送端發出的一個數據包.

  2. 而面向流則是指無保護消息保護邊界的,如果發送端連續發送數據, 接收端有可能在一次接收動作中,會接收兩個或者更多的數據包.

  3. 我們舉個例子來說,例如,我們連續發送三個數據包,大小分別是2k, 4k , 8k,這三個數據包,都已經到達了接收端的網絡堆棧中

  4. 如果使用UDP協議,不管我們使用多大的接收緩沖區去接收數據,我們必須有三次接收動作,才能夠把所有的數據包接收完.

  5. 而使用TCP協議,我們只要把接收的緩沖區大小設置在14k以上,我們就能夠一次把所有的數據包接收下來,只需要有一次接收動作.

  6. 這就是因為UDP協議的保護消息邊界使得每一個消息都是獨立的.而流傳輸,卻把數據當作一串數據流,他不認為數據是一個一個的消息.

  7. 所以有很多人在使用tcp協議通訊的時候,并不清楚tcp是基于流的傳輸,當連續發送數據的時候,他們時常會認識tcp會丟包.其實不然,因為當他們使用的緩沖區足夠大時,他們有可能會一次接收到兩個甚至更多的數據包,而很多人往往會忽視這一點,只解析檢查了第一個數據包,而已經接收的其他數據包卻被忽略了.

  8. 根據以上所說,可以這樣理解,TCP為了保證可靠傳輸,盡量減少額外開銷(每次發包都要驗證),因此采用了流式傳輸,面向流的傳輸,相對于面向消息的傳輸,可以減少發送包的數量。從而減少了額外開銷。但是,對于數據傳輸頻繁的程序來講,使用TCP可能會容易粘包。

  9. 當然,對接收端的程序來講,如果機器負荷很重,也會在接收緩沖里粘包。這樣,就需要接收端額外拆包,增加了工作量。因此,這個特別適合的是數據要求可靠傳輸,但是不需要太頻繁傳輸的場合(兩次操作間隔100ms,具體是由TCP等待發送間隔決定的,取決于內核中的socket的寫法)

  10. 而UDP,由于面向的是消息傳輸,它把所有接收到的消息都掛接到緩沖區的接受隊列中,因此,它對于數據的提取分離就更加方便,但是,它沒有粘包機制,因此,當發送數據量較小的時候,就會發生數據包有效載荷較小的情況,也會增加多次發送的系統發送開銷(系統調用,寫硬件等)和接收開銷。因此,應該最好設置一個比較合適的數據包的包長,來進行UDP數據的發送。(UDP最大載荷為1472,因此最好能每次傳輸接近這個數的數據量,這特別適合于視頻,音頻等大塊數據的發送,同時,通過減少握手來保證流媒體的實時性)

?<二>:面向連接和無連接

  1. Connection-oriented 面向連接:
    ? ? ?一種網絡協議,依賴發送方和接收器之間的顯示通信和阻塞以管理雙方的數據傳輸.網絡系統需要在兩臺計算機之間發送數據之前先建立連接的一種特性。面向連接網絡類似于電話系統,在開始通信前必須先進行一次呼叫和應答。
    如果一種服務具有下列特征,就認為它是面向連接的:
    ? ? 1、建立一條虛電路(比如3次握手)
    ? ? 2、使用排序
    ? ? 3、使用確認
    ? ? 4、使用流量控制。流量控制的類型有:緩沖、窗口機制和擁堵避免。
    ? ? ?面向連接的服務就是通信雙方在通信時,要事先建立一條通信線路,其過程有建立連接、使用連接和釋放連接三個過程。TCP協議就是一種面向連接服務的協議,電話系統是一個面向連接的模式。
    其特點是:
    ? ? ? 數據傳輸過程前必須經過建立連接、維護連接和釋放連接的3個過程;在數據傳輸過程中,各分組不需要攜帶目的節點的地址。面向連接服務的傳輸連接類似于一個通信管道,發送者在一端放入數據,接受者從另一端取出數據。面向連接數據傳輸的收發數據順序不變,因此傳輸的可靠性好,但需通信開始前的鏈接開銷,協議復雜,通信效率不高。

  2. Connectionless 無連接:
    ? ? ? 網絡系統允許一臺計算機在任何時刻發送數據給任何一臺其它的計算機的一種特性。無連接網絡類似于郵政系統,每封信件附有收信人地址,信件可在任何時刻發出。在無連接的網絡服務中,增加了更多的管理開銷。無連接的服務用來傳送不帶確認或流量的數據,它被認為是不可靠的。

<三>單播、多播、廣播

  1. 單播:
    ? ? ?網絡節點之間的通信就好像是人們之間的對話一樣。如果一個人對另外一個人說話,那么用網絡技術的術語來描述就是“單播”,此時信息的接收和傳遞只在兩個節點之間進行,參見圖1。


    ?
      圖1 單播:一對一
    ? ? ?單播在網絡中得到了廣泛的應用,網絡上絕大部分的數據都是以單播的形式傳輸的,只是一般網絡用戶不知道而已。例如,你在收發電子郵件、瀏覽網頁時,必須與郵件服務器、Web服務器建立連接,此時使用的就是單播數據傳輸方式。但是通常使用“點對點通信”(Point to Point)代替“單播”,因為“單播”一般與“多播”和“廣播”相對應使用。
    優點:
    服務器及時響應客戶機的請求、服務器針對每個客戶不通的請求發送不通的數據,容易實現個性化服務。
    缺點:
    ? ? ? 服務器針對每個客戶機發送數據流,服務器流量=客戶機數量×客戶機流量;在客戶數量大、每個客戶機流量大的流媒體應用中服務器不堪重負;
    ? ? ? 現有的網絡帶寬是金字塔結構,城際省際主干帶寬僅僅相當于其所有用戶帶寬之和的5%。如果全部使用單播協議,將造成網絡主干不堪重負。現在的P2P應用就已經使主干經常阻塞,只要有5%的客戶在全速使用網絡,其他人就不要玩了。而將主干擴展20倍幾乎是不可能。
  2. 多播:
    ? ? ?“多播”可以理解為一個人向多個人(但不是在場的所有人)說話,這樣能夠提高通話的效率。如果你要通知特定的某些人同一件事情,但是又不想讓其他人知道,使用電話一個一個地通知就非常麻煩,而使用日常生活的大喇叭進行廣播通知,就達不到只通知個別人的目的了,此時使用“多播”來實現就會非常方便快捷,但是現實生活中多播設備非常少。多播如圖2所示。

    ?
      圖2 多播:一對多
    ? ? ?“多播”也可以稱為“組播”,在網絡技術的應用并不是很多,網上視頻會議、網上視頻點播特別適合采用多播方式。因為如果采用單播方式,逐個節點傳輸,有多少個目標節點,就會有多少次傳送過程,這種方式顯然效率極低,是不可取的;如果采用不區分目標、全部發送的廣播方式,雖然一次可以傳送完數據,但是顯然達不到區分特定數據接收對象的目的。采用多播方式,既可以實現一次傳送所有目標節點的數據,也可以達到只對特定對象傳送數據的目的。

    優點:
    ? ? ? 需要相同數據流的客戶端加入相同的組共享一條數據流,節省了服務器的負載。具備廣播所具備的優點;
    ? ? ? 由于組播協議是根據接受者的需要對數據流進行復制轉發,所以服務端的服務總帶寬不受客戶接入端帶寬的限制。IP協議允許有2億6千多萬個(268435456)組播,所以其提供的服務可以非常豐富;
    ? ? ? 此協議和單播協議一樣允許在Internet寬帶網上傳輸。
    缺點:
    ? ? ? 與單播協議相比沒有糾錯機制,發生丟包錯包后難以彌補,但可以通過一定的容錯機制和QOS加以彌補。
    ? ? ? 現行網絡雖然都支持組播的傳輸,但在客戶認證、QOS等方面還需要完善,這些缺點在理論上都有成熟的解決方案,只是需要逐步推廣應用到現存網絡當中
  3. 廣播:
    “廣播”可以理解為一個人通過廣播喇叭對在場的全體說話,這樣做的好處是通話效率高,信息一下子就可以傳遞到全體,如圖3所示。

    圖3 廣播:一對全體
      “廣播”在網絡中的應用較多,如客戶機通過DHCP自動獲得IP地址的過程就是通過廣播來實現的。但是同單播和多播相比,廣播幾乎占用了子網內網絡的所有帶寬。拿開會打一個比方吧,在會場上只能有一個人發言,想象一下如果所有的人同時都用麥克風發言,那會場上就會亂成一鍋粥。
      在網絡中不能長時間出現大量的廣播包,否則就會出現所謂的“廣播風暴”。廣播風暴就是網絡長時間被大量的廣播數據包所占用,正常的點對點通信無法正常進行,外在表現為網絡速度奇慢無比。出現廣播風暴的原因有很多,一塊有故障的網卡,就可能長時間向網絡上發送廣播包而導致廣播風暴。
      集線器由于其工作原理決定了不可能過濾廣播風暴,一般的交換機也沒有這一功能,不過現在有的網絡交換機(如全向的QS系列交換機)也有過濾廣播風暴功能了,路由器本身就有隔離廣播風暴的作用。
      廣播風暴不能完全杜絕,但是只能在同一子網內傳播,就好像喇叭的聲音只能在同一會場內傳播一樣,因此在由幾百臺甚至上千臺電腦構成的大中型局域網中,一般進行子網劃分,就像將一個大廳用墻壁隔離成許多小廳一樣,以達到隔離廣播風暴的目的。
      在IP網絡中,廣播地址用IP地址“255.255.255.255”來表示,這個IP地址代表同一子網內所有的IP地址。

    優點:
    ? ? ? 網絡設備簡單,維護簡單,布網成本低廉
    ? ? ? 由于服務器不用向每個客戶機單獨發送數據,所以服務器流量負載極低。
    缺點:
    ? ? ? 無法針對每個客戶的要求和時間及時提供個性化服務。
    ? ? ? 網絡允許服務器提供數據的帶寬有限,客戶端的最大帶寬=服務總帶寬。例如有線電視的客戶端的線路支持100個頻道(如果采用數字壓縮技術,理論上可以提供 500個頻道),即使服務商有更大的財力配置更多的發送設備、改成光纖主干,也無法超過此極限。也就是說無法向眾多客戶提供更多樣化、更加個性化的服務。

?

轉載于:https://www.cnblogs.com/LCCRNblog/p/3840958.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375734.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375734.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375734.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

30分鐘學會使用grunt打包前端代碼

http://www.cnblogs.com/yexiaochai/p/3603389.html轉載于:https://www.cnblogs.com/wuxiang/p/4647280.html

簡單shell:刪除五日之前的日志文件

曾經在某公司面試的時候被問到了類似的問題。 假設在logs文件夾存放了許多日志文件 比如&#xff1a;20190204.log、20190205.log、20190206.log。。。 我們要刪除特定日期之前的日志 在這里展示的是使用shell指令中的find指令完成操作 首先看一下find指令的命令格式&#xf…

Method Swizzle黑魔法,修改 ios 系統類庫方法(轉載)

一般來說&#xff0c;系統提供的方法已經足夠開發了&#xff0c;但是有的時候有些需求用普通方法不好做。 如&#xff1a;在所有的viewcontroll 的viewwillappear&#xff1a;方法之前打個log 你可能會這么做&#xff1a; 1. 建一個uiviewcontroll 父類&#xff0c;重寫viewwil…

win10無法開啟夜間模式

在學校的時候沒感覺&#xff0c;一進公司發現電腦還是需要設置一下護眼的&#xff0c;但是在設置的時候卻遇到夜間模式無法開啟的問題。 首先在左下角搜索設備管理器 找到顯示適配器 查看顯示器設備狀態 如果設備圖標上有黃三角感嘆號則說明該設備驅動有問題&#xff0c;需要…

Linux LVM學習總結——擴展卷組VG

Linux服務器由于應用變更或需求的緣故&#xff0c;有可能出現分區空間不足的情況&#xff0c;此時往往需要進行擴容&#xff08;要增加分區的空間&#xff09;&#xff0c;而采用LVM的好處就是可以在不需停機的情況下可以方便地調整各個分區大小。如下所示&#xff0c;分區/u05…

【液晶模塊系列基礎視頻】1.3.iM_TFT30模塊簡介

【液晶模塊系列基礎視頻】1.3.iM_TFT30模塊介紹 技術論壇&#xff1a;http://www.eeschool.org 博客地址&#xff1a;http://xiaomagee.cnblogs.com 官方網店&#xff1a;http://i-board.taobao.com 銀杏科技 GINGKO TECH. 保留權利&#xff0c;轉載請注明出處 本次教學視頻介…

C++控制向文件中寫入浮點數的格式

有時會遇到向文件中寫入一定格式的浮點數&#xff0c;為了對齊美觀&#xff0c;常常采用控制小數點后的位數并用0補齊缺少的位數的方法。 #include <iostream> #include <iomanip> #include <fstream> using namespace std;int main(){double pi3.14;ofstre…

項目管理工具到底應該為誰服務?

項目管理工具到底應該為誰服務&#xff1f;為管理者&#xff0c;還是為了團隊&#xff1b;為了管理報表&#xff0c;還是為了協作需求&#xff0c;這些是在項目管理工具選擇或開發時需要面對和思考的一個問題。 傳統項目管理工具在團隊內部臭名昭著 項目管理工具當初都是為了項…

二叉樹的遞歸定義及存儲

定義 最多有兩棵子樹的有序樹&#xff0c;稱為二叉樹。二叉樹是一種特殊的樹。 遞歸定義&#xff1a;二叉樹是n(n>0)個有限結點構成的集合。N0稱為空二叉樹&#xff1b;n>0的二叉樹由一個根結點和兩互不相交的&#xff0c;分別稱為左子樹和右子樹的二叉樹構成。 二叉樹中…

C++統計微妙級時間消耗(chrono)

有時我們需要統計某段程序運行所消耗的時間&#xff0c;通過C的chrono庫&#xff0c;我們可以輕松實現這一需求&#xff0c;例如&#xff0c;我們求斐波那契數列消耗的時間。 #include <iostream> #include <chrono> #include <iomanip> using namespace st…

content-length與Transfer-Encoding: chunked的問題釋疑

content-length與Transfer-Encoding: chunked的問題釋疑 http返回頭中content-length與Transfer-Encoding: chunked的問題釋疑 先說說問題出現的背景&#xff1a; 公司服務器與手機客戶端交互&#xff0c;客戶端請求一個動態生成的XML文件&#xff0c;在用firebug查看http響應頭…

基于RSA的加密/解密示例C#代碼

在C#程序中&#xff0c;大家可能比較熟悉的方式是md5加密解密方式&#xff0c;對RSA可能并不是很熟悉&#xff0c; 下面就說一下RSA加密和解密的算法&#xff1a;using System;using System.Security.Cryptography;using System.Text;class RSACSPSample{static void Main(){tr…

iOS GorupBy

轉自&#xff1a; IOS 數組分組 Grouped NSArray 12345678NSMutableSet *set[NSMutableSet set];[_list enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {[set addObject:obj["MeasureType"]];//利用set不重復的特性,得到有多少組,根據數組中的…

android通過adb shell播放音樂

am start -n com.android.music/com.android.music.MediaPlaybackActivity -d /sdcard/timian.mp3拓展閱讀 input keyevent 24 #增加音量 input keyevent 25 #降低音量 input keyevent 85 #暫停/播放 input keyevent 126 #恢復播放 input keyevent 127 #停止播放關閉音樂播放器…

NetBpm 安裝篇(1)

尊重別人勞動成果 轉載注明出處&#xff1a;http://www.cnblogs.com/anbylau2130/p/3875718.html 官方主頁 http://www.netbpm.org/docs/install.html 文件目錄 Netbpm的兩種服務器配置 1&#xff0c;CassiniWebServer CassiniWebServer.exe是輕量級的web服務器&#xff0c;相…

python將文本中的數據處理成圖像(matplotlib)

使用Python的matplotlib模塊可以很方便的將數據處理成圖表&#xff0c;使數據更加形象、直觀。 #!/usr/bin/env pythonimport matplotlib.pyplot as plt import numpy as np from mpl_toolkits.axes_grid.anchored_artists import AnchoredTexty1np.loadtxt(ReadDataCostTime.…

string 中的 length函數 和size函數 返回值問題

string 中的 length函數 和 size函數 的返回值 ( 還有 char [ ] 中 測量字符串的 strlen 函數 ) 應該是 unsigned int 類型的 不可以 和 -1 比較。 應盡量避免 unsigned int 類型 和 int類型 數據 的比較 。當unsigned int 類型 和 int類型 數據 比較 時 &#xff0c;會 把…

交叉編譯android版htop

編這個東西賊煩人。 話不多說&#xff0c;直接上教程 源代碼版本&#xff1a;htop-2.2.0、ncurses-6.1 編譯之前要確認自己有ndk&#xff0c;從【官網】直接下載&#xff0c;下載下來解壓一下就能用。 先編ncurses 編譯過程 ./configure CCarm-linux-androideabi-gcc-4.9 \-…

今天的一點點收獲

今天怎么說呢&#xff0c;還是有點收獲的&#xff0c;上午寫了一上午的前端&#xff0c;然后就是下午又是一下午的c#&#xff0c;好特么酸爽啊&#xff0c;但是有一件特別蛋疼的事情發生了&#xff0c;我 天天叫的學長竟然不是學長而是學校的而老師&#xff0c;但是他們都不叫他…