參考:
https://blog.csdn.net/weixin_43784305/article/details/104918771
https://www.cnblogs.com/xiaomayizoe/p/5258754.html
https://blog.csdn.net/qq_38950316/article/details/81122894
https://blog.csdn.net/xiaoyuerp/article/details/84102318
TCP和UDP總結(區別、優缺點、應用實例)
TCP和UDP的區別和優缺點以及應用實例
TCP和UDP區別總結:
- TCP面向連接,UDP是無連接的
TCP在開始數據傳輸之前要經過三次握手,UDP卻不需要任何准備即可進行數據傳輸,因此UDP不會引入建立連接的時延 - TCP提供可靠的服務,UDP盡最大努力交付,即不保證可靠交付
TCP傳輸數據具有重傳機制,如果在傳輸數據的過程中發生丟包事件,發送方會重傳丟失的分組,所以TCP保證發送的分組一定能到達接收方,因此是可靠的。
UDP在應用層得到數據后,附加上用於多路復用/多路分解服務的源端口號和目的端口號字段后,直接將形成的報文段傳輸給網絡,而網絡層是不可靠的,因而不能保證數據傳輸的可靠性。(可以在應用層實現UDP數據傳輸的可靠性) - UDP具有較好的實時性,工作效率比TCP高
UDP在傳輸數據前不需要建立連接,沒有繁瑣的握手過程,沒有復雜的擁塞控制算法和重傳機制,所以UDP相對於TCP具有較高的效率。 - 每一條TCP連接只能是點到點,UDP支持一對一、一對多、多對多
- TCP對系統資源要求較多,UDP對系統資源要求較少
TCP建立連接后,會為連接分配發送緩存和接受緩存,維護擁塞控制變量以及序號和確認號的參數,因此需要占用較多的系統資源。而UDP是無連接的,對系統資源要求較少
為什么UDP有時比TCP更有優勢?
- 網速的提升給UDP的穩定性提供可靠網絡保障,丟包率很低,如果使應用層重傳,能夠確保傳輸的可靠性
- TCP為了實現網絡通信的可靠性,使用了復雜的擁塞控制機制算法,建立了繁瑣的握手過程,由於TCP內置的系統協議棧中,極難對其進行改進。
- 基於UDP對實時性要求較為嚴格的情況下,采用自定義重傳機制,能夠把丟包產生的延遲降到最低,盡量減少網絡對進程造成影響
TCP和UDP應用的例子
TCP應用:
- FTP:文件傳輸協議
- SSH:安全登錄、文件傳送(SCP)和端口重定向
- Telnet:不安全文本傳送
- SMTP:簡單郵件傳輸協議
- HTTP:超文本傳輸協議
UDP應用:
-
流媒體
如果采用TCP,一旦發生丟包,TCP會將后續包緩存起來,等前面的包重傳並接收到后再繼續發送,延遲會越來越大。基於UDP的協議入WebRTC使極佳的選擇。
-
實時游戲
對實時要求較為嚴格的情況下,采用自定義的可靠UDP協議,自定義重傳策略,能哦把丟包產生的延遲降到最低,盡量減少網絡問題對游戲性造成的影響。
-
物聯網
TCP和UDP的優缺點及區別
TCP的優點: 可靠,穩定 TCP的可靠體現在TCP在傳遞數據之前,會有三次握手來建立連接,而且在數據傳遞時,有確認、窗口、重傳、擁塞控制機制,在數據傳完后,還會斷開連接用來節約系統資源。 TCP的缺點: 慢,效率低,占用系統資源高,易被攻擊 TCP在傳遞數據之前,要先建連接,這會消耗時間,而且在數據傳遞時,確認機制、重傳機制、擁塞控制機制等都會消耗大量的時間,而且要在每台設備上維護所有的傳輸連接,事實上,每個連接都會占用系統的CPU、內存等硬件資源。 而且,因為TCP有確認機制、三次握手機制,這些也導致TCP容易被人利用,實現DOS、DDOS、CC等攻擊。
UDP的優點: 快,比TCP稍安全 UDP沒有TCP的握手、確認、窗口、重傳、擁塞控制等機制,UDP是一個無狀態的傳輸協議,所以它在傳遞數據時非常快。沒有TCP的這些機制,UDP較TCP被攻擊者利用的漏洞就要少一些。但UDP也是無法避免攻擊的,比如:UDP Flood攻擊…… UDP的缺點: 不可靠,不穩定 因為UDP沒有TCP那些可靠的機制,在數據傳遞時,如果網絡質量不好,就會很容易丟包。 基於上面的優缺點,那么: 什么時候應該使用TCP: 當對網絡通訊質量有要求的時候,比如:整個數據要准確無誤的傳遞給對方,這往往用於一些要求可靠的應用,比如HTTP、HTTPS、FTP等傳輸文件的協議,POP、SMTP等郵件傳輸的協議。 在日常生活中,常見使用TCP協議的應用如下: 瀏覽器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件傳輸 ………… 什么時候應該使用UDP: 當對網絡通訊質量要求不高的時候,要求網絡通訊速度能盡量的快,這時就可以使用UDP。 比如,日常生活中,常見使用UDP協議的應用如下: QQ語音 QQ視頻 TFTP ……
有些應用場景對可靠性要求不高會用到UPD,比如長視頻,要求速率
小結TCP與UDP的區別:
1.基於連接與無連接;
2.對系統資源的要求(TCP較多,UDP少);
3.UDP程序結構較簡單;
4.流模式與數據報模式 ;
5.TCP保證數據正確性,UDP可能丟包,TCP保證數據順序,UDP不保證。
tcp協議和udp協議的差別
TCP UDP
是否連接 面向連接 面向非連接
傳輸可靠性 可靠 不可靠
應用場合 傳輸大量數據 少量數據
速度 慢 快
TCP與UDP區別總結:
1、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發送數據之前不需要建立連接
2、TCP提供可靠的服務。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重復,且按序到達;UDP盡最大努力交付,即不保證可靠交付
3、TCP面向字節流,實際上是TCP把數據看成一連串無結構的字節流;UDP是面向報文的
UDP沒有擁塞控制,因此網絡出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)
4、每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
5、TCP首部開銷20字節;UDP的首部開銷小,只有8個字節
6、TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道
TCP與UDP的技術面試考點
面試時回答此類問題,先介紹兩者的概念,再闡述兩者的區別
TCP和UDP是OSI模型中的運輸層中的協議。TCP提供可靠的通信傳輸,而UDP則常被用於讓廣播和細節控制交給應用的通信傳輸。
1.TCP(Transmission Control Protocol)的概念
TCP是一種面向連接的,提供可靠交付服務和全雙工通信的,基於字節流的端到端的傳輸層通信協議。
TCP在傳輸數據之前必須先建立連接(TCP連接過程參見:https://blog.csdn.net/qq_38950316/article/details/81087809),數據傳輸結束后要釋放連接。
每一條TCP連接只能有2個端點,故TCP不提供廣播或多播服務。
TCP提供可靠交付,通過TCP連接傳輸的數據,無差錯、不丟失、不重復、並且按序到達。
TCP是面向字節流的。雖然應用進程和TCP的交互是一次一個數據塊(大小不等),但TCP把英語程序交下來的數據看成僅僅是一連串的無結構的字節流。TCP並不知道所傳輸的字節流的含義。
2 . UDP(User Data Protocol,用戶數據報協議)
(1)UDP是一個非連接的協議,傳輸數據之前源端和終端不建立連接,當它想傳送時就簡單地去抓取來自應用程序的數據,並盡可能快地把它扔到網絡上。在發送端,UDP傳送數據的速度僅僅是受應用程序生成數據的速度、計算機的能力和傳輸帶寬的限制;在接收端,UDP把每個消息段放在隊列中,應用程序每次從隊列中讀一個消息段。
(2) 由於傳輸數據不建立連接,因此也就不需要維護連接狀態,包括收發狀態等,因此一台服務機可同時向多個客戶機傳輸相同的消息。
(3)UDP信息包的標題很短,只有8個字節,相對於TCP的20個字節信息包的額外開銷很小。
(4) 吞吐量不受擁擠控制算法的調節,只受應用軟件生成數據的速率、傳輸帶寬、源端和終端主機性能的限制。
(5)UDP使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持復雜的鏈接狀態表(這里面有許多參數)。
(6)UDP是面向報文的。發送方的UDP對應用程序交下來的報文,在添加首部后就向下交付給IP層。既不拆分,也不合並,而是保留這些報文的邊界,因此,應用程序需要選擇合適的報文大小。
UDP應用場景:
1.面向數據報方式
2.網絡數據大多為短消息
3.擁有大量Client
4.對數據安全性無特殊要求
5.網絡負擔非常重,但對響應速度要求高
3. TCP與UDP區別總結:
1)、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發送數據之前不需要建立連接
2)、TCP提供可靠的服務。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重復,且按序到達;UDP盡最大努力交付,即不保 證可靠交付
3)、TCP面向字節流,實際上是TCP把數據看成一連串無結構的字節流;UDP是面向報文的
UDP沒有擁塞控制(),因此網絡出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)
4)、每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
5)、TCP首部開銷20字節;UDP的首部開銷小,只有8個字節
6)、TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道
TCP和UDP的區別
(1)同步:端口下如果同是來了兩個客戶端請求,第一個連接得到響應,與服務端建立通訊,而第二個請求就會被一直阻塞直到第一個請求完成操作,各請求之間排隊,順序執行。
(2)異步呢,就是同時來兩個或者多個請求,服務端就同時響應多個客戶端,同時給他們連接。各個客戶端與服務器的通訊是並行的,一個客戶端不必等另一個客戶端完成操作。通常用這兩個方法來接收一個客戶端請求。
(3)阻塞 調用是指調用結果返回之前,當前線程會被掛起。比如:Console.ReadLine(),如果你不向控制台輸入數據,這個方法就會一直等待,知道你輸入數據后才會向下執行。這個時候當前線程被掛起來了,讓CPU去做其他事情。
(4)非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函數不會阻塞當前線程,而會立刻返回。
syn攻擊
在三次握手過程中,服務器發送SYN-ACK之后,收到客戶端的ACK之前的TCP連接稱為半連接(half-open connect).此時服務器處於Syn_RECV狀態.當收到ACK后,服務器轉入ESTABLISHED狀態.
Syn攻擊就是 攻擊客戶端 在短時間內偽造大量不存在的IP地址,向服務器不斷地發送syn包,服務器回復確認包,並等待客戶的確認,由於源地址是不存在的,服務器需要不斷的重發直 至超時,這些偽造的SYN包將長時間占用未連接隊列,正常的SYN請求被丟棄,目標系統運行緩慢,嚴重者引起網絡堵塞甚至系統癱瘓。
Syn攻擊是一個典型的DDOS攻擊。檢測SYN攻擊非常的方便,當你在服務器上看到大量的半連接狀態時,特別是源IP地址是隨機的,基本上可以斷定這是一次SYN攻擊.在Linux下可以如下命令檢測是否被Syn攻擊
netstat -n -p TCP | grep SYN_RECV
一般較新的TCP/IP協議棧都對這一過程進行修正來防范Syn攻擊,修改tcp協議實現。主要方法有SynAttackProtect保護機制、SYN cookies技術、增加最大半連接和縮短超時時間等.
但是不能完全防范syn攻擊。
TCP和UDP是OSI模型中的運輸層中的協議。TCP提供可靠的通信傳輸,而UDP則常被用於廣播提供面向無連接的通信服務
握手
“我想給你發數據,可以嗎?” (請提供序列號作為起始數據段)SYN:同步序列編號(Synchronize Sequence Numbers)
“可以,你什么時候發?” (已提供序列號)SYN+ACK應答
“我現在就發,你接着吧!” ACK消息響應
揮手 (A為主動關閉方,可以是SERVICE也可以是CLIENT)
SERVER:傳輸好了,我要關了 1 ) 當主機A完成數據傳輸后,發送FIN,提出停止TCP連接的請求,進入FIN_WAIT1狀態
CLIENT:我看一下 2 ) 主機B收到FIN后,將發送ACK,進入CLOSE_WAIT狀態
CLIENT:OK ,可以關 3 ) 由B 端再提出反方向的關閉請求,將發送FIN,並進入LAST_ACK狀態
SERVER: 嗯,我關了 4 ) 主機A對主機B的請求進行確認收到FIN,將發送ACK,雙方向的關閉結束.進入TIME_WAIT狀態,經過2MSL時間后關閉
UDP(User Data Protocol,用戶數據報協議)
我們經常使用“ping”命令來測試兩台主機之間TCP/IP通信是否正常,其實“ping”命令的原理就是向對方主機發送UDP數據包,然后對方主機確認收到數據包,如果數據包是否到達的消息及時反饋回來,那么網絡就是通的。
UDP應用場景: 1.面向數據報方式 2.網絡數據大多為短消息 3.擁有大量Client 4.對數據安全性無特殊要求 5.網絡負擔非常重,但對響應速度要求高
小結TCP與UDP的區別: 1.基於連接與無連接; 2.對系統資源的要求(TCP較多,UDP少); 3.UDP程序結構較簡單; 4.流模式與數據報模式 ; 5.TCP保證數據正確性,UDP可能丟包,TCP保證數據順序,UDP不保證。
TCP:
TCP編程的服務器端一般步驟是: TCP包頭的最小長度,為20字節。
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt(); * 可選
3、綁定IP地址、端口等信息到socket上,用函數bind();
4、開啟監聽,用函數listen();
5、接收客戶端上來的連接,用函數accept();
6、收發數據,用函數send()和recv(),或者read()和write();
7、關閉網絡連接;
8、關閉監聽;
TCP編程的客戶端一般步驟是:
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt();* 可選
3、綁定IP地址、端口等信息到socket上,用函數bind();* 可選
4、設置要連接的對方的IP地址和端口等屬性;
5、連接服務器,用函數connect();
6、收發數據,用函數send()和recv(),或者read()和write();
7、關閉網絡連接;
UDP:與之對應的UDP編程步驟要簡單許多,分別如下:
UDP編程的服務器端一般步驟是:
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt();* 可選
3、綁定IP地址、端口等信息到socket上,用函數bind();
4、循環接收數據,用函數recvfrom();
5、關閉網絡連接;
UDP編程的客戶端一般步驟是:
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt();* 可選
3、綁定IP地址、端口等信息到socket上,用函數bind();* 可選
4、設置對方的IP地址和端口等屬性;
5、發送數據,用函數sendto();
6、關閉網絡連接;