TCP三次握手與四次揮手面試回答版本

面試官:說一下TCP三次握手的過程

參考面試回答:

  • 在第一次握手的時候、客戶端會隨機生成初始化序號、放到TCP報文頭部的序號字段中、同時把SYN標志設置為1 這樣就表示SYN報文(這里是請求報文)。客戶端將報文放入 TCP 報文首部的序列號字段中。接著把這個SYN報文發送給服務端、之后客戶端處于SYN_SENT狀態。這是第一次握手。

  • 然后第二次握手的時候:服務端收到SYN報文后、首先服務端也會隨機生成初始化序號、放到TCP報文頭部的序號字段中、然后對客戶端的初始化序號+1作為確認號、放到TCP報文頭部的確認應答字段中、并將SYN和ACK標志設置為1,這樣就表示SYN-ACK報文、然后把該報文發給客戶端、之后服務端處于SYN_RCVD狀態。這是第二次握手

  • 最后來到第三次握手的過程:客戶端收到服務端SYN-ACK報文后:客戶端會回一個ACK確認報文、該報文的確認號是服務端的初始化序號+1、并且ACK標志會設置為1。表示這是一個確認報文。這是第三次握手

  • 之后客戶端處于ESTABLISHED狀態。

  • 服務端收到ACK確認報文后、服務端也進入處于ESTABLISHED狀態。以上就是TCP三次握手的過程。

客戶端                            服務器|                                ||  SYN  ---------------------->  ||                                |SYN_SENT                           ||                                ||  <------ SYN-ACK  ------------  ||                                ||  ACK  ---------------------->  ||                                |ESTABLISHED                       ESTABLISHED

為什么需要三次握手 兩次不行嗎

  • 分析:面試的時候、最好說出兩個原因,并且要解釋一下為什么2次握手就不行。把面試官當做小白、講到他理解這個問題的原因。

  • 分析回答:

    • 我的理解主要有兩個原因:

      • 第一個原因是、三次握手可以有效防止歷史連接的建立、避免資源浪費。假設網絡中殘留一個序號為90的SYN報文、現在客戶端向服務端發起了建立連接的請求、發送了一個序號為100的SYN報文、如果這時候服務端先收到的是序號為90的SYN報文、就代表收到了歷史連接、這時候服務端會回復確認號為90+1的SYN-ACK報文、客戶端收到后、發現其實自己期望收到的確認號是100+1、而不是90+1、所以會斷開連接、并且回RST給服務端、服務端收到RST也就會斷開連接了、這樣就避免了歷史連接的建立。

      • 如果使用兩次握手、服務器收到客戶端的SYN報文后會立即建立連接。但服務器無法區分該SYN報文是新的連接請求、還是延遲到達的歷史報文、如果收到的是歷史SYN報文、服務器也會誤以為是新的連接請求、并分配資源建立連接、造成資源浪費。這會導致服務器為無效的歷史連接分配資源、造成浪費。

      • 如果是三次握手

      • 由于客戶端收到的確認號是 91、與期望的 101 不符、客戶端意識到這是一個歷史連接的響應

      • 客戶端發送一個 RST 報文給服務器、告訴服務、這是一個錯誤的連接、請斷開

      • 服務器收到 RST 報文后、會斷開連接、釋放資源。

  • 第二個原因是、三次握手可以確認客戶端和服務端是否同時具備發送和接收的能力。第一次握手代表客戶端具有發送能力、當服務端收到第一次握手并且響應了第二次握手、實際上這里就證明了服務端具有發送和接收的能力。客戶端收到了第二次握手、然后響應了第三次握手、才代表客戶端有接收的能力。如果是兩次握手的話、只能證明服務端具有發送和接收能力、以及客戶端的發送能力、但是無法證明客戶端具有接收的能力。

  • 三次握手的意義:

    • 第一次握手 (SYN): 客戶端發送 SYN 報文、表明客戶端具有 發送 能力。

    • 第二次握手 (SYN-ACK): 服務器收到 SYN 報文并回復 SYN-ACK 報文、表明服務器具有 接收發送 能力。

    • 第三次握手 (ACK): 客戶端收到 SYN-ACK 報文并回復 ACK 報文、表明客戶端具有 接收 能力。

    • 通過三次握手可以確保客戶端和服務端都具備雙向通信的能力。

  • 兩次握手的缺陷: 兩次握手只能確認服務器的發送和接收能力、以及客戶端的發送能力、但無法確認客戶端的接收能力。

  • 以上就是我覺得TCP需要三次握手的原因。

參考面試回答:

我的理解主要有兩個原因:

1.防止歷史連接的建立、避免資源浪費

三次握手可以有效防止歷史連接的建立、避免服務器為過期的連接分配資源。

在沒有三次握手的情況下、服務器無法區分是新的連接請求還是之前連接的殘留報文。

如果客戶端發送了一個連接請求、服務器無法判斷它是否是一個新的連接、可能會誤以為這是一個有效的請求、進而分配資源。

但如果連接請求是歷史報文、那么服務器響應客戶端時、也就是客戶端收到第二次握手的時候、客戶端會發現確認號與預期不符、并會主動終止連接、發送 RST 報文通知服務器。這里也就是第三次握手的過程會發送一個RST重置報文給服務器。服務器收到 RST 報文后、會斷開連接并釋放資源。這樣可以避免無效連接占用資源。

2.確保雙方都具備發送和接收的能力

第二個原因是:三次握手可以確認客戶端和服務端是否同時具備發送和接收的能力。第一次握手代表客戶端具有發送能力、當服務端收到第一次握手并且響應了第二次握手、實際上這里就證明了服務端具有發送和接收的能力。客戶端收到了第二次握手、然后響應了第三次握手、才代表客戶端有接收的能力。如果是兩次握手的話、只能證明服務端具有發送和接收能力、以及客戶端的發送能力、但是無法證明客戶端具有接收的能力。

介紹一下TCP四次揮手

分析:

  • 問題:TCP四次揮手的過程

  • 客戶端FIN->服務端ACK ->服務端FIN ->客戶端ACK

  • 分析:要把每個階段的TCP狀態說出來。雙方都都可以主動斷開連接,下圖是客戶端主動斷開連接的過程:

    • 客戶端打算關閉連接、此時會發送一個FIN報文、之后客戶端進入FIN_WAIT_1狀態。

    • 服務端收到FIN報文后、就向客戶端發送ACK應答報文、接著服務端進入CLOSE_WAIT狀態。

    • 客戶端收到服務端的ACK應答報文后、之后進入FIN_WAIT_2狀態。

    • 等待服務端處理完數據后、也向客戶端發送FIN報文、之后服務端進入LAST_ACK狀態。

    • 客戶端收到服務端的FIN報文后、回一個ACK應答報文、之后進入TIME_WAIT狀態。

    • 服務端收到了ACK應答報文后、就進入了CLOSE狀態、至此服務端已經完成連接的關閉。

    • 客戶端在TIME_WAIT狀態經過2MSL一段時間后、自動進入CLOSE狀態、至此客戶端也完成連接的關閉。

  • 總結:以上就是四次揮手的過程、每個方向都需要一個FIN和一個ACK、因此通常被稱為四次揮手。

參考面試回答:

  1. 第一次揮手:客戶端打算關閉連接、此時會發送一個FIN報文、用來關閉客戶端到服務端的數據傳送、并進入FIN_WAIT_1狀態。 FIN報文會攜帶一個序列號。

  2. 第二次揮手: 服務端收到FIN報文后、就向客戶端發送ACK應答報文、確認收到了客戶端的關閉請求。 ACK報文會攜帶確認序列號、表示服務端已經正確接收了客戶端發送的FIN報文。 服務端進入CLOSE_WAIT狀態。

  3. 客戶端收到服務端的ACK應答報文后、進入FIN_WAIT_2狀態、等待服務端發送FIN報文。此時、客戶端到服務端的連接已經釋放、客戶端不再發送數據、但服務端仍然可以向客戶端發送數據。

  4. 第三次揮手: 等服務端處理完數據后、也向客戶端發送FIN報文、用來關閉服務端到客戶端的數據傳送、并進入LAST_ACK狀態。

  5. 第四次揮手: 客戶端收到服務端的FIN報文后、回一個ACK應答報文、確認收到了服務端的關閉請求。 客戶端進入TIME_WAIT狀態。

  6. 服務端收到了ACK應答報文后、就進入了CLOSE狀態、至此服務端已經完成連接的關閉。

  7. 客戶端在TIME_WAIT狀態經過2MSL(Maximum Segment Lifetime)一段時間后、自動進入CLOSE狀態、至此客戶端也完成連接的關閉。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902506.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902506.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902506.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AIGC產品如何平衡用戶體驗與內容安全?

當ChatGPT能寫詩、Sora會拍電影、AI主播24小時帶貨時&#xff0c;一場關于“AI說什么”的隱形戰爭&#xff0c;正在算法與監管的夾縫中悄然爆發。 從DeepSeek的沖擊到多模態技術的祛魅&#xff0c;AIGC正在重塑內容創作的邊界。但同時&#xff0c;諸多質疑也正在發聲&#xff…

安卓垂直進度條

package 你的包名;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.util.AttributeSet; import android.view.MotionEvent; import android…

hackmyvm-airbind

收集信息 arp-scan -l nmap -sS -v 192.168.195.162 訪問掃描到的ip&#xff0c;直接跳轉到登錄頁面&#xff0c;利用admin/admin弱口令登錄 在settings.php中找到一處文件上傳&#xff0c;上傳一句話木馬&#xff0c;上傳成功 反彈shell 上傳php-reverse-shell.php 抓包&am…

【Rust 精進之路之第14篇-結構體 Struct】定義、實例化與方法:封裝數據與行為

系列: Rust 精進之路:構建可靠、高效軟件的底層邏輯 作者: 碼覺客 發布日期: 2025-04-20 引言:超越元組,給數據賦予意義 在之前的學習中,我們了解了 Rust 的基本數據類型(標量)以及兩種基礎的復合類型:元組 (Tuple) 和數組 (Array)。元組允許我們將不同類型的值組合…

jenkins尾隨命令

在訪問jenkins的網址后面可以追加命令&#xff0c;比如訪問地址是 http://10.20.0.124:8080/&#xff0c;常用的有以下幾種方式&#xff1a; 1.關閉Jenkins 只要瀏覽器輸入http://10.20.0.124:8080/exit即可退出&#xff0c;或者http://localhost:8080/exit 2.重啟Jenkins …

相機模型--CMOS和CCD的區別

1--CMOS和CCD的工作原理 CCD&#xff08;Charge Coupled Device&#xff0c;電荷耦合器件&#xff09;&#xff1a; 1. 圖像通過光電效應在感光單元中轉化為電荷&#xff1b; 2. 每個像素上的電荷被依次“耦合”并傳輸到芯片的角落&#xff0c;通過一個或幾個模擬輸出放大器輸…

二叉樹理論基礎

二叉樹種類 滿二叉樹&#xff1a;每個非葉子節點都有且只有兩個子節點。 和完全二叉樹&#xff1a;除了最底層外&#xff0c;其他各層都是滿的&#xff1b;最底層的節點都集中在左側。 二叉搜索樹&#xff1a;對于任意節點 u&#xff0c;左子樹上所有節 點的值都小于 u.val…

使用ZYNQ芯片和LVGL框架實現用戶高刷新UI設計系列教程(第九講)

這一期講解GUI_guider中的容器控件的使用以及相關函數&#xff0c;容器本質上是具有布局和自動調整大小功能的基本對象 &#xff0c;通常用來裝載其他子控件。 打開上一期的項目&#xff0c;在工具欄中選中容器控件拖拽到界面中&#xff0c;具體如圖所示&#xff1a; 容器默認…

qt QGroupButton 實現兩個QPushButton的互斥

import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QButtonGroup, QVBoxLayoutclass ExampleApp(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 創建兩個 QPushButtonself.button1 QPushButton("按鈕1&quo…

工業物聯網的可視化編程革新:Node-RED與邊緣計算的深度融合-縱橫智控

在工業物聯網的演進歷程中&#xff0c;可視化編程工具正成為打破技術壁壘的核心力量。Node-RED作為開源的可視化編程平臺&#xff0c;通過其獨特的拖拽式邏輯構建能力&#xff0c;為設備連接、數據處理與業務邏輯設計提供了全新范式。本文將深入解析Node-RED的技術優勢&#xf…

Uniapp:view容器(容器布局)

目錄 一、基本概述二、屬性說明三、常用布局3.1 橫向布局3.2 縱向布局3.3 更多布局3.3.1 縱向布局-自動寬度3.3.2 縱向布局-固定寬度3.3.3 橫向布局-自動寬度3.3.4 橫向布局-居中3.3.5 橫向布局-居右3.3.6 橫向布局-平均分布3.3.7 橫向布局-兩端對齊3.3.8 橫向布局-自動填充3.3…

(最新)華為 2026 屆校招實習-硬件技術工程師-硬件通用/單板開發—機試題—(共14套)(每套四十題)

&#xff08;最新&#xff09;華為 2026 屆校招實習-硬件技術工程師-硬件通用/單板開發—機試題—&#xff08;共14套&#xff09;&#xff08;每套四十題&#xff09; 本套題目為硬件通用題目&#xff0c;適合多個崗位方向&#xff0c;如下 **崗位——硬件技術工程師 崗位意向…

AWS Lambda 架構深入探究

AWS Lambda 是現代云架構中最受歡迎的服務之一,因其能夠在完全托管的無服務器環境中運行代碼而廣受認可。然而,盡管 Lambda 廣受歡迎,許多開發者和架構師對它的底層運作機制卻知之甚少,常常將其視為“編寫能夠在云端神奇運行的代碼”的簡單方法。 本文將探討 AWS Lambda 背…

Android audio系統五 AudioPolicy 策略配置詳解

引用&#xff1a;Android 音頻策略配置文件解析流程 audio_policy_configuration.xml 是 Android 音頻系統的核心配置文件&#xff0c;它定義了音頻硬件接口、設備路由和基本策略。下面我將詳細介紹這個文件的結構、關鍵配置項和實際應用。audio_policy_configuration.xml 是 …

4.21日學習--引用

引用本質&#xff1a;引用的本質在 c 內部實現是一個指針常量。 代碼中 int& ref a; 可以理解為 int* const ref &a;&#xff08;指針常量&#xff09;。 指針常量&#xff1a;指針指向不可變&#xff08;綁定 a 后&#xff0c;不能再指向其他變量&#xff09;&…

2.1 數據處理

1. 數據獲取方法 掌握公開數據集的使用、數據質量評估指標、了解常見的網絡爬蟲技術 &#x1f9e9; 一、公開數據集的使用 ? 常見平臺&#xff08;一定要熟&#xff09; 平臺簡介示例數據集Hugging Face Datasets專注 NLP、CV 領域的大模型訓練數據集庫IMDB、SQuAD、Common …

Qt QWidget和QML實現窗口拖動源碼分享

一、QWidget實現窗口拖動 .hpp QPoint pressedPoint; bool leftBtnPressed false;.cpp bool PetWidget::eventFilter(QObject *obj, QEvent *event) {if(obj this){if(event->type() QEvent::MouseButtonPress){QMouseEvent* e static_cast<QMouseEvent *>(event)…

在pycharm中搭建yolo11分類檢測系統--PyQt5學習(二)

第二部分 測試本地pycharm通過程序連接遠程服務器autodl 模型的推理需要借助遠程服務器autodl&#xff0c;但是界面的運行是在pycharm中&#xff0c;我的設想是按鈕調用一個py文件就好了。 1. 本地運行PyQt5界面。 2. 當需要載入權重時&#xff0c;通過SSH連接到AutodL服務…

前端框架的“快閃“時代:我們該如何應對技術迭代的洪流?

引言&#xff1a;前端開發者的"框架疲勞" “上周剛學完Vue 3的組合式API&#xff0c;這周SolidJS又火了&#xff1f;”——這恐怕是許多前端開發者2023年的真實心聲。前端框架的迭代速度已經達到了令人目眩的程度&#xff0c;GitHub每日都有新框架誕生&#xff0c;n…

基于YOLO11的遛狗牽繩識別預警系統

基于YOLO11的遛狗牽繩識別預警系統 【包含內容】 【一】項目提供完整源代碼及詳細注釋 【二】系統設計思路與實現說明 【三】預訓練模型與數據集說明 【四】需要列出所有的類別&#xff0c;并且加入識別的類別數量&#xff1a;4類 0: dog (狗) 1: leash (牽引繩) 2: person …