看完這篇TCP,和麪試官扯皮就沒問題了

前記

上週我投遞出了簡歷,崗位是java後端開發工程師。這周騰訊面試官給我進行了面試。面試過程中他問了HTTP與TCP的區別。

無論什麼技術崗位,計算機網絡幾乎是每場面試的必問內容,在面試中出現的次數非常非常多,所以我面試之前也有所準備。看到csdn上介紹HTTP的博客比較多,TCP的比較少,於是今天結合面試問題先詳細講一講TCP

TCP連接管理

這部分之所以放在最前面,因爲太重要!太重要!!太重要了!!!

TCP連接建立:三次握手

  • 第一次握手:建立連接時,客戶端發送syn包(syn=x)到服務器,並進入SYN_SENT狀態,等待服務器確認;SYN:同步序列編號。

  • 第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=x+1),同時自己也發送一個SYN包(syn=y),即SYN+ACK包,此時服務器進入SYN_RECV狀態;

  • 第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=y+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。

在這裏插入圖片描述

TCP連接關閉:四次揮手

  • 第一次揮手:客戶端發出釋放FIN=1,自己序列號seq=u,進入FIN-WAIT-1狀態

  • 第二次揮手:服務器收到客戶端的後,發出ACK=1確認標誌和客戶端的確認號ack=u+1,自己的序列號seq=v,進入CLOSE-WAIT狀態

  • 第三次揮手:客戶端收到服務器確認結果後,進入FIN-WAIT-2狀態。此時服務器發送釋放FIN=1信號,確認標誌ACK=1,確認序號ack=u+1,自己序號seq=w,服務器進入LAST-ACK(最後確認態)

  • 第四次揮手:客戶端收到回覆後,發送確認ACK=1,ack=w+1,自己的seq=u+1,客戶端進入TIME-WAIT(時間等待)。客戶端經過2個最長報文段壽命後,客戶端CLOSE;服務器收到確認後,立刻進入CLOSE狀態
    在這裏插入圖片描述

TCP段結構

在這裏插入圖片描述
在這裏插入圖片描述

  1. 源端口、目標端口:計算機上的進程要和其他進程通信是要通過計算機端口的,而一個計算機端口某個時刻只能被一個進程佔用,所以通過指定源端口和目標端口,就可以知道是哪兩個進程需要通信。源端口、目標端口是用 16 位表示的,可推算計算機的端口個數爲 2^16 個。

  2. 序列號:表示本報文段所發送數據的第一個字節的編號。在 TCP 連接中所傳送的字節流的每一個字節都會按順序編號。由於序列號由 32 位表示,所以每 2^32 個字節,就會出現序列號迴繞,再次從 0 開始。那如何區分兩個相同序列號的不同 TCP 報文段就是一個問題了,後面會有答案,暫時可以不管。

  3. 確認號:表示接收方期望收到發送方下一個報文段的第一個字節數據的編號。也就是告訴發送發:我希望你(指發送方)下次發送的數據的第一個字節數據的編號是這個確認號。也就是告訴發送方:我希望你(指發送方)下次發送給我的 TCP 報文段的序列號字段的值是這個確認號。

  4. TCP 首部長度:由於 TCP 首部包含一個長度可變的選項部分,所以需要這麼一個值來指定這個 TCP 報文段到底有多長。或者可以這麼理解:就是表示 TCP 報文段中數據部分在整個 TCP 報文段中的位置。該字段的單位是 32 位字,即:4 個字節。

  5. URG:表示本報文段中發送的數據是否包含緊急數據。URG=1,表示有緊急數據。後面的緊急指針字段只有當 URG=1 時纔有效。

  6. ACK:表示是否前面的確認號字段是否有效。ACK=1,表示有效。只有當 ACK=1 時,前面的確認號字段纔有效。TCP 規定,連接建立後,ACK 必須爲 1。

  7. PSH:告訴對方收到該報文段後是否應該立即把數據推送給上層。如果爲 1,則表示對方應當立即把數據提交給上層,而不是緩存起來。

  8. RST:只有當 RST=1 時纔有用。如果你收到一個 RST=1 的報文,說明你與主機的連接出現了嚴重錯誤(如主機崩潰),必須釋放連接,然後再重新建立連接。或者說明你上次發送給主機的數據有問題,主機拒絕響應。

  9. SYN:在建立連接時使用,用來同步序號。當 SYN=1,ACK=0 時,表示這是一個請求建立連接的報文段;當 SYN=1,ACK=1 時,表示對方同意建立連接。SYN=1,說明這是一個請求建立連接或同意建立連接的報文。只有在前兩次握手中 SYN 才置爲 1。

  10. FIN:標記數據是否發送完畢。如果 FIN=1,就相當於告訴對方:“我的數據已經發送完畢,你可以釋放連接了”

  11. 窗口大小:表示現在運行對方發送的數據量。也就是告訴對方,從本報文段的確認號開始允許對方發送的數據量。

  12. 校驗和:提供額外的可靠性。具體如何校驗,參考其他資料。

  13. 緊急指針:標記緊急數據在數據字段中的位置。

  14. 選項部分:其最大長度可根據 TCP 首部長度進行推算。TCP 首部長度用 4 位表示,那麼選項部分最長爲:(2^41. 1)*41. 20=40 字節。

TCP可靠數據傳輸

  1. TCP在IP層提供的不可靠服務基礎上實現可靠數據傳輸服務
  • 流水線機制
  • 累積確認機制
  • TCP使用單一重傳計時器(超時和收到重複ACK會觸發重傳)
  1. 快速重傳機制: 在定時器超時之前即進行重傳。如果發生超時,將超時時間間隔加倍。

  2. TCP重傳示例
    在這裏插入圖片描述

TCP流量控制

利用滑動窗口實現流量控制。如果發送方把數據發送得過快,接收方可能會來不及接收,這就會造成數據的丟失。所謂流量控制就是讓發送方的發送速率不要太快,要讓接收方來得及接收。

步驟

  1. 接收方爲TCP連接分配buffer(速度匹配機制)
  2. 接收窗口(RcvWindow) = buffer中的可用空間 = RcvBuffer – [LastByteRcvd – LastByteRead]
  3. Receiver將RcvWindow告知Sender(如果RcvWindow會怎麼樣)
  4. Sender限制自己已經發送的但還沒收到ACK的數據
    在這裏插入圖片描述

TCP擁塞控制

別看放在最後,因爲是壓軸的知識點,很重要!

慢啓動和擁塞避免

慢啓動

慢啓動指先把擁塞窗口cwnd設置爲一個最大報文段MSS的數值,在每收到一個對新的報文段的確認後,把擁塞窗口增加至多一個MSS的數值,在每經過一個往返時間RTT,擁塞窗口wcnd就加倍。

慢啓動的“慢”並不是指cwnd的增長速度慢,而是指在TCP開始發送報文段時先設置cwnd=1,使得發送方在開始時只發送一個報文段(目的是探測一下網絡的擁塞情況)

在這裏插入圖片描述

擁塞避免算法

讓擁塞窗口cwnd緩慢地增大,即每經過一個往返時間RTT就把發送方的擁塞窗口cwnd加1,而不是加倍。

步驟

當cwnd < ssthresh時,使用上述的慢啓動算法;
當cwnd > ssthresh時,停止使用慢啓動算法而改用擁塞避免算法;
當cwnd = ssthresh時,即可使用慢啓動算法,也可以使用擁塞避免算法;
在這裏插入圖片描述

快速重傳和快速恢復

快速恢復

快速重傳算法首先要求接收方每收到一個失序的報文段後就立即發出重複確認(爲的是使發送方及早知道有報文段沒有達到對方)而不要等到自己發送數據時才進行捎帶確認。

快重傳算法規定,發送方只要一連收到3個重複確認就應當立即重傳對方尚未收到的報文段,而不必繼續等待設置的重傳計數器時間到期。

快速重傳

  1. 當發送方連續收到三個重複確認,就執行“乘法減小”算法,把慢開始門限ssthresh減半。這是爲了 預防網絡發生擁塞。請注意:接下去不執行慢開始算法。

  2. 與慢開始不同之處是現在不執行慢開始算法(即擁塞窗口cwnd現在不設置爲1),而是把cwnd值設置爲慢開始門限ssthresh減半後的數值,然後開始執行擁塞避免算法,使擁塞窗口緩慢地線性增大。

參考:http://blog.chinaunix.net/uid-26548237-id-3966297.html

總結

咱們玩歸玩,鬧歸鬧,別拿面試開玩笑。

TCP的知識點多,話題性自然也多。,面試官問的問題往往都是有關聯性的,一旦問到了,大家一定要回答全面,不要丟三落四,回答到點上。TCP的三次握手、四次揮手是最常問的內容,在面試中出現的次數非常非常多,大家面試前要把HTTP、TCP等計算機網絡的基礎打牢。

如果有收穫?希望老鐵們來個三連,點贊、收藏、轉發

創作不易,別忘點個贊,可以讓更多的人看到這篇文章,順便鼓勵我寫出更好的博客

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