主頁 > .NET開發 > C#Socket編程之TCP與UDP簡介

C#Socket編程之TCP與UDP簡介

2020-09-10 18:00:00 .NET開發

一、TCP與UDP簡介

   首先咱們弄清楚,TCP協議和UDP協議與TCP/IP協議的聯系,很多人犯糊涂了, 一直都是說TCP協議與UDP協議的區別,我覺得這是沒有從本質上弄清楚網路通信!

TCP/IP協議是一個協議簇,里面包括很多協議的,UDP只是其中的一個, 之所以命名為TCP/IP協議,因為TCP、IP協議是兩個很重要的協議,就用他兩命名了,

TCP/IP網路模型

        計算機與網路設備要相互通信,雙方就必須基于相同的方法,比如,如何探測到通信目標、由哪一邊先發起通信、使用哪種語言進行通信、怎樣結束通信等規則都需要事先確定,不同的硬體、作業系統之間的通信,所有的這一切都需要一種規則,而我們就把這種規則稱為協議(protocol),

       TCP/IP 是互聯網相關的各類協議族總稱,比如:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都屬于 TCP/IP 族內的協議,

       TCP/IP模型是互聯網的基礎,它是一系列網路協議的總稱,這些協議可以劃分為四層,分別為鏈路層網路層傳輸層應用層

  • 鏈路層:負責封裝和解封裝IP報文,發送和接受ARP/RARP報文等,
  • 網路層:負責路由以及把分組報文發送給目標網路或主機,
  • 傳輸層:負責對報文進行分組和重組,并以TCP或UDP協議格式封裝報文,
  • 應用層:負責向用戶提供應用程式,比如HTTP、FTP、Telnet、DNS、SMTP等,

在網路體系結構中網路通信的建立必須是在通信雙方的對等層進行,不能交錯, 在整個資料傳輸程序中,資料在發送端時經過各層時都要附加上相應層的協議頭和協議尾(僅資料鏈路層需要封裝協議尾)部分,也就是要對資料進行協議封裝,以標識對應層所用的通信協議,接下去介紹TCP/IP 中有兩個具有代表性的傳輸層協議----TCP 和 UDP,

二、TCP協議

1.1 定義

TCP(TransmissionControl Protocol)傳輸控制協議,

是一種可靠的、面向連接的協議(eg:打電話)、傳輸效率低全雙工通信(發送快取&接收快取)、面向位元組流,使用TCP的應用:Web瀏覽器;電子郵件、檔案傳輸程式,

1.2 特性

1.2.1.是面向連接的協議

也就是說,在收發資料前,必須和對方建立可靠的連接,一個TCP連接必須要經過三次“對話”才能建立起來,接收雙方獨占一個通道

1.2.2.面向位元組流

TCP將應用程式看成是一連串的無結構的位元組流,每個TCP套介面有一個發送緩沖區,如果位元組流太長時,TCP會將其拆分進行發送,當位元組流太短時,TCP會等待緩沖區中的位元組流達到一定程度時再構成報文發送出去,TCP發給對方的資料,對方在收到資料時必須給矛確認,只有在收到對方的確認時,本方TCP才會把TCP發送緩沖區中的資料洗掉,

1.2.3.3次握手建立連接,4次握手釋放連接

ACK:TCP報頭的控制位之一,表示確認號是否有效,只有當ACK=1時,確認號才有效,當ACK=0時,確認號無效,這時會要求重傳資料,保證資料的完整性,

確認號:用它來告訴發送端發送過來的序列號之前的資料段都收到了,比如,確認號為X,則表示前X-1個資料段都收到了,

SYN:同步序列號,TCP建立連接時將這個位置1,

FIN:發送端完成發送任務位,當TCP完成資料傳輸需要斷開時,提出斷開連接的一方將這位置1,

TCP建立連接三次握手程序

1、主機A通過向主機B發送一個含有同步序列號的標志位的資料段給主機B ,向主機B 請求建立連接,通過這個資料段,主機A告訴主機B 兩件事:我想要和你通信;你可以用哪個序列號作為起始資料段來回應我,

2、主機B 收到主機A的請求后,用一個帶有確認應答(ACK)和同步序列號(SYN)標志位的資料段回應主機A,也告訴主機A兩件事:我已經收到你的請求了,你可以傳輸資料了;你要用哪個序列號作為起始資料段來回應我,

3、主機A收到這個資料段后,再發送一個確認應答,確認已收到主機B 的資料段:我已收到回復,我現在要開始傳輸實際資料了,

 三、UDP協議

1.1 定義

UDP(User DatagramProtocol)用戶資料報協議

不可靠的無連接的服務傳輸效率高(發送前時延小),一對一、一對多、多對一、多對多、面向報文,盡最大努力服務,無擁塞控制,使用UDP的應用:域名系統 (DNS);視頻流;IP語音(VoIP),

1.2 特性

1.2.1.無連接的服務

UDP是一個非連接的協議,傳輸資料之前源端和終端不建立連接,雙方沒有專有的通信通道,當發送端想傳送資料時就簡單地把資料扔到網路上,并不能保證他們能到達目的地,接收端由于沒有與發送端建立專用的通信通道,因此接收資料時并不能確定是有誰發來的資料

1.2.2.面向報文

       發送方的UDP對應用程式交下來的報文,在添加首部后就向下交付給IP層,既不拆分,也不合并,而是保留這些報文的邊界,也就是說應用層交給UDP多長的報文,UDP就照樣發送,即一次發送一個報文,

不同于TCP有快取機制,TCP是將發送的資料都看成位元組流,根據位元組流在緩沖區存盤的大小來決定是否發送,一次發送的資訊不一定是整個報文,

使用UDP發送資訊,應用程式必須選擇合適大小的報文,若報文太長,則IP層需要分片,降低效率,若太短,會是IP太小,

四、TCP與UDP的對比

1.1、基本區別

1、TCP面向連接(如打電話要先撥號建立連接),UDP是無連接的,即發送資料之前不需要建立連接,

2、對系統資源的要求(TCP較多,UDP少),TCP需要建立專用的通信通道,還需要校驗資料等,因此需求的系統資源較大,

3、TCP保證資料正確性,TCP丟包會自動重傳,UDP可能丟包,丟包后不會自動重傳,TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道,

4、TCP保證資料傳輸有序,UDP不保證,

    訊息在傳輸程序中可能會亂序,后發送的訊息可能會先到達,TCP會對其進行重排序,UDP不會,

4、TCP面向位元組流,實際上是TCP把資料看成一連串無結構的位元組流,UDP是面向報文的

5、UDP沒有擁塞控制,因此網路出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)

6、每一條TCP連接只能是點到點的,UDP支持一對一,一對多,多對一和多對多的互動通信,

7、TCP首部開銷20位元組,UDP的首部開銷小,只有8個位元組

1.2、編程中的區別

從程式實作的角度來看,可以用下圖來進行描述, 

TCP編程的客戶端一般步驟是:

  1、創建一個socket,用函式socket(),

  2、設定socket屬性, 

  3、設定要連接的對方的IP地址和埠等屬性,

  4、連接服務器,用函式connect(),

  5、收發資料,用函式send()和recv(),或者read()和write(),

  6、關閉網路連接,  

  UDP編程的服務器端一般步驟是:

  1、創建一個socket,用函式socket(),

  2、設定socket屬性,

  3、系結IP地址、埠等資訊到socket上,用函式bind(),

  4、回圈接收資料,用函式recvfrom(),

  5、關閉網路連接,

UDP編程的客戶端一般步驟是:

  1、創建一個socket,用函式socket(),

  2、設定socket屬性,  

  4、設定對方的IP地址和埠等屬性,

  5、發送資料,用函式sendto(),

  6、關閉網路連接, 

1.3、TCP/UDP應用場景

什么時候應該使用TCP:

當對網路通訊質量有要求的時候,比如:整個資料要準確無誤的傳遞給對方,這往往用于一些要求可靠的應用,比如HTTP、HTTPS、FTP等傳輸檔案的協議,POP、SMTP等郵件傳輸的協議, 
在日常生活中,常見使用TCP協議的應用如下:

瀏覽器,用的HTTP

FlashFXP,用的FTP

Outlook,用的POP、SMTP

Putty,用的Telnet、SSH

QQ檔案傳輸

…………

那么什么時候應該使用UDP:

當對網路通訊質量要求不高的時候,要求網路通訊速度能盡量的快,這時就可以使用UDP, 
比如,日常生活中,常見使用UDP協議的應用如下:

QQ語音

QQ視頻

TFTP

............

五、總結

  • TCP向上層提供面向連接的可靠服務 ,UDP向上層提供無連接不可靠服務,
  • 雖然 UDP 并沒有 TCP 傳輸來的準確,但是也能在很多實時性要求高的地方有所作為,
  • 對資料準確性要求高,速度可以相對較慢的,可以選用TCP,

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/2966.html

標籤:C#

上一篇:C# 呼叫SendMessage重繪任務欄圖示(強制結束時圖示未消失)

下一篇:c#Socket通信實體

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more