【每日八股】復習計算機網絡 Day3:TCP 協議的其他相關問題

文章目錄

  • 昨日內容復習
    • TCP 的四次揮手?
    • TCP 為什么要四次揮手?
    • 在客戶端處于 FIN_WAIT_2 狀態時,如果此時收到了亂序的來自服務端的 FIN 報文,客戶端會如何處理?何時進入 TIME_WAIT 狀態?
    • TCP 四次揮手丟了怎么辦?
    • TCP 的延遲應答和累積應答?
    • TCP 會出現三次揮手嗎?
    • TCP 的 MSL?
  • 復習計算機網絡 Day3:TCP 協議的其他相關問題
    • 已經建立了 TCP 連接,客戶端突然出現故障了怎么辦?
    • 什么時候用長連接,什么時候用短連接?
    • TCP 的半連接隊列和全連接隊列?
    • 什么是 SYN 攻擊?如何避免?
    • TIME_WAIT 的作用?過多如何解決?
    • TIME_WAIT 為什么要經過 2MSL?
    • CLOSED_WAIT 過多如何解決?

昨日內容復習

TCP 的四次揮手?

TCP 的四次揮手過程可以總結如下,為了方便描述,我們將客戶端認定為主動關閉方,將服務端認定為被動關閉方:

  • 第一次揮手:客戶端發送 FIN 置位的報文到服務端,并從 ESTABLISED 狀態進入 FIN_WAIT_1 狀態,此時客戶端為半關閉狀態,客戶端仍然可以接收數據,但是不會再發送數據;
  • 第二次揮手:服務端接收到客戶端的 FIN 報文后,發送 ACK 報文對 FIN 報文進行確認,同時進入 CLOSED_WAIT 狀態,再次期間服務端將繼續處理應用層還沒有發送完的數據。客戶端收到 ACK 后進入 FIN_WAIT_2 狀態;
  • 第三次揮手:服務端處理好數據后,發送 FIN 報文,隨后進入 LAST_ACK 狀態;
  • 第四次揮手:客戶端接收到來自服務端的 FIN 報文后,進入 TIME_WAIT 狀態,等待 2MSL 時間后客戶端關閉。服務端收到 ACK 報文后立即關閉。

TCP 為什么要四次揮手?

TCP 進行四次揮手而不是三次揮手的原因是服務端可能在收到客戶端的 FIN 后仍然有數據要發送,因此服務端確認客戶端發來的 FIN 報文的 ACK 報文與服務端發送給客戶端的 FIN 報文在有數據沒有處理完的情況下不能合并,因此 TCP 需要四次揮手。

當然,需要注意的是,TCP 可以三次揮手,當服務端沒有數據發送給客戶端時,服務端將 ACK 與 FIN 合并,發送 FIN-ACK 報文。

在客戶端處于 FIN_WAIT_2 狀態時,如果此時收到了亂序的來自服務端的 FIN 報文,客戶端會如何處理?何時進入 TIME_WAIT 狀態?

如果客戶端收到了亂序的來自服務端的 FIN 報文,會將其存入緩沖區,等待服務端的其他數據到達,一并放入緩沖區。當客戶端接收不到數據時,按順序比對報文的序列號,如果 FIN 報文的序列號順序且合法,則將其視為正確的 FIN 報文,回發 ACK 報文并進入 TIME_WAIT 狀態;否則丟棄 FIN 報文,等待正確的 FIN 報文。

TCP 四次揮手丟了怎么辦?

  • 第一次揮手丟失:客戶端發送給服務端的 FIN 報文丟失,此時客戶端收不到來自服務端的 ACK 報文,觸發超時重傳;
  • 第二次揮手丟失:服務端確認客戶端的 FIN 報文的 ACK 報文丟失,此時客戶端會認為自己的 FIN 報文丟失,客戶端觸發超時重傳;
  • 第三次揮手丟失:客戶端沒有收到服務端的 FIN 報文,此時客戶端處于 FIN_WAIT_2 狀態,不會給服務端發送 ACK 報文,因此服務端會觸發超時重傳,重新發送 FIN 報文;
  • 第四次揮手丟失:服務端沒有收到客戶端的 ACK 報文,此時服務端會重新發送 FIN 報文給客戶端。客戶端發送 ACK 之后進入 2MSL 的 TIME_WAIT 狀態,當再次收到 FIN 報文后,會重置 2MSL 計時器,并再次發送 ACK 報文。如果客戶端此時已經到達 2MSL 并關閉,那么服務端會在超時重傳最大次數上限后關閉連接。

TCP 的延遲應答和累積應答?

  • 延遲應答:TCP 不會立即發送 ACK 應答接收到的報文,而是積累一定的數據后,與 ACK 報文一并發送;
  • 累積應答:TCP 頭部當中的確認號表示的是發送報文的一方期望下一次收到的序列號,說明該序列號之前的字節已經全部收到,這就是累積應答。

TCP 會出現三次揮手嗎?

會,當被動關閉方收到主動關閉方 FIN 報文后,沒有數據要發送時,將 ACK 和 FIN 合并發送,此時就出現了三次揮手。

TCP 的 MSL?

指的是報文的最長生命周期,即報文在網絡中被丟棄之前的最長生存時間。TCP 報文被包裹在 IP 數據報中,IP 數據報的報頭有 TTL 字段。

復習計算機網絡 Day3:TCP 協議的其他相關問題

在這里插入圖片描述

已經建立了 TCP 連接,客戶端突然出現故障了怎么辦?

TCP 存在保活計時器,如果客戶端發生故障,服務端不會一直等待。計時器通常設置為兩個小時,每當客戶端有消息發送過來,服務端都會重置計時器。超時之后,服務端每隔一定的時間周期(75 s)向客戶端發送探測報文,如果連續十次都沒有回復,服務端會認為客戶端發生故障,斷開連接。

什么時候用長連接,什么時候用短連接?

長連接多用于操作頻繁的點對點通訊,而且連接數不能太多。例如,數據庫的連接就是長連接。

Web 網站的 HTTP 服務一般使用短連接,短連接可以快速釋放資源。

TCP 的半連接隊列和全連接隊列?

半連接隊列:也稱 SYN 隊列。服務端收到客戶端的 SYN 請求連接報文后,內核會把該連接存儲到半連接隊列中,并向客戶端發送 SYN-ACK 報文。換句話說,半連接隊列(SYN 隊列)存儲的就是已經向服務端發起了連接請求但是還沒有完成連接建立的客戶端。

全連接隊列:也稱 ACCEPT 隊列。服務端收到第三次握手客戶端發送的 ACK 報文后,內核就會把該客戶端從 SYN 隊列中移除,并轉入到 ACCEPT 隊列。

什么是 SYN 攻擊?如何避免?

SYN 攻擊指的是惡意攻擊方通過合法手段不斷向服務端發送 SYN 報文,從而使得合法用戶無法得到服務響應。當大量的 SYN 請求到來時,服務端會進入 SYN_RECV 狀態,將連接加入到 SYN 隊列并分配進程控制塊,同時回發 SYN-ACK 報文,當服務端等不到 ACK 報文時,還會不斷觸發超時重傳重新發送 SYN-ACK 報文,最終導致服務端資源耗盡。

解決辦法

  • Cache:收到 SYN 報文后使用 Hash 表保存 SYN 報文的信息,發送 SYN-ACK 后,收到 ACK 才為該連接分配 TCB,節省資源;
  • Cookie:服務端收到 SYN 報文后,不直接分配資源,而是通過加密算法生成一個 SYN Cookie 作為初始序列號。只有收到客戶端發送的合法的 ACK 后才分配連接資源。
  • Proxy 防火墻:設立中間層防火墻,確認連接有效后,才向內部服務器發送 SYN 請求。
  • 減少 SYN-ACK 重傳次數;
  • 監視半連接隊列和全連接隊列當中的無效連接;
  • 增大半連接隊列的數量;

TIME_WAIT 的作用?過多如何解決?

TCP 常用的三種狀態:ESTABLISHED 表示連接建立,CLOSED_WAIT 表示被動關閉,TIME_WAIT 表示主動關閉。

TIME_WAIT 的作用

  • 確保主動關閉方發送的最后一個 ACK 到達被動關閉方:主動關閉方在接收到 FIN 報文后,發送 ACK 予以確認,并進入 2MSL 的 TIME_WAIT 狀態。如果這個 ACK 丟失,那么被動關閉方會重發 FIN,主動關閉方收到后會重發 ACK。如果沒有 TIME_WAIT,那么被動關閉方在沒有收到 ACK 之后,會不斷觸發超時重傳重新發送 FIN 報文,導致資源的消耗。
  • 避免舊連接的延遲報文干擾新的連接:TCP 連接通過四元組唯一標識。如果舊的連接中存在由于網絡阻塞而沒有到達對端的報文,則接收方會誤認為這些報文是新的連接發送的,導致數據錯亂。舊的連接等待 2MSL 再關閉可以確保舊的報文在網絡中全部消亡;
  • 確保全雙工通道的可靠關閉:TCP 是全雙工協議,雙方都需要關閉自己的連接。TIME_WAIT 可以確保雙方都能完成關閉流程,即使主動關閉方發送給被動關閉方的 ACK 丟失,由于主動方處于 TIME_WAIT,仍然可以接收 FIN 并重發 ACK。

TIME_WAIT 的副作用
過多的 TIME_WAIT 會占用端口和內存資源(高并發短連接場景下),導致新的連接無法建立。

解決辦法:

  • 快速回收 TIME_WAIT;
  • 調整 MSL 時間;
  • 負載均衡或連接池:復用長連接以減少短連接數量。

TIME_WAIT 為什么要經過 2MSL?

第一個 MSL:確保主動關閉方的 ACK 到達對端;
第二個 MSL:確保對端重傳的 FIN 可以到達本端;

CLOSED_WAIT 過多如何解決?

CLOSED_WAIT 過多代表被動關閉方為能正確地關閉連接,導致連接資源長期占用。可能是由于程序 Bug 及配置問題導致的,應該去檢查程序。

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

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

相關文章

學習筆記十五——rust柯里化,看不懂 `fn add(x) -> impl Fn(y)` 的同學點進來!

🧠 Rust 柯里化從零講透:看不懂 fn add(x) -> impl Fn(y) 的同學點進來! 🍔 一、什么是柯里化?先用一個超好懂的生活比喻 假設你在點一個漢堡: 你說:我要點一個雞腿漢堡! 店員…

深入理解 TCP 協議 | 流量、擁塞及錯誤控制機制

注:本文為 “TCP 協議” 相關文章合輯。 原文為繁體,注意術語描述差異。 作者在不同的文章中互相引用其不同文章,一并匯總于此。 略作重排,如有內容異常,請看原文。 TCP 三向交握 (Three-way Handshake) 2016-12-21 …

PCL庫編譯指南

PCL(Point Cloud Library)的編譯過程會根據不同操作系統有所差異。以下是詳細的編譯步驟: Linux/Ubuntu系統編譯 1. 安裝依賴項 bash sudo apt-get update sudo apt-get install git build-essential linux-libc-dev sudo apt-get install cmake cmake-gui sud…

【Linux】條件變量、基于阻塞隊列的生產者消費者模型

📚 博主的專欄 🐧 Linux | 🖥? C | 📊 數據結構 | 💡C 算法 | 🌐 C 語言 進程是資源分配的基本單位,線程是調度的基本單位,線程是在進程內部運行的(是進程內部…

32-工藝品商城小程序

技術: 基于 B/S 架構 SpringBootMySQLvueelementuiuniapp 環境: Idea mysql maven jdk1.8 node 可修改為其他類型商城 用戶端功能 1.系統首頁展示輪播圖及工藝品列表 2.分類模塊:展示產品的分類類型 3.購物車:進行商品多選結算 或者批量管理操作 4.…

SLAM | 激光SLAM中的退化問題

在激光SLAM中,判斷退化環境的核心是通過數學建模分析環境特征對位姿估計的約束能力。除了LOAM中提出的退化因子D外,還存在多種基于表達式和閾值設定的方法。以下是幾種典型方法及其實現原理: 1. 協方差矩陣特征值分析 原理:通過分析點云協方差矩陣的特征值分布,判斷環境中…

【2025最新版】火鳥門戶v8.5系統源碼+PC、H5、小程序 +數據化大屏插件

一.介紹 火鳥地方門戶系統V8.5源碼 系統包含4端: PCH5小程序APP 二.搭建環境 系統環境:CentOS、 運行環境:寶塔 Linux 網站環境:Nginx 1.2.22 MySQL 5.6 PHP-7.4 常見插件:fileinfo ; redis 三.測…

PHP騰訊云人臉核身獲取NONCE ticket

參考騰訊云官方文檔: 人臉核身 獲取 NONCE ticket_騰訊云 前提條件,已經成功獲取了access token。 獲取參考文檔: PHP騰訊云人臉核身獲取Access Token-CSDN博客 public function getTxFaceNonceTicket($uid) {$access_token file_get_c…

多人3D游戲完整實現方案

以下是一份完整的代碼實現方案,涵蓋架構設計、核心模塊實現和部署流程。我們以 多人3D游戲 為例,結合之前討論的Nano服務端框架和Unity客戶端: 技術棧 模塊技術選型服務端Golang + Nano框架 + MongoDB客戶端Unity 2022 + C# + Mirror Networking通信協議Protobuf + WebSock…

【Linux我做主】GDB調試工具完全指南

Linux下GDB調試工具完全指南:25個核心命令詳解與實戰示例 github地址 有夢想的電信狗 前言 GDB(GNU Debugger)是Linux開發中不可或缺的調試工具,尤其在定位代碼邏輯錯誤和內存問題時表現卓越。本文基于實際開發經驗&#xff0…

QT中柵格模式探索

1、Qt中選擇了柵格模式,如下圖所示: 2、在進行整個大的UI界面布局時,需了解每個控件所需要選擇的屬性sizePolicy。 sizePolicy包含如下幾種選擇: 3、舉個例子:此時整個UI界面,我采用了柵格模式&#xf…

【計算機網絡】3數據鏈路層①

這篇筆記專門講數據鏈路層的功能。 2.功能 數據鏈路層的主要任務是讓幀在一段鏈路上或一個網絡中傳輸。 2.1.封裝成幀(組幀) 解決的問題:①幀定界②幀同步③透明傳輸 實現組幀的方法通常有以下種。 2.1.1.字符計數法 原理:在每個幀開頭,用一個定長計數字段來記錄該…

[區塊鏈lab2] 構建具備加密功能的Web服務端

實驗目標: 掌握區塊鏈中密碼技術的工作原理。在基于Flask框架的服務端中實現哈希算法的加密功能。 實驗內容: 構建Flash Web服務器,實現哈希算法、非對稱加密算法的加密功能。 實驗步驟: 哈希算法的應用:創建hash…

藍橋杯之前綴和

一維前綴 解題思路 看到“區間之和”問題,直接想到“前綴和” 前綴和的核心公式: sum[i]sum[i?1]a[i] 利用前綴和求區間和 [l,r] 的公式: 區間和sum[r]?sum[l?1] 解題步驟模板 輸入數組: 讀取數組長度 n 和查詢次數 m。 讀…

【學習筆記】計算機網絡(八)—— 音頻/視頻服務

第8章 互聯網上的音頻/視頻服務 文章目錄 第8章 互聯網上的音頻/視頻服務8.1概述8.2 流式存儲音頻/視頻8.2.1 具有元文件的萬維網服務器8.2.2 媒體服務器8.2.3 實時流式協議 RTSP 8.3 交互式音頻/視頻8.3.1 IP 電話概述8.3.2 IP電話所需要的幾種應用協議8.3.3 實時運輸協議 RTP…

【WRF運行】解決metgrid生成文件太大無內存!

目錄 方法:改變工作目錄運行 metgrid.exe參考由于我的運行內存過小,當研究區較大時,metgrid生成文件內存太大,導致每次運行都報錯,此時可更改工作目錄(空余文件夾)以運行 metgrid.exe(并非必須在wrf安裝目錄下運行!!!)。 metgrid.exe 本身不支持直接通過參數或 nam…

基于 Django 進行 Python 開發

基于 Django 進行 Python 開發涉及多個方面的知識點,以下為你詳細介紹: 1. Django 基礎 項目與應用創建 借助django-admin startproject project_name來創建新的 Django 項目。利用python manage.py startapp app_name創建新的應用。項目結構 理解項目各文件和目錄的作用,像…

【sylar-webserver】8 HOOK模塊

文章目錄 知識點HOOK實現方式非侵入式hook侵入式hook ??? 覆蓋系統調用接口獲取被全局符號介入機制覆蓋的系統調用接口 具體實現C 模板成員函數繼承 和 成員函數指針類型匹配 ?????FdCtx 和 FdManager ??判斷socket的小技巧FdCtxFdManager connect hook ?do_io模板 …

SpringAI+DeepSeek大模型應用開發——1 AI概述

AI領域常用詞匯 LLM(LargeLanguage Model,大語言模型) 能理解和生成自然語言的巨型AI模型,通過海量文本訓練。例子:GPT-4、Claude、DeepSeek、文心一言、通義干問。 G(Generative)生成式: 根據上…

SpringBoot 基本原理

SpringBoot 為我們做的自動配置,確實方便快捷,但一直搞不明白它的內部啟動原理,這次就來一步步解開 SpringBoot 的神秘面紗,讓它不再神秘。 目錄 SpringBootApplication 背后的秘密 Configuration ComponentScan EnableAutoC…