在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

TCP與UDP的基本區別

科技綠洲 ? 來源:Linux開發架構之路 ? 作者:Linux開發架構之路 ? 2023-11-13 15:27 ? 次閱讀

TCP與UDP基本區別

  1. 基于連接與無連接
  2. TCP要求系統資源較多,UDP較少;
  3. UDP程序結構較簡單
  4. 流模式(TCP)與數據報模式(UDP);
  5. TCP保證數據正確性,UDP可能丟包
  6. TCP保證數據順序,UDP不保證

UDP應用場景:

  1. 面向數據報方式
  2. 網絡數據大多為短消息
  3. 擁有大量Client
  4. 對數據安全性無特殊要求
  5. 網絡負擔非常重,但對響應速度要求高

TCP報頭

圖片

UDP報頭

圖片

TCP三次握手

圖片

1.TCP服務器進程先創建傳輸控制塊TCB,時刻準備接受客戶進程的連接請求,此時服務器就進入了LISTEN(監聽)狀態; 2.TCP客戶進程也是先創建傳輸控制塊TCB,然后向服務器發出連接請求報文,這是報文首部中的同部位SYN=1,同時選擇一個初始序列號 seq=x ,此時,TCP客戶端進程進入了 SYN-SENT(同步已發送狀態)狀態。TCP規定,SYN報文段(SYN=1的報文段)不能攜帶數據,但需要消耗掉一個序號。 3.TCP服務器收到請求報文后,如果同意連接,則發出確認報文。確認報文中應該 ACK=1,SYN=1,確認號是ack=x+1,同時也要為自己初始化一個序列號 seq=y,此時,TCP服務器進程進入了SYN-RCVD(同步收到)狀態。這個報文也不能攜帶數據,但是同樣要消耗一個序號。 4.TCP客戶進程收到確認后,還要向服務器給出確認。確認報文的ACK=1,ack=y+1,自己的序列號seq=x+1,此時,TCP連接建立,客戶端進入ESTABLISHED(已建立連接)狀態。TCP規定,ACK報文段可以攜帶數據,但是如果不攜帶數據則不消耗序號。 5.當服務器收到客戶端的確認后也進入ESTABLISHED狀態,此后雙方就可以開始通信了。

為什么TCP客戶端最后還要發送一次確認呢?

一句話,主要防止已經失效的連接請求報文突然又傳送到了服務器,從而產生錯誤。

如果使用的是兩次握手建立連接,假設有這樣一種場景,客戶端發送了第一個請求連接并且沒有丟失,只是因為在網絡結點中滯留的時間太長了,由于TCP的客戶端遲遲沒有收到確認報文,以為服務器沒有收到,此時重新向服務器發送這條報文,此后客戶端和服務器經過兩次握手完成連接,傳輸數據,然后關閉連接。此時此前滯留的那一次請求連接,網絡通暢了到達了服務器,這個報文本該是失效的,但是,兩次握手的機制將會讓客戶端和服務器再次建立連接,這將導致不必要的錯誤和資源的浪費。

如果采用的是三次握手,就算是那一次失效的報文傳送過來了,服務端接受到了那條失效報文并且回復了確認報文,但是客戶端不會再次發出確認。由于服務器收不到確認,就知道客戶端并沒有請求連接。

TCP四次揮手

圖片

1.客戶端進程發出連接釋放報文,并且停止發送數據。釋放數據報文首部,FIN=1,其序列號為seq=u(等于前面已經傳送過來的數據的最后一個字節的序號加1),此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。 TCP規定,FIN報文段即使不攜帶數據,也要消耗一個序號。

2.服務器收到連接釋放報文,發出確認報文,ACK=1,ack=u+1,并且帶上自己的序列號seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態。TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,這時候處于半關閉狀態,即客戶端已經沒有數據要發送了,但是服務器若發送數據,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間。

3.客戶端收到服務器的確認請求后,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送連接釋放報文(在這之前還需要接受服務器發送的最后的數據)。

4.服務器將最后的數據發送完畢后,就向客戶端發送連接釋放報文,FIN=1,ack=u+1,由于在半關閉狀態,服務器很可能又發送了一些數據,假定此時的序列號為seq=w,此時,服務器就進入了LAST-ACK(最后確認)狀態,等待客戶端的確認。

客戶端收到服務器的連接釋放報文后,必須發出確認,ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態。注意此時TCP連接還沒有釋放,必須經過2MSL(最長報文段壽命)的時間后,當客戶端撤銷相應的TCB后,才進入CLOSED狀態。

5.服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB后,就結束了這次的TCP連接。可以看到,服務器結束TCP連接的時間要比客戶端早一些。

為什么客戶端最后還要等待2MSL?

MSL(Maximum Segment Lifetime),TCP允許不同的實現可以設置不同的MSL值。

第一,保證客戶端發送的最后一個ACK報文能夠到達服務器,因為這個ACK報文可能丟失,站在服務器的角度看來,我已經發送了FIN+ACK報文請求斷開了,客戶端還沒有給我回應,應該是我發送的請求斷開報文它沒有收到,于是服務器又會重新發送一次,而客戶端就能在這個2MSL時間段內收到這個重傳的報文,接著給出回應報文,并且會重啟2MSL計時器。

第二,防止類似與“三次握手”中提到了的“已經失效的連接請求報文段”出現在本連接中。客戶端發送完最后一個確認報文后,在這個2MSL時間中,就可以使本連接持續的時間內所產生的所有報文段都從網絡中消失。這樣新的連接中不會出現舊連接的請求報文。

為什么建立連接是三次握手,關閉連接確是四次揮手呢?

建立連接的時候, 服務器在LISTEN狀態下,收到建立連接請求的SYN報文后,把ACK和SYN放在一個報文里發送給客戶端。 而關閉連接時,服務器收到對方的FIN報文時,僅僅表示對方不再發送數據了但是還能接收數據,而自己也未必全部數據都發送給對方了,所以己方可以立即關閉,也可以發送一些數據給對方后,再發送FIN報文給對方來表示同意現在關閉連接,因此,己方ACK和FIN一般都會分開發送,從而導致多了一次。

如果已經建立了連接,但是客戶端突然出現故障了怎么辦?

TCP還設有一個保活計時器,顯然,客戶端如果出現故障,服務器不能一直等下去,白白浪費資源。服務器每收到一次客戶端的請求后都會重新復位這個計時器,時間通常是設置為2小時,若兩小時還沒有收到客戶端的任何數據,服務器就會發送一個探測報文段,以后每隔75分鐘發送一次。若一連發送10個探測報文仍然沒反應,服務器就認為客戶端出了故障,接著就關閉連接。

總的來說 TCP協議提供可靠的服務, UDP協議提供高效率的服務。

高可靠性的TCP服務提供面向連接的服務,主要用于一次傳輸大量報文的情形, 如文件傳輸,遠程登錄等;

高效率的UDP協議提供無連接的數據報服務,用于一次傳輸少量的報文。 即使發生傳輸錯誤,也可以重新傳輸并且不會為此付出多少代價。

TCP提供的是面向連接的、可靠的數據流傳輸,可避免數據傳輸錯誤。 面向連接的協議在任何數據傳輸前就建立好了點到點的連接。

而UDP提供的是非面向連接的、不可靠的數據流傳輸。當一個UDP數據包在網絡中移動時, 發送過程并不知道它是否到達了目的地,除非應用層已經確認了它已到達的事實。 當數據傳輸的性能必須讓位于數據傳輸的 完整性、 可控制性 可靠性時, TCP協議是當然的選擇。 當強調傳輸性能而不是傳輸的完整性時, 如:音頻和多媒體應用, UDP是最好的選擇。 在數據傳輸時間很短,以至于此前的連接過程成為整個流量主體的情況下 UDP也是一個好的選擇 ,如:DNS交換。把SNMP建立在UDP上的部分原因是設計者認為當發生網絡阻塞時, UDP較低的開銷使其有更好的機會去傳送管理數據。

總結

tcp 提供可靠的服務 若強調 完整性 可靠性可控性 選擇tcp

udp 提供高效的服務 若強調 傳輸性能 選擇udp

TCP: 面向連接、傳輸可靠(保證數據正確性,保證數據順序)、 用于傳輸大量數據(流模式)、速度慢,建立連接需要開銷較多 (時間,系統資源)。 UDP:面向非連接、傳輸不可靠、用于傳輸少量數據(數據包模式)、速度快。

[1] tcp和udp的區別,簡單來說, tcp是有序可靠傳輸, 而udp是不可靠亂序傳輸,但是實際上你把udp看做IP可能更準確一點,因為可以在udp基礎上開發出可靠udp等各種傳輸.

[2] tcp的優缺點是什么?優點,這是一個國際通行了很多年的標準實現,調用簡單,省心,很多應用都基于tcp進行實現的,最關鍵的是,它的兼容性是跨平臺的,也就是,只要你選擇的是tcp,那么不管是windows還是linux,unix,只要支持tcp/ip,那么就可以保證實現可靠連接和傳輸.作為軟件的開發者只需要考慮應用層,比如應用協議等的實現就可以了. 至于可靠傳輸的性能,由于是國際標準,在內核層實現和運行,很多都做了硬件級的優化,因此對比起用udp等實現的可靠傳輸,本機[注意是本機]的極限傳輸性能要高很多.

那么tcp有什么明顯的缺點呢? 對開發者來說最頭大的恐怕就是2條, 第一是每個tcp連接都是1對1連接,這意味著每個連接都需要一個套接字socket,并且需要隨時測試是否數據可讀可寫.當連接數量達到一定的程度,性能會直線下降. 沒有經歷過大規模并發應用開發的朋友可能很難想像,就一個基本沒有數據的空連接怎么會消耗系統的性能呢?其實這個問題,不可以單純從硬件或者api接口等進行解釋,而需要從tcp/ip協議棧的實現中去發現的,從可以查看到的代碼,Linux freebsd unix來看,無一列外,在操作系統里使用的是指針鏈表進行管理, 重要的事情說3遍 , 用的是指針鏈表 ,指針鏈表,指針鏈表 , 看下Linux 下的實現 [不是最新版,不過這個應該不會改變,因為會導致整個代碼重構] ,

ip層的接收

for( qp=ipqueue; qp!=NULL; qplast=qp,qp=qp- >next)
{
  if(iph- >id==qp- >iph- >id && .......
     }

新版本4的測試版Linux核心tcp/ip實現, 和之前的比,是使用了rcu_函數來優化,其實換湯不換藥,在執行插入和寫操作的時候,需要執行rcu_writelock, 這和readlock不同,能且只有一個鎖定,而無法多重鎖定,性能在這里遇到了瓶頸, 這個瓶頸出現在tcp/ip協議棧的實現中,由于tcp包的構成問題,至少到目前,或者可以遇見的將來,tcp這個嚴重影響并發性能的問題會一直存在在實現中,這是絕大部分人都始終沒有搞明白,為什么tcp在面對海量并發的時候,在超過一定數字后性能出現直線下降的其中一個關鍵原因. [我曾經嘗試過為Linux下Tcp/ip棧的指針鏈表引入排序等優化,但是經過各種測試,我發現事實上這個實現在大部分情況下性能比排序好,因為排序等反而導致了性能下降,因此除非有革命性的優化出現,目前這個瓶頸會一直存在.]

給出我們自己編寫的延遲測試結果 硬件是Intel i3 2350 [2.3g] ddr3 1333 , tcp 連接數量大并頻繁小包傳輸下,協議棧導致延遲非常明顯,

看出問題在那里了嗎?是個指針遍歷操作 , 獨占模式 ,一萬空連接在目前的cpu前,可能沒什么 ,但是如果是并發模式n萬小包呢, 那開銷n/2......,你再多的cpu核心也沒用,一個鏈表只有一個獨占模式的遍歷操作,其他cpu只能干著急。所以在面對小數據量海量長時間連接的應用時,選擇tcp必須要慎重再慎重. 第二個大問題是tcp是雙向流傳輸,而keepalive這個功能并非普遍支持, 雙向流傳輸意味著,數據是采用流模式過來的,如果切割取決于協議的制定者,例如普遍的采用rn作為分割字符, 而keepalive的非普遍實現,則導致另外一個問題,那就是每個連接,必須每過一定時間在應用協議層檢測連接是否還存活,最典型的就是ftp,如果沒有指令操作,那么客戶端每過一定時間必須發送一條指令,通常是noop指令給服務器端,告訴服務器,我還保持著連接,不要中斷. 可能有人無法理解,tcp不是可靠連接嗎? tcp是可靠連接,要命的時,當tcp建立連接后,如果雙方沒有應用層的數據傳輸,那么當物理中斷發生的時候,等待的一方是接收不到發生故障的一方的任何消息的,直到沒有發生故障的一方,主動發送數據給另一方,出現發送超時的時候,才能給出中斷判斷,否則就是個死等待,這就是ftp等協議中引入noop等類似機制的原因. 流傳輸的另一個問題是,無法實現數據的并發傳輸,而只等排隊發送,這在很多應用,特別是游戲類應用是嚴重的缺陷,無論你有多著急,一個連接就是一個流,你要排隊先發送到緩沖,然后由系統負責發送緩沖數據,可能有人說可以使用緊急指針帶外數據,但這玩意不是讓你用來傳輸數據的,其實是讓你用來發送緊急通知用的,在tcp中使用帶外數據,除了帶來更復雜的實現,沒有什么實質性作用,以ftp為例子,實際上無論你使用使用緊急指針帶外數據,都可以中斷數據傳輸的,這個緊急指針在那里除了保持兼容性,沒有實際作用.

[3] udp的優缺點是什么? udp是比tcp更接近IP的協議, 通常udp是不可靠傳輸,但是我們可以在應用層對udp加上校驗和序列號,做成可靠傳輸,這一點不可不知. udp的優點是什么? 書上總是說udp的性能比tcp好,有沒有人想過為什么? 其實原因很簡單, udp是發射后不管, 不需要對方發送ack包進行確認, tcp由于需要對每一個包進行ack確認,一來一回,就會影響到傳輸效率,但事實上,這個影響是很小的,如果不考慮丟包和線路不穩定等,這個差距一般只有百分只幾,除非你做極限測試. 但實際上,真正用到udp高效傳輸的場合是非常少的,一個關鍵的原因在于它的不可靠性,特別是在Internent上,遇到網關路由高負載的時候,優先扔掉udp包,而且有幾率發生連續的丟包. 我個人認為,udp最大的優點在于它的可塑性非常強, 我們可以通過各種機制來改造udp,例如實現可靠傳輸,實現1對多傳輸, 實現包和流模式同時傳輸,優先發送,多路雙向傳輸等等, 很多擴展在tcp上是無法實現的,但是通過udp擴展就可以很輕松的做到. 同樣,通過擴展udp來實現可靠傳輸,我們可以避開tcp/ip協議棧實現中指針鏈表查詢導致的性能急劇下降,很多人都沒有意識到這點,其實在應對海量連接方面,udp可靠傳輸能支持的用戶數量遠超tcp,因為udp不需要那種大規模的鏈表查詢,是個隊列操作. 那么udp的缺點是什么,最要命的就是不可靠傳輸,其次是包的偽造,雖然我們可以通過加入各種機制和擴展,把udp改造成可靠傳輸,但是由于這個實現是在應用層,因此在面對少量用戶大流量傳輸的時候,極限輸出不如tcp,例如本機.

那么如何選擇tcp還是udp?

先看下人家怎么選

1 HTTP, http協議現在已經深入影響到我們的方方面面,重要性就不說了, 它采用的是tcp 協議,為什么使用tcp, 因為它傳輸的內容是不可以出現丟失,亂序等各種錯誤的,其次它需要跨平臺實現,而tcp滿足了這個要求,發展到今天,http享受了tcp帶來的簡潔高效和跨平臺,但是也承受了tcp的各種缺點,例如缺少tcp keep alive機制[這個其實是后來添加的支持,并非普遍實現], tcp協議棧的實現問題引發的難以支持海量用戶并發連接[只能通過dns等級別的集群或者cdn來實現],協議太復雜導致很難模塊化處理[其實這個問題已經在nginx解決了,nginx通過模塊化和對協議的分段處理機制,并引入消息機制,避免了多進程[線程]的頻繁切換,相比apache等老牌web服務器軟件,在應對大量用戶上擁有極大的優勢。 即使站在今天的角度看,http也確實應該選擇tcp.

2 FTP, 這個協議比http更加古老,它采用的也是tcp協議, 因為它的每一個指令,或者文件傳輸的數據流,都需要保證可靠性,同時要求在各種平臺上廣泛支持,那么就只能選擇tcp, 和http不同,它采用了noop指令機制來處理tcp缺少keep alive機制帶來的問題,也就是客戶端必須每過一段時間,如果沒有發送其他指令,就必須發送一個noop指令給服務器,避免被服務器認為是死連接。 Ftp的缺陷在哪里呢?,其次它的文件傳輸是采用新的數據連接來執行,等于1個用戶需要2個連接,其次當一個文件正在傳輸的時候,你無法進行其他操作,例如列表,也許你可以把它當作是一一對應的典范,因為這樣我們可以直接用命令行進行控制,但是很多用戶其實是需要在下載的時候同時進行列表等操作的,為了解決這個問題,很多客戶端只要開啟多個指令連接[和數據連接],這樣一來,無形中額外帶給了Ftp服務器很多壓力,而采用udp可靠傳輸就不存在這個問題,但是udp可靠傳輸是沒有跨平臺支持的,這樣是魚和熊掌不可兼得,對于這樣一個簡單的開放協議的實現,tcp是個好選擇。

3 POP3/SMTP, 常見的郵件協議,沒什么好說的,反應--應答模式,跨平臺要求,因此tcp是個選擇,這個協議的悲劇在于,當初沒有考慮到郵件附件會越來越大的問題,因此它的實現中將附件文件采用了base64編碼格式,用文本模式進行發送,導致產生了大量的額外流量。

4 TFTP ,這是一個非常古老的用于內部傳輸小文件的協議,沒有FTP那么多功能,采用的是udp協議,通過在包中加入包頭信息,用盡可能簡單的代碼來實現小文件傳輸,注意是小文件,是一個值得參考的udp改造應用范例.

5 通常的voip,實時視頻流等,通常會采用udp協議,這是以內這些應用可以允許丟包,很多人可能認為是udp的高效率所以才在這方面有廣泛應用,這我不敢茍同,我個人認為,之所以采用udp,是因為這些傳輸允許丟包,這是一個最大的前提

那么現在來歸納一下

[1] 如果數據要求完整,不允許任何錯誤發生

[A] 應用層協議開放模式 [例如http ftp]

建議選擇tcp,幾乎是唯一選擇.

[B] 應用曾協議封閉模式 [例如游戲]

(1) 大量連接

[a] 長連接

[一] 少量數據傳輸

優先考慮可靠udp傳輸 , tcp建議在20000連接以下使用.

[二] 大流量數據傳輸

只有在10000連接以下可以考慮tcp , 其他情況優先使用udp可靠傳輸

[b] 短連接

[一] 少量數據傳輸

建議使用udp標準模式, 加入序列號, 如果連接上限不超2萬,可以考慮tcp

[二] 大流量數據傳輸

10000連接以下考慮tcp ,其他情況使用udp可靠傳輸

在遇到海量連接的情況下,建議優先考慮udp可靠傳輸,使用tcp,由于tcp/ip棧的鏈表實現的影響,連接越多,性能下降越快,而udp可以實現隊列,是一條平滑的直線,幾乎沒有性能影響.

(2) 有限連接 [通常小于2000 , 一般每服務器為幾百到1000左右]

[a] 長連接

除非有數據的實時性要求,優先考慮tcp,否則使用udp可靠傳輸.

[b] 短連接

優先考慮tcp.

在有限連接的情況下,使用tcp可以減少代碼的復雜性,增加廣泛的移植性,并且不需要考慮性能問題.

[2] 允許丟包,甚至可以亂序

[a] 對實時性要求比較高,例如voip , 那么udp是最優選擇.

[b] 部分數據允許丟包,部分數據要求完整,部分有實時性要求,通常這樣的需求是出現在游戲里, 這時候, 基于udp協議改造的udp多路可靠傳輸[同時支持不可靠模式],基本是唯一能滿足的,當然也可以使用tcp來傳輸要求完整的數據,但是通常不建議,因為同時使用tcp和udp傳輸數據,會導致代碼臃腫復雜度增加,udp可靠傳輸完全可以替代tcp.

[c]部分數據優先傳輸,部分可丟棄數據在規定時效內傳輸, 這通常是實時視頻流, 在有限連接模式下,可以考慮tcp+udp , 但是通常, 可靠udp傳輸是最好的選擇.

最后的話, tcp/ip協議很偉大, 在這些基礎上誕生了很多劃時代的應用,但是時代在發展,需求也在改變,幾十年前誕生的基礎協議,也遇到了各種問題,典型的是32位地址編碼問題,雖然通過nat等技術盡可能的支持更多的機器接入,但是很多應用被限制了,由于tcp/ip協議的巨大影響和事實的上的壟斷,導致后續的更新必須考慮到完全兼容, ipv6出現了, 它繼承了ipv4的幾乎所有優點和缺點,只為了一個字,兼容. 我們可以擁有更快的cpu , 內存, 更強大的tcp/ip系統調用api,但是比較遺憾,tcp/ip協議棧的實現,我們始終無法繞開指針鏈表, 而正是這,導致了tcp模式在面對海量連接的時候,超過一定數量,網絡io性能直線下降, 許許多多的工程師始終認為是cpu 內存不夠導致,卻沒有想到是tcp協議棧的實現上存在性能瓶頸. 在目前的情況下,也只有udp能避開這個協議棧的性能瓶頸,為什么? 因為udp采用的是1對多的虛擬連接, 例如,當虛擬[或者實際]通過udp構建的連接數量是1萬個的時候,實際上在協議棧增加的單元只有1個, 而同樣1萬個連接,tcp增加的單元是1萬個,每個片的到達平均要查詢5千次,而可靠udp采用隊列模式,查詢次數是1, 因此, 在今天, 如果你希望你的每臺服務器能支持更多的連接,除非你的應用協議需要開放或者兼容其他應用,否則盡可能考慮采用udp, 而不是tcp.

TCP 與 UDP 的區別及應用場景

概述 兩者都是通信協議, TCP、UDP 是傳輸層協議,但他們的通信機制與應用場景不同,下面來闡述兩者的區別以及它們的應用場景。

TCP 與 UDP TCP(Transmission Control Protocol),又叫傳輸控制協議,UDP(User Datagram Protocol),又叫用戶數據報協議,它們都是傳輸層的協議,但兩者的機制不同,它們的區別如下:

特點 TCP UDP 連接性 面向連接 面向非連接 可靠性 可靠 不可靠 傳輸效率 慢 快

TCP 從如上表格看到,TCP 是面向連接的,并且是一種可靠的協議,在基于 TCP 進行通信時,通信雙方需要先建立一個 TCP 連接,建立連接需要經過三次握手,握手成功才可以進行通信,關于 TCP 三次握手、四次揮手的過程請看該文章。 另外 TCP 協議是一種可靠的傳輸協議,那么它是如何保證可靠性的呢?

可靠性 在講解 TCP 如何保證可靠性前,首先得理解什么是可靠。在通信的角度來看,可靠即要確保通信雙方的通信信息不會丟失,若丟失了保證能夠對其進行恢復,并且收到的信息內容與原發送內容一樣。 在 TCP 中,傳輸報文都是通過建立的虛擬連接來進行傳輸,發送端傳輸的每一個 TCP 報文,都會對其進行編號(編號是由于網絡傳輸的原因,發送的報文可能會亂序到達,因此需要根據編號對報文進行重排),并且開啟一個計時器;當接收端收到報文后,并且通過校驗和對收到的報文數據進行校驗,若校驗成功則會返回一個確認報文,告知發送端我已經成功收到該報文了;若發送端在計時器結束前仍未收到確認報文,則認為接收端接收失敗,則會重傳該報文;服務端若收到重復報文(根據編號發現已經是收到了),則會將該報文丟棄。 因此,從上面的機制可以知道,TCP 是通過重傳、確認和校驗和的方式來確保可靠。 注:校驗和并不能檢驗數據是否被篡改過,想要保證數據的完整性可以了解一下數字簽名

UDP UDP 是一種面向無連接,且不可靠的協議,在通信過程中,它并不像 TCP 那樣需要先建立一個連接,只要(目的地址,端口號,源地址,端口號)確定了,就可以直接發送信息報文,并且不需要確保服務端一定能收到或收到完整的數據。它僅僅提供了校驗和機制來保障一個報文是否完整,若校驗失敗,則直接丟棄報文,不做任何處理。

TCP 與 UDP 的應用場景 從特點上我們已經知道,TCP 是可靠的但傳輸速度慢 ,UDP 是不可靠的但傳輸速度快。因此在選用具體協議通信時,應該根據通信數據的要求而決定。 若通信數據完整性需讓位與通信實時性,則應該選用 TCP 協議(如文件傳輸、重要狀態的更新等);反之,則使用 UDP 協議(如視頻傳輸、實時通信等)。

一般面試官都會問TCP和UDP的區別,這個很好回答啊,TCP面向連接,可靠,基于字節流,而UDP不面向連接,不可靠,基于數據報。對于連接而言呢,其實真正的就不存在,TCP面向連接只不過三次握手在客戶端和服務端之間初始化好了序列號。只要滿足TCP的四元組+序列號,那客戶端和服務端之間發送的消息就有效,可以正常接收。雖然說TCP可靠,但是可靠的背后卻是lol無盡之刃的復雜和痛苦,滑動窗口,擁塞避免,四個超時定時器,還有什么慢啟動啊,快恢復,快重傳啊這里推薦大家看看(圖解TCP/IP,這個簡單容易,TCP卷123,大量的文字描述真是煩),所以什么都是相對呢,可靠性的實現也讓TCP變的復雜,在網絡的狀況很差的時候,TCP的優勢會變成。基于字節流什么意思呢?一句話就可以說明白,對于讀寫沒有相對應的次數。UDP基于數據報就是每對應一個發,就要對應一個收。而TCP無所謂啊,現在應該懂了吧。對于UDP而言,不面向連接,不可靠,沒有三次握手,我給你發送數據之前,不需要知道你在不在,不要你的同意,我只管把數據發送出去至于你收到不收到,從來和我沒有半毛錢的關系。

對于可靠不可靠而言,沒有絕對的說法,TCP可靠僅僅是在傳輸層實現了可靠,我也可以讓UDP可靠啊,那么就要向上封裝,在應該層實現可靠性。因此很多公司都不是直接用TCP和UDP,都是經過封裝,滿足業務的需要而已。說到這里的話,那就在提一下心跳包,在linux下有keep-alive系統自帶的,但是默認時間很長,如果讓想使用話可以setsockopt設置,我也可以在應用層實現一個簡單心跳包,上次自己多開了一個線程來處理,還是包頭解決。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7030

    瀏覽量

    89038
  • 服務器
    +關注

    關注

    12

    文章

    9160

    瀏覽量

    85426
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1353

    瀏覽量

    79077
  • UDP
    UDP
    +關注

    關注

    0

    文章

    325

    瀏覽量

    33941
  • 程序
    +關注

    關注

    117

    文章

    3787

    瀏覽量

    81049
收藏 人收藏

    評論

    相關推薦

    TCP協議和UDP協議的區別有哪些

    計算機網絡簡答題1、TCP 協議和 UDP 協議的區別有哪些?(1)TCP 屬于面向連接的協議,UDP 屬于面向無連接的協議 ;(2)
    發表于 08-06 08:43

    TCPUDP區別分析

      傳輸層協議主要有TCPUDPUDP提供無連接的通信,不能保證數據包被發送到目標地址,典型的即時傳輸少量數據的應用程序通常使用UDPTCP
    發表于 09-18 10:29 ?2次下載

    udptcp區別在哪里

    主要介紹udptcp區別在哪里,以及TCP協議和UDP協議為什么會共存?通常我們在說到網絡編程時默認是指
    發表于 12-08 14:08 ?8587次閱讀

    tcpudp協議的異同

    UDP 校驗和則是包含 UDP 首部和數據在內的校驗結果。 TCP協議 TCP協議基于網絡層的 IP 協議提供的是有連接、可靠服務,是基于字節流的。
    的頭像 發表于 11-12 14:45 ?4087次閱讀
    <b class='flag-5'>tcp</b>和<b class='flag-5'>udp</b>協議的異同

    TCPUDP的原理以及區別

    最近重新認知了一下TCPUDP的原理以及區別,做一個簡單的總結。
    發表于 08-08 14:34 ?1495次閱讀

    TCPUDP協議的區別

    最近重新認知了一下TCPUDP的原理以及區別,做一個簡單的總結。
    發表于 11-03 10:25 ?880次閱讀

    TCPUDP的作用及區別

      首先,tcpudp都是工作在傳輸層,用于程序之間傳輸數據的。數據一般包含:文件類型,視頻類型,jpg圖片等。
    的頭像 發表于 11-14 10:49 ?3486次閱讀

    UDPTCP區別

    在上一則文章中,對 TCP 的**三次握手建立連接**和**四次揮手釋放連接**進行了詳細地闡述,本節教程針對于 TCP 的其他內容進行講解,首先是同處于傳輸層協議的`UDP`協議,這兩者有什么
    的頭像 發表于 01-20 17:05 ?1748次閱讀
    <b class='flag-5'>UDP</b>和<b class='flag-5'>TCP</b>的<b class='flag-5'>區別</b>

    TCPUDP的原理以及區別

    TCP是基于連接的,而UDP是基于非連接的。 **tcp傳輸數據穩定可靠** ,適用于對網絡通訊質量要求較高的場景,需要準確無誤的傳輸給對方,比如,傳輸文件,發送郵件,瀏覽網頁等等
    的頭像 發表于 05-18 17:14 ?978次閱讀
    <b class='flag-5'>TCP</b>和<b class='flag-5'>UDP</b>的原理以及<b class='flag-5'>區別</b>

    TCPUDP可以同時綁定相同的端口嗎?

    (InternetProtocol)的獨立的兩個協議,他們都工作在OSI模型中的網絡層。其中TCPUDP最大的區別就是面向連接和面向無連接。TCP當需要傳輸的數據的可
    的頭像 發表于 02-06 11:16 ?1849次閱讀
    <b class='flag-5'>TCP</b>和<b class='flag-5'>UDP</b>可以同時綁定相同的端口嗎?

    udp是什么協議 TCPUDP區別

    TCP協議提供可靠的數據傳輸,UDP協議提供盡量高效的數據傳輸。TCP協議通過使用序列號、確認應答等機制,保證數據傳輸的可靠性,而UDP協議不提供可靠性保證,它只是簡單地把應用程序傳給
    的頭像 發表于 06-26 17:47 ?1.1w次閱讀

    TCPUDP區別

    1.TCPUDP區別 TCP是面向連接的,UDP是面向無連接的; TCP只能一對一通信,
    的頭像 發表于 11-09 09:35 ?6018次閱讀
    <b class='flag-5'>TCP</b>和<b class='flag-5'>UDP</b>的<b class='flag-5'>區別</b>

    UDPTCP的主要區別 UDP能否像TCP一樣實現可靠傳輸?

    UDPTCP的主要區別 UDP能否像TCP一樣實現可靠傳輸?TCP如何實現可靠性傳輸?
    的頭像 發表于 01-22 16:10 ?820次閱讀

    udp是什么意思 簡述TCPUDP區別和聯系

    中的兩個基本協議。然而,TCPUDP之間存在一些重要的區別和聯系。 首先,TCP是一種面向連接的協議,而UDP是無連接的。這意味著通過
    的頭像 發表于 02-02 16:33 ?1316次閱讀

    tcpudp區別和聯系

    一、引言 在現代網絡通信中,數據傳輸是至關重要的。為了確保數據的可靠傳輸,網絡協議發揮著關鍵作用。傳輸控制協議(TCP)和用戶數據報協議(UDP)是兩種常用的網絡協議,它們在許多應用場景中發
    的頭像 發表于 08-16 11:06 ?604次閱讀
    主站蜘蛛池模板: 日本综合在线| jinv在线视频| 在线免费公开视频| 五月亭亭六月丁香| 狠狠尻| 手机看片福利在线| 色a4yy综合私人| 欧美h视频| 手机午夜视频| 欧美激情xxxx性bbbb| 欧美色频| 欧美天天综合| 最近2018年中文字幕大全一| 美女网站色在线观看| 男女激情做爰叫床声视频偷拍| 欧美一区二区三区不卡视频 | 欧美影院一区二区三区| 夜夜爱夜夜做| 亚洲免费成人| 女人张腿让男桶免费视频观看| 天天操天天干天天| 狠狠色噜噜狠狠狠狠97老肥女 | 国产精品资源在线| 亚洲国产精品第一区二区| 成人a大片高清在线观看| 黄色网欧美| 欧美视频精品在线| 美女被免网站在线视频| 午夜宅男视频| 亚洲网站大全| www午夜| 丁香婷婷网| 亚洲日本一区二区三区在线不卡| 欧美一级高清免费a| 黄字幕网| 四虎.com| 末满18以下勿进色禁网站| 亚洲国产成人久久精品图片| 亚洲第七页| 在线天堂中文有限公司| 91色爱|