什麼是tcp/ip協議?UDP與TCP如何選擇?

大家好,

今天給大家分享一下

什麼是tcp/ip協議?TCP的三次握手指的是什麼,爲什麼一定要三次握手,而不是四次或者是兩次?

 

1.背景介紹

先介紹下背景

TCP/IP是什麼?

TCP/IP不是一個協議,而是一個協議族的統稱。裏面包括了IP協議,IMCP協議,TCP協議等等。同時是Internet最基本的協議、Internet國際互聯網絡的基礎,由網絡層的IP協議和傳輸層的TCP協議組成。 TCP/IP 定義了電子設備如何連入因特網,以及數據如何在它們之間傳輸的標準。協議採用了4層的層級結構,每一層都呼叫它的下一層所提供的協議來完成自己的需求。

 

2.知識剖析

先來看看今天的主角

TCP/IP協議的四層結構

請看圖例

OSI七層參考模型TCP/IP四層的關係:

什麼是tcp/ip協議?UDP與TCP如何選擇?

 

數據包說明:

IP層傳輸單位是IP分組,屬於點到點的傳輸;TCP層傳輸單位是TCP報文段,屬於端到端的傳輸

什麼是tcp/ip協議?UDP與TCP如何選擇?

 

第一層:鏈路層

包括操作系統中的設備驅動程序、計算機中對應的網絡接口卡

 

第二層:網絡層

網絡互連層是整個TCP/IP協議棧的核心。它的功能是把分組發往目標網絡或主機。同時,爲了儘快地發送分組,可能需要沿不同的路徑同時進行分組傳遞。因此,分組到達的順序和發送的順序可能不同,這就需要上層必須對分組進行排序。     網絡互連層定義了分組格式和協議,即IP協議(Internet Protocol)。  

特別注意:此時的IP包是不安全的,IP協議不會管送沒送到

 

第三層:傳輸層

在TCP/IP模型中,傳輸層的功能是使遠端主機和目標端主機上的對等實體可以進行會話。在傳輸層定義了兩種服務質量不同的協議。即:傳輸控制協議TCP和用戶

 

分享一個在騰訊課堂上tcp/ip的訓練營的課程。
詳情講解了工作中 TCP、IP遇到的7大問題:
1. 滑動窗口如何實現?
2. sk_buff是什麼?
3. TCP_NODELAY設置,抓包後是N個包?
4. Epoll 檢測網絡IO,水平觸發與邊沿觸發如何判斷?
5. 出現大量的close_wait如何解決?
6. DDOS?
7. UDP廣播?

 需要了解的朋友可以加入到羣裏一起探討技術交流

數據報協議UDP.

TCP協議是一個面向連接的、可靠的協議。它將一臺主機發出的字節流無差錯地發往互聯網上的其他主機。在發送端, 它負責把上層傳送下來的字節流分成報文段並傳遞給下層。在接收端,它負責把收到的報文進行重組後遞交給上層。 TCP協議還要處理端到端的流量控制,以避免緩慢接收的接收方沒有足夠的緩衝區接收發送方發送的大量數據.

UDP協議是一個不可靠的、無連接協議,主要適用於不需要對報文進行排序和流量控制的場合。

 

第四層:應用層

TCP/IP模型將OSI參考模型中的會話層和表示層的功能合併到應用層實現。這一層主要的代表有DNS域名解析/http協議

運輸層: tcp/udp

 

UDP特點

1.面向無連接。發送數據前不需要建立連接

2.盡最大努力交付。即不保證可靠交付

3. 面向報文。對於應用層交下來的報文,既不合並也不拆分,添加首部後直接交付給IP層

4.沒有擁塞控制,網絡出現擁塞不會使原主機發送速率降低,這對於某些實時應用是很重要的。tcp在網絡擁塞時,依靠滑動窗口機制可以告訴發送方減緩發送速率

5.首部開銷小,只有八個字節,比tcp的20個字節要短(20-60).

 

首部格式

利用首部格式可以較好的理解協議

什麼是tcp/ip協議?UDP與TCP如何選擇?

 

TCP主要特點

1.面向面向連接的運輸層協議。應用程序在使用tcp協議之前,要先建立tcp連接,數據傳輸完畢後,也要釋放連接。

應用程序間的通信像是,通話前要先撥號建立連接,通話結束後要掛機釋放連接。

2. 提供可靠交付。無差錯,不丟失,不重複,並按序到達。

3.採用全雙工通信。通信雙方在任何時候都可以發送和接受數據,且通信雙方都設有發送緩存和接受緩存,用來臨時存放雙向通信的數據。

4.面向字節流。應用程序交下來的是數據塊,但tcp把他們看成是無結構無意義的字節流

 

首部格式

利用首部格式可以較好的理解協議

什麼是tcp/ip協議?UDP與TCP如何選擇?

 

3.常見問題

如何建立TCP/IP連接

到達目標地址的IP包如何檢驗完整性

 

4.解決方案

 

建立TCP/IP的過程就是要講的三次握手。

即三次握手就是爲了解決連接的問題

建立一個TCP連接時,需要客戶端和服務端總共發送3個包以確認連接的建立。

 

(1)第一次握手:Client將標誌位SYN置爲1,隨機產生一個值seq=J,並將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。

(2)第二次握手:Server收到數據包後由標誌位SYN=1知道Client請求建立連接,Server將標誌位SYN和ACK都置爲1,ack=J+1,隨機產生一個值seq=K,並將該數據包發送給Client以確認連接請求,Server進入SYN_RCVD狀態。

(3)第三次握手:Client收到確認後,檢查ack是否爲J+1,ACK是否爲1,如果正確則將標誌位ACK置爲1,ack=K+1,並將該數據包發送給Server,Server檢查ack是否爲K+1,ACK是否爲1,如果正確則連接建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client與Server之間可以開始傳輸數據了。

IP包有固定的報文格式,報頭有所需要參數

如:源端口、目標端口、確認序號和標誌域等。

 

5.擴展思考

當短時間大量不存在的IP不斷髮送SYN包會出現什麼情況

在三次握手過程中,Server發送SYN-ACK之後,收到Client的ACK之前的TCP連接稱爲半連接(half-open connect),此時Server處於SYN_RCVD狀態,當收到ACK後,Server轉入ESTABLISHED狀態。

Client在短時間內僞造大量不存在的IP地址,並向Server不斷地發送SYN包,Server回覆確認包,並等待Client的確認,由於源地址是不存在的,因此,Server需要不斷重發直至超時,這些僞造的SYN包將長時間佔用未連接隊列,導致正常的SYN請求因爲隊列滿而被丟棄,從而引起網絡堵塞甚至系統癱瘓。

SYN攻擊是一種典型的DDOS攻擊,檢測SYN攻擊的方式非常簡單,即當Server上有大量半連接狀態且源IP地址是隨機的,則可以斷定遭到SYN攻擊了

 

6.更多討論

1.爲什麼一定要三次握手

當A想要建立連接時發送一個SYN,然後等待ACK,結果這個SYN因爲網絡問題沒有及時到達B, 所以A在一段時間內沒收到ACK後,再發送一個SYN,這次B順利收到,接着A也收到ACK,這時A發送的第一個SYN終於到了B, 對於B來說這是一個新連接請求,然後B又爲這個連接申請資源,返回ACK,然而這個SYN是個無效的請求,A收到這個SYN的ACK後也並不會理會它, 而B卻不知道,B會一直爲這個連接維持着資源,造成資源的浪費。

兩次握手的問題在於服務器端不知道一個SYN是否是無效的,而三次握手機制因爲客戶端會給服務器回覆第二次握手, 也意味着服務器會等待客戶端的第三次握手,如果第三次握手遲遲不來,服務器便會認爲這個SYN是無效的,釋放相關資源。 但這時有個問題就是客戶端完成第二次握手便認爲連接已建立,而第三次握手可能在傳輸中丟失,服務端會認爲連接是無效的, 這時如果Client端向Server寫數據,Server端將以RST包響應,這時便感知到Server的錯誤。

總之,三次握手可以保證任何一次握手的失敗都是可感知的,不會浪費資源

2.UDP作爲不可靠的協議,是否一無是處?

udp也有它的用途,在某些對實時性要求較高的場景下,比如ip電話,某些即時戰略遊戲,視頻直播等。

 

3.關於tcp的流量控制和擁塞控制實現?

這個比較複雜,但其實是基於滑動窗口實現的,接收方可以通知自己可用窗口的大小來讓發送方調整發送速率等。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章