計算機網絡:詳解TCP協議(四次握手三次揮手)

目錄

1.Tcp協議介紹

1.1 Tcp協議層級

1.2 TCP協議的格式

2. 確認應答機制

2.1 確認應答

2.2 序號字段

2.3 捎帶應答

3. 流量控制

4. 三次握手 四次揮手

4.1 認識標志位

4.2 簡單認識

4.3 三次揮手

4.4 四次揮手


1.Tcp協議介紹

1.1 Tcp協議層級

計算機網絡:TCP/IP網絡協議-CSDN博客

下面是TCP/IP網絡協議族層級劃分,TCP協議位于傳輸層。其中傳輸層和網絡層都歸屬于操作系統層面。

TCP協議全稱是傳輸控制協議(Transmission Control Protocol),是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。顧名思義,Tcp協議要對數據傳輸進行控制。

  • 如下圖,用戶從主機A發送消息,應用層通常需要對數據進行序列化。序列化是對某個數據結構按照特定格式組織稱一條完整數據。而反序列化是將一條數據轉按照特定格式轉換成原來對應的數據結構。
  • 序列化后的數據通過write系統調用拷貝給TCP層中的發送緩沖區,每往下一層,都要加上對應的數據報頭。
  • 之后,通過網絡傳輸到主機B。先從物理層開始,對數據包進行解包分用。當到主機BTCP層的接收緩沖區,就會得到對方發來的序列化數據。通過read系統調用函數,讀取緩沖區的數據,再進行反序列化,主機B的用戶就會接受到發來的消息。

TCP協議對應的文件描述符是全雙工的,既可以接收數據,也可以發送數據。因為TCP層中有兩個緩沖區。數據從TCP的發送緩沖區傳輸到網絡層,會在該數據前面加上TCP協議的報頭,下面我們來了解一下TCP協議的格式。

1.2 TCP協議的格式

  1. 源/目的端口號:這兩個端口號分別表示數據是從哪個進程來,到哪個進程去。它們用于識別發送方和接收方的應用程序。

  2. 32位序號/32位確認號:序號用于標識發送的數據段,確保數據的順序。確認號用于確認接收到的數據段的序號,確保數據的完整性。

  3. 4位TCP報頭長度:這個字段表示TCP頭部有多少個32位(即4字節)。因此,TCP頭部的最大長度是15 * 4 = 60字節。

  4. 6位標志位:這些標志位用于控制TCP連接的狀態和傳輸方式。

    • URG:表示緊急指針是否有效。
    • ACK:表示確認號是否有效。
    • PSH:提示接收端應用程序立即從TCP緩沖區讀取數據。
    • RST:對方要求重新建立連接,攜帶RST標識的稱為復位報文段。
    • SYN:請求建立連接,攜帶SYN標識的稱為同步報文段。
    • FIN:通知對方本端要關閉連接,攜帶FIN標識的稱為結束報文段。
  5. 16位窗口大小:這個字段用于流量控制,表示接收方的緩沖區大小。

  6. 16位校驗和:發送端填充,用于CRC校驗。接收端通過校驗和來驗證數據是否正確。校驗和不僅包含TCP首部,還包含TCP數據部分。

  7. 16位緊急指針:標識哪部分數據是緊急數據。

  8. 40字節頭部選項:這部分暫時忽略。

總的來說,TCP協議的報頭長度在20-60字節之間。

2. 確認應答機制

2.1 確認應答

確認應答機制是TCP協議保證可靠性中最重要的一環。

  • 主機A向主機B發送一條消息,主機A如何保證消息被主機B接收呢?主機B會向主機A發送確認消息。那么主機B怎么保證這條確認消息被主機A接收呢?主機A也會發送一條確認消息。
  • 如此循環下去,你會發現新發的消息永遠得不到確認,也就是不可靠。但是歷史消息會得到確認,所以說這里的可靠性是指對歷史消息的確認。

2.2 序號字段

可是,這么多條歷史消息,怎么保證收到的是哪一條消息。TCP將每個字節的數據進行編號,即為序列號。我們可以將tcp的接受緩沖區類比成一個大字符數組,那么每個字節的數據就有了下標,天然就有了編號。

主機A的發送緩沖區拷貝上層的數據,發送出去后,對方接受緩沖區直接一股腦接收到接收緩沖區,本質上就是拷貝數組上的數據。

上圖中還是主機A和主機B進行通信。

  • 主機A發送的TCP報文中,有序號字段,表示發送數據的順序。如果主機A報文中序號字段為1000,主機B接受到該條數據,會解析報文中的序號字段。
  • 之后,主機B會在組織應答報文時,將TCP報文中確認序號字段填上1001,表示1001序號之前的數據已經獲取。即確認序號字段會填寫主機收到最大序號數,并加一。

2.3 捎帶應答

張三問:“李四今天吃了什么?”。李四回答:“叉燒炒蛋飯。你呢?”。在上面這段對話中,張三向李四發起問答,李四回答后,順便向張三也發起問答。

?tcp通信類似于人類的對答機制。主機A和主機B類比于張三和李四。主機A發送一條消息給主機B,主機B接受到后,組織tcp報文,并填寫確認序號字段,同時也攜帶數據,填寫序號字段。

上圖中,左邊部分才是tcp通信的真實情況。這種機制就是捎帶應答。這也是為什么會有確認序號字段的原因。

3. 流量控制

主機A發送大量數據給主機B,主機B的接受緩沖區已經滿載了,無法接收新的數據。此時,主機B的操作系統只能丟棄新的tcp報文。不過tcp報文有超時重傳機制,超過一定時間沒收到確認應答報文,會重發tpc報文。

  • 可是這些被丟棄的tcp報文經過無數個路由器,經歷千難萬險,通過網絡發送到目標主機。tcp報文不是需要保證可靠性嗎?操作系統不會做浪費時間和空間的事情。
  • 主機中的接受緩沖區剩余空間大小決定能接受多少數據,所以只需要知道對方接收緩沖區剩余空間,就可以控制tcp報文攜帶的數據大小,做到流量控制。

但是任何主機如何知道目標主機的緩沖區剩余空間大小呢?tcp報文中有窗口大小字段,該字段表示本主機接受緩沖區剩余空間的大小。對方主機接受到tcp報文,解析該字段,便知道發送主機的緩沖區剩余空間大小,就可以控制發送的數據大小。

4. 三次握手 四次揮手

4.1 認識標志位

客戶端向服務端發送tcp報文,不同的tcp報文通信的功能也不相同,可能是建立連接的請求,正常數據通信請求或者斷開連接的請求。

其中ACK表示該報文有確認應答功能,SYN表示向目標主機建立連接,FIN表示要求斷開連接。

4.2 簡單認識

?在確認應答機制中,最新發出的一條消息無法保證是否被接收,但是歷史消息能保證被接收,這就是確認應答機制的核心。

三次握手一般是由客戶端發起連接請求,服務端收到連接請求后,給予確認應答,并捎帶服務端的連接請求,最后客戶端進行確認應答。

四次揮手一般是由客戶端發起斷開連接請求,服務端收到后回復。之后,再由服務端發起斷開連接請求,客戶端進行確認應答。

4.3 三次揮手

三次握手,本質上雙方各自一次請求并接收對方應答,

  • 客戶端調用connect函數建立連接時,操作系統就會自動組織tcp報文,發起連接請求,此時客戶端tcp層處于SYN_SENT。
  • 服務端這邊需要調用listen函數,處于監聽狀態,再調用accept函數給新連接分配新文件描述符,讓新文件描述符用于客戶端通信。此時,操作系統會發送確認應答和連接請求給對方。
  • 客戶端收到后,便處于ESTABLISHED狀態。客戶端的操作系統也組織確認應答報文,發送給服務端,服務端接收到之后,也處于ESTABLISHED狀態
  • 但是客戶端發出最后一次的確認應答,是最新一條消息,這是無法保證可靠性,所以說客戶端在賭最后一個ACK應答被服務端收到。

為什么要有三次握手?

  • 建立雙方主機通信意識的共識
  • 因為TCP是全雙工的,三次握手可以驗證全雙工通信的通暢性。

4.4 四次揮手

四次揮手中,也是雙方的一問一答。

  • 先提出斷開連接請求的那一方,狀態會變成FIN_WAIT_1,接收到對方的斷開連接請求的一方,狀態會變成CLOSE_WAIT。
  • 假設客戶端是先提出斷開連接的一方,那么接收到斷開連接的確認應答后,會變成TIME_WAIT狀態。服務端過一會也想斷開連接,也會發出斷開連接請求。最后都變成CLOSED狀態。
  • 但是在應用層上,其實是雙方調用了close函數,關閉用于tcp通信的文件描述符。而tcp報文的組織和發送都是由操作系統自己完成的。
  • 至于為什么會有TIME_WAIT狀態,先關閉那一方等待對方關閉連接請求而設置的狀態,一般是兩分鐘。
  • 為什么要進行四次揮手呢?因為要關閉兩個通信的文件描述符。

不過有些人可能會問,為什么不把中間的斷開連接請求和確認斷開連接應答合并,使用捎帶應答機制,來完成揮手操作。

事實上,TCP協議確實存在通過三次通信完成連接終止的可能性。其關鍵在于能否實現"FIN-ACK捎帶應答"機制——當被動關閉方收到主動關閉方的FIN報文后,如果此時應用層已完成數據處理并立即觸發關閉流程,系統可以將ACK確認報文與己方的FIN結束報文合并發送。這種合并使得原本需要四次報文交互的過程(FIN→ACK→FIN→ACK)被優化為三次(FIN→ACK+FIN→ACK)。

但是多數情況下仍然需要完整的四次揮手流程。

最后這是雙方正常tcp通信情況。


創作充滿挑戰,但若我的文章能為你帶來一絲啟發或幫助,那便是我最大的榮幸。如果你喜歡這篇文章,請不吝點贊、評論和分享,你的支持是我繼續創作的最大動力!

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

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

相關文章

小程序 IView WeappUI組件庫(簡單增刪改查)

IView Weapp 微信小程序UI組件庫:https://weapp.iviewui.com/components/card IView Weapp.png 快速上手搭建 快速上手.png iView Weapp 的代碼 將源代碼下載下來,然后將dict放到自己的項目中去。 iView Weapp 的代碼.png 小程序中添加iView Weapp 將di…

用java實現一個簡單的sql select 解析器,無需第三方依賴,完全從0開始

以下是一個簡單的 SQL SELECT 解析器的 Java 實現,支持單表查詢和基本條件過濾。代碼包含詞法分析和語法分析模塊,并支持以下語法: SELECT column1, column2 FROM table WHERE column3 5 完整代碼 1. Token 類型定義 (TokenType.java) pu…

阿里云 CentOS YUM 源配置指南

阿里云 CentOS YUM 源配置指南 在使用 CentOS 7 時,由于 CentOS 官方源停止維護等原因,yum install 命令可能會報錯 “Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64”。以下是通過更換阿里云源解決該問題的詳細步驟。 一、備份原有配…

Learning vtkjs之ThresholdPoints

過濾器 閾值過濾器 介紹 vtkThresholdPoints - 提取滿足閾值條件的點 vtkThresholdPoints 是一個過濾器,它從數據集中提取滿足閾值條件的點。該條件可以采用三種形式: 1)大于特定值; 2) 小于特定值; 3) 在特定值之間…

記錄ruoyi-flowable-plus第一次運行流程報錯

記錄ruoyi-flowable-plus第一次運行流程報錯 錯誤步驟 1.啟動ruoyi-flowable-plus 正常登錄后,打開流程分類然后點擊新增按鈕,新增了一個分類。增加成功后, 再點擊流程分類,報錯。 錯誤提示 org.springframework.cglib.core.C…

Java中的stream流介紹與使用

一、Stream 的基礎概念 定義與特性 Stream 是單向數據流,對集合或數組進行高效處理,不存儲數據,而是通過操作鏈生成新 Stream。不可變性:原始數據源不被修改,所有操作均返回新 Stream。延遲執行:中間操作&a…

OCR身份證識別(正反面)_個人證照OCR識別_開放API接口使用指南

一、接口簡介 在數字化時代,快速準確地提取身份證信息變得尤為重要。**萬維易源提供的“身份證OCR識別”API接口,能夠快速提取二代居民身份證正反面的所有字段信息,包括姓名、性別、民族、出生日期、住址、身份證號、簽發機關、有效期限等。…

25年新版潮乎盲盒系統源碼 盲盒商城系統前端分享

盲盒系統市場的前景一直都很不錯,最近很多問我有沒有盲盒源碼的客戶,下面給大家分享一個新版潮乎盲盒源碼! 這款盲盒源碼系統 前端Uniapp 后端使用了Laravel框架進行開發。Laravel是一個流行的PHP框架,具有強大的功能和易于使用的…

Transformer四模型回歸打包(內含NRBO-Transformer-GRU、Transformer-GRU、Transformer、GRU模型)

Transformer四模型回歸打包(內含NRBO-Transformer-GRU、Transformer-GRU、Transformer、GRU模型) 目錄 Transformer四模型回歸打包(內含NRBO-Transformer-GRU、Transformer-GRU、Transformer、GRU模型)預測效果基本介紹程序設計參…

Axure疑難雜癥:利用中繼器制作三級下拉菜單(邏輯判斷進階)

親愛的小伙伴,在您瀏覽之前,煩請關注一下,在此深表感謝! Axure產品經理精品視頻課已登錄CSDN可點擊學習https://edu.csdn.net/course/detail/40420 課程主題:三級下拉菜單 主要內容:條件篩選時的邏輯判斷思維,中繼器使用 應用場景:復合條件下的下拉列表制作 案例展…

Nginx 核心功能之正反代理

目錄 一、Nginx 二、正向代理 三、反向代理 四、Nginx 緩存 1. 緩存功能的核心原理和緩存類型 2. 代理緩存功能設置 五、Nginx rewrite和正則 (1)Nginx 正則 (2)nginx location (3)Rewrite &…

ssh連接云服務器記錄

文章目錄 1. 背景2. ssh連接2.1 win 下通過終端工具進行連接2.2 Linux下通過ssh指令連接2.3 ssh使用publickey來連接 ssh連接云服務器記錄 1. 背景 最近開始接觸docker技術、mysql技術,加上本人工作基本都在Linux下進行,因此需要一套Linux環境進行練習。…

軟考-軟件設計師中級備考 12、軟件工程

一、軟件工程概述 定義:軟件工程是一門研究用工程化方法構建和維護有效的、實用的和高質量軟件的學科。它涉及到軟件的開發、測試、維護、管理等多個方面,旨在運用一系列科學方法和技術手段,提高軟件的質量和開發效率,降低軟件開…

【多次彈出“獲取打開此tobiieyetracking鏈接的應用”的窗口】解決辦法

使用聯想R9000P突然出現“獲取打開此tobiieyetracking鏈接的應用”的窗口,每隔幾分鐘就彈一次,特別惡心人,解決辦法: 找到【此電腦】,鼠標右鍵【管理】;選擇【服務】,如下所示,找到…

項目選擇的三個核心因素:市場前景、競爭優勢和成本控制

能保持持續增長和賺錢的項目就是好項目。 每個創業者創業之初,遇到的第一個難題就是選擇做什么項目? 俗話說:方向不對,努力白費。 選錯項目,意味著你所有的付出都是打水漂。 能做的項目那么多,在沒有價值…

裸機 Kubernetes 集群負載均衡器:MetalLB 深度解析與實戰指南

一、引言 在云原生架構中,Kubernetes 默認的負載均衡能力依賴于云廠商(如 AWS ELB、GCP LB),但在裸機或本地數據中心環境中,這一功能缺失導致 LoadBalancer 類型的 Service 始終處于 Pending 狀態。此時,M…

2025年- H20-Lc128-240. 搜索二維矩陣 II(矩陣)---java版

1.題目描述 2.思路 遍歷矩陣,然后如果遇到矩陣中的值正好等于target,輸出true。否則,輸出false。 3.代碼 public class H240 {public boolean searchMatrix(int[][] matrix, int target) {//1.計算出總的行值,總的列值。int mm…

系統架構設計師:設計模式——行為設計模式

一、行為設計模式 行為模式涉及算法和對象間職責的分配。行為模式不僅描述對象或類的模式,還描述它們之間的通信模式。這些模式刻畫了在運行時難以跟蹤的、復雜的控制流。它們將用戶的注意力從控制流轉移到對象間的聯系方式上來。 行為類模式使用繼承機制在類間分…

java springboot實現MCP Server SSE

參考: https://juejin.cn/post/7491881721278529570 SpringAI 實現 SSE MCP Server項目 - Auler - 博客園 springboot-MCPserver-JUnit: 使用springboot支持mcp項目搭建,同時有著便捷的單元測試來進行敏捷開發對話即服務:Spring BootMCP讓…

LeetCode 熱題 100 48. 旋轉圖像

LeetCode 熱題 100 | 48. 旋轉圖像 大家好,今天我們來解決一道經典的算法題——旋轉圖像。這道題在LeetCode上被標記為中等難度,要求我們將一個 n n 的二維矩陣(圖像)順時針旋轉90度,并且必須原地修改矩陣&#xff0…