面試常問TCP問題回答不上來?一篇深度講解TCP文章看完讓你面試時橫着走

談下你對五層網絡協議體系結構的理解?

應用,主機,網絡,數據,數據單位

  1. 應用層 - 應用間通信協議,不同應用使用不同協議 HTTP,SMTP
  2. 運輸層 - 主機間通信服務,運輸層複用、分用
  3. 網絡層 - 選擇合適 網間路由、交換結點,通過 多鏈路、多通信子網
  4. 數據鏈路層 - 切割報文,讓他在鏈路上 一段段 傳輸
  5. 物理層 - 數據單位是比特,讓比特流運輸無視設備差異

應用層

應用層指的是完成應用進程間的通信的網絡協議。應用層協議定義的是應用進程間的通信和交互規則

對於不同的網絡應用需要不同的應用層協議。如域名系統 DNS,互聯網的 HTTP 協議,郵件的 SMTP 協議等等。

域名系統

域名系統(Domain Name System縮寫DNS,Domain是因特網的一項核心服務,它作爲可以將域名和IP地址相互映射的分佈式數據庫,能夠使人不用去記住能夠被機器直接讀取的IP數串。

HTTP協議

超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最廣泛的網絡協議。所有的 WWW(萬維網) 文件都必須遵守這個標準。設計 HTTP 最初的目的是爲了提供一種發佈和接收 HTML 頁面的方法。(百度百科)

運輸層

運輸層是完成兩臺主機進程之間的通信提供通用的數據傳輸服務通用的是指多種應用可以使用同一個運輸層服務。

由於主機可同時運行多線程,因此運輸層有複用分用的功能。

  • 複用就是指多個應用層進程可同時使用下面運輸層服務
  • 分用是運輸層把收到的信息分別交付上面應用層中的相應進程。

運輸層主要使用以下兩種協議

  1. 傳輸控制協議 TCP(Transmisson Control Protocol)–提供面向連接的,可靠的數據傳輸服務。
  2. 用戶數據協議 UDP(User Datagram Protocol)–提供無連接的,盡最大努力的數據傳輸服務(不保證數據傳輸的可靠性)。

UDP 的主要特點

  • UDP 是無連接的;
  • UDP 使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持複雜的鏈接狀態(這裏面有許多參數);
  • UDP 是面向報文的;
  • UDP 沒有擁塞控制,因此網絡出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如 直播,實時視頻會議等);
  • UDP 支持一對一、一對多、多對一和多對多的交互通信;
  • UDP 的首部開銷小,只有8個字節,比TCP的20個字節的首部要短。

TCP 的主要特點

  • TCP 是面向連接的。(就好像打電話一樣,通話前需要先撥號建立連接,通話結束後要掛機釋放連接);
  • 每一條 TCP 連接只能有兩個端點,每一條TCP連接只能是點對點的(一對一);
  • TCP 提供可靠交付的服務。通過TCP連接傳送的數據,無差錯、不丟失、不重複、並且按序到達;
  • TCP 提供全雙工通信。TCP 允許通信雙方的應用進程在任何時候都能發送數據。TCP 連接的兩端都設有發送緩存和接收緩存,用來臨時存放雙方通信的數據;
  • 面向字節流。TCP 中的“流”(Stream)指的是流入進程或從進程流出的字節序列。“面向字節流”的含義是:雖然應用程序和 TCP 的交互是一次一個數據塊(大小不等),但 TCP 把應用程序交下來的數據僅僅看成是一連串的無結構的字節流。

TCP\UDP的區別

TCP提供可靠的通信傳輸 | UDP則常被用於讓廣播和細節控制交給應用的通信傳輸。


網絡層

主機間通信會經過多鏈路多通信子網。網絡層是選擇合適的網間路由交換結點, 確保數據及時傳送。

在發送數據時,網絡層把運輸層產生的報文段或用戶數據報封裝成分組和包進行傳送。在 TCP / IP 體系結構中,由於網絡層使用 IP 協議,因此分組也叫 IP 數據報,簡稱數據報。

數據鏈路層

數據鏈路層簡稱爲鏈路層。主機通信總是在一段一段的鏈路上傳送的,這就需要使用專門的鏈路層的協議。

傳送數據時,數據鏈路層將數據報文組裝成幀傳輸,每一幀包括數據和必要的控制信息(如:同步信息,地址信息,差錯控制等)。

在接收數據時,控制信息使接收端能夠知道一個幀從哪個比特開始和到哪個比特結束。
數據鏈路層在收到一個幀後,就可從中提出數據部分,上交給網絡層。

控制信息還使接收端能夠檢測到所收到的幀中有無差錯。如果發現差錯,數據鏈路層就簡單地丟棄這個出了差錯的幀,避免浪費網絡資源。

如果需要改正數據在鏈路層傳輸時出現差錯(這就是說,數據鏈路層不僅要檢錯,而且還要糾錯),那麼就要採用可靠性傳輸協議來糾正出現的差錯。這種方法會使鏈路層的協議複雜些。

物理層

在物理層上所傳送的數據單位是比特。
物理層是實現相鄰節點之間比特流的透明傳送,儘可能屏蔽物理設備的差異。“透明傳送比特流”表示經實際電路傳送後的比特流沒有發生變化

TCP 三次握手和四次揮手

TCP 三次握手 - 建立一個連接:

  • 客戶端–發送帶有 SYN 標誌的數據包給服務端 - 一次握手
  • 服務端–發送帶有 SYN/ACK 標誌的數據包給客戶端 – 二次握手
  • 客戶端–發送帶有帶有 ACK 標誌的數據包給服務端 – 三次握手

什麼是半連接隊列?

服務器第一次收到客戶端的 SYN 之後,就會處於 SYN_RCVD 狀態,此時雙方還沒有完全建立其連接,服務器會把此種狀態下請求連接放在一個隊列裏,我們把這種隊列稱之爲半連接隊列。

當然還有一個全連接隊列,就是已經完成三次握手,建立起連接的就會放在全連接隊列中。如果隊列滿了就有可能會出現丟包現象。

這裏在補充一點關於SYN-ACK 重傳次數的問題:
服務器發送完SYN-ACK包,如未收到客戶確認包,服務器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳。如果重傳次數超過系統規定的最大重傳次數,系統將該連接信息從半連接隊列中刪除。
注意,每次重傳等待的時間不一定相同,一般會是指數增長,例如間隔時間爲 1s,2s,4s,8s…

SYN攻擊 - 典型的DDOS攻擊之一

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

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

檢測SYN攻擊的方式非常簡單,即當Server上有大量半連接狀態且源IP地址是隨機的,則可以斷定遭到SYN攻擊了,使用如下命令可以讓之現行:netstat -nap | grep SYN_RECV

ISN(Initial Sequence Number)是固定的嗎?

ISN隨時間而變化,因此每個連接都將具有不同的ISN。ISN可以看作是一個32比特的計數器,每4ms加1 。這樣選擇序號的目的在於防止在網絡中被延遲的分組在以後又被傳送,而導致某個連接的一方對它做錯誤的解釋。
三次握手的其中一個重要功能是客戶端和服務端交換 ISN(Initial Sequence Number),以便讓對方知道接下來接收數據的時候如何按序列號組裝數據。如果 ISN 是固定的,攻擊者很容易猜出後續的確認號,因此 ISN 是動態生成的。

三次握手過程中可以攜帶數據嗎?

第一次、第二次握手不可以攜帶數據.第三次握手的時候,是可以攜帶數據的。
因爲第一次握手可以攜帶數據的話,如果有人要惡意攻擊服務器,那他重複在第一次握手中的 SYN 報文中放入大量的數據,這會讓服務器花費很多時間、內存空間來接收這些報文。

簡單的原因就是會讓服務器更加容易受到攻擊了。而對於第三次的話,此時客戶端已經處於 ESTABLISHED 狀態。對於客戶端來說已經建立起連接了,並且也已經知道服務器的接收、發送能力是正常,能攜帶數據也沒啥毛病

爲什麼要三次握手

三次握手的目的是建立可靠的通信信道,說到通訊,簡單來說就是數據的發送與接收,而三次握手最主要的目的就是雙方確認自己與對方的發送與接收是正常的。

  • 第一次握手:Client 什麼都不能確認;Server 確認了對方發送正常
  • 第二次握手:Client 確認了:自己發送、接收正常,對方發送、接收正常;Server 確認了:自己接收正常,對方發送正常
  • 第三次握手:Client 確認了:自己發送、接收正常,對方發送、接收正常;Server 確認了:自己發送、接收正常,對方發送接收正常

所以三次握手就能確認雙發收發功能都正常,缺一不可。

爲什麼要傳回 SYN

接收端傳回發送端所發送的 SYN 是爲了告訴發送端,我接收到的信息確實就是你所發送的信號了。

傳了 SYN,爲啥還要傳 ACK

雙方通信無誤必須是兩者互相發送信息都無誤。傳了 SYN,證明發送方到接收方的通道沒有問題,但是接收方到發送方的通道還需要 ACK 信號來進行驗證。

爲什麼不需要四次握手 -

完全可靠的通信協議是不存在的。在經過三次握手之後,客戶端和服務端已經可以確認之前的通信狀況,都收到了確認信息。所以即便再增加握手次數也不能保證後面的通信完全可靠,所以是沒有必要的。

TCP 四次揮手 - 斷開一個連接:

  • 客戶端-發送一個 FIN,用來關閉客戶端到服務器的數據傳送
  • 服務器-收到這個 FIN,它發回一 個 ACK,確認序號爲收到的序號加1 。和 SYN 一樣,一個 FIN 將佔用一個序號
  • 服務器-關閉與客戶端的連接,發送一個FIN給客戶端
  • 客戶端-發回 ACK 報文確認,並將確認序號設置爲收到序號加1

爲什麼要四次揮手

ACK報文是用來應答的,SYN報文是用來同步的。
當服務端收到FIN報文時,並不會立即關閉SOCKET,只能先回復一個ACK報文,告訴客戶端,“你發的FIN報文我收到了”。只有等到我服務端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四次揮手。

2MSL等待狀態

TIME_WAIT狀態也成爲2MSL等待狀態。每個具體TCP實現必須選擇一個報文段最大生存時間MSL(Maximum Segment Lifetime),它是任何報文段被丟棄前在網絡內的最長時間。這個時間是有限的,因爲TCP報文段以IP數據報在網絡內傳輸,而IP數據報則有限制其生存時間的TTL字段。

四次揮手釋放連接時,等待2MSL的意義?

爲了保證客戶端發送的最後一個ACK報文段能夠到達服務器。因爲這個ACK有可能丟失,從而導致處在LAST-ACK狀態的服務器收不到對FIN-ACK的確認報文。服務器會超時重傳這個FIN-ACK,接着客戶端再重傳一次確認,重新啓動時間等待計時器。最後客戶端和服務器都能正常的關閉。

假設客戶端不等待2MSL,而是在發送完ACK之後直接釋放關閉,一但這個ACK丟失的話,服務器就無法正常的進入關閉連接狀態。

爲什麼TIME_WAIT狀態需要經過2MSL才能返回到CLOSE狀態?

理論上,四個報文都發送完畢,就可以直接進入CLOSE狀態了,但是可能網絡是不可靠的,有可能最後一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。

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