通俗易懂地講解TCP建立連接的三次握手和釋放連接的四次揮手

来源:http://www.cnblogs.com/xiaoming0601/archive/2016/10/26/6001021.html
-Advertisement-
Play Games

通過打電話的例子講解TCP的三次握手和四次揮手,通俗易懂,容易理解 ...


TCP建立連接時,為什麼要進行三次揮手?

  每一次TCP連接都需要三個階段:連接建立、數據傳送和連接釋放。三次握手就發生在連接建立階段。 在謝希仁著《電腦網路》第四版中講三次握手的目的是為了防止已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤。在另一部經典的《電腦網路》一書中講三次握手的目的是為瞭解決網路中存在延遲的重覆分組的問題。   這兩種不用的表述其實闡明的是同一個問題。

  謝希仁版《電腦網路》中的例子是這樣的,已失效的連接請求報文段的產生在這樣一種情況下:client發出的第一個連接請求報文段並沒有丟失,而是在某個網路結點長時間的滯留了,以致延誤到連接釋放以後的某個時間才到達server。本來這是一個早已失效的報文段。但server收到此失效的連接請求報文段後,就誤認為是client再次發出的一個新的連接請求。於是就向client發出確認報文段,同意建立連接。假設不採用三次握手,那麼只要server發出確認,新的連接就建立了。由於現在client並沒有發出建立連接的請求,因此不會理睬server的確認,也不會向server發送數據。但server卻以為新的運輸連接已經建立,並一直等待client發來數據。這樣,server的很多資源就白白浪費掉了。採用三次握手的辦法可以防止上述現象發生。例如剛纔那種情況,client不會向server的確認發出確認。server由於收不到確認,就知道client並沒有要求建立連接。   

  這個例子很清晰的闡釋了三次握手對於建立可靠連接的意義。在Google Groups的TopLanguage中看到一帖討論TCP三次握手覺得很有意思。貼主提出的問題,在眾多回覆中,有一條回覆寫道:這個問題的本質是, 通道不可靠, 但是通信雙發需要就某個問題達成一致. 而要解決這個問題, 無論你在消息中包含什麼信息, 三次通信是理論上的最小值. 所以三次握手不是TCP本身的要求, 而是為了滿足"在不可靠通道上可靠地傳輸信息"這一需求所導致的. 請註意這裡的本質需求,通道不可靠, 數據傳輸要可靠. 三次達到了, 那後面你想接著握手也好, 發數據也好, 跟進行可靠信息傳輸的需求就沒關係了. 因此,如果通道是可靠的, 即無論什麼時候發出消息, 對方一定能收到, 或者你不關心是否要保證對方收到你的消息, 那就能像UDP那樣直接發送消息就可以了. 。這可視為對三次握手目的的另一種解答思路。

 

舉個打電話的例子

  A : 你好我是A,你聽得到我在說話嗎

  B : 聽到了,我是B,你聽到我在說話嗎

  A : 嗯,聽到了

  建立連接,開始聊天!

 



 

為什麼TCP協議終止鏈接要四次?

1、當主機A確認發送完數據且知道B已經接受完了,想要關閉發送數據口(當然確認信號還是可以發),就會發FIN給主機B。

2、主機B收到A發送的FIN,表示收到了,就會發送ACK回覆。

3、但這是B可能還在發送數據,沒有想要關閉數據口的意思,所以FIN與ACK不是同時發送的,而是等到B數據發送完了,才會發送FIN給主機A。

4、A收到B發來的FIN,知道B的數據也發送完了,回覆ACK, A等待2MSL以後,沒有收到B傳來的任何消息,知道B已經收到自己的ACK了,A就關閉鏈接,B也關閉鏈接了。

 

A為什麼等待2MSL,從TIME_WAIT到CLOSE?

 在Client發送出最後的ACK回覆,但該ACK可能丟失。Server如果沒有收到ACK,將不斷重覆發送FIN片段。所以Client不能立即關閉,它必須確認Server接收到了該ACK。Client會在發送出ACK之後進入到TIME_WAIT狀態。Client會設置一個計時器,等待2MSL的時間。如果在該時間內再次收到FIN,那麼Client會重發ACK並再次等待2MSL。所謂的2MSL是兩倍的MSL(Maximum Segment Lifetime)。MSL指一個片段在網路中最大的存活時間,2MSL就是一個發送和一個回覆所需的最大時間。如果直到2MSL,Client都沒有再次收到FIN,那麼Client推斷ACK已經被成功接收,則結束TCP連接。

 

這個網上轉載的例子不錯:

三次握手:
A:“喂,你聽得到嗎?”A->SYN_SEND

B:“我聽得到呀,你聽得到我嗎?”應答與請求同時發出 B->SYN_RCVD | A->ESTABLISHED

A:“我能聽到你,今天balabala……”B->ESTABLISHED

四次揮手:
A:“喂,我不說了。”A->FIN_WAIT1

B:“我知道了。等下,上一句還沒說完。Balabala…..”B->CLOSE_WAIT | A->FIN_WAIT2

B:”好了,說完了,我也不說了。”B->LAST_ACK

A:”我知道了。”A->TIME_WAIT | B->CLOSED

A等待2MSL,保證B收到了消息,否則重說一次”我知道了”,A->CLOSED


鏈接:https://zhuanlan.zhihu.com/p/21940234
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、AbstractCollection 提供了集合的最大實現 繼承該類,必須實現size()和iterator(),因為該類操作集合都是通過iterator 二、fail-fast策略 該策略在集合框架中多次被應用 一種多線程對同一集合操作的保護措施,確保操作目標沒有被其他線程操作過,與cas思想 ...
  • macOS Sierra 已經幫我們預裝了 Ruby、PHP(5.6)、Perl、Python 等常用的腳本語言,以及 Apache HTTP 伺服器。由於 nginx 既能作為 HTTP 伺服器也能作為反向代理伺服器,且配置簡單,這裡我們用 nginx 代替 Apache 作為我們預設的 HTTP ...
  • 最近自學了一下NodeJS,然後做了一個小demo,實現歌曲的添加、修改、播放和刪除的功能,其中自然要實現音樂和圖片的上傳功能。於是上網查找資料,找到了一個formidable插件,該插件可以很好的實現文件的上傳功能。該小demo用到了MySQL資料庫,所有的數據都存放到了資料庫中。下麵簡單說一些如... ...
  • 可以在Index.php文件下 <?php 之前添加<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ...
  • REST是一種架構風格,其核心是面向資源,REST專門針對網路應用設計和開發方式,以降低開發的複雜性,提高系統的可伸縮性。REST提出設計概念和準則為: REST是一種架構風格,其核心是面向資源,REST專門針對網路應用設計和開發方式,以降低開發的複雜性,提高系統的可伸縮性。REST提出設計概念和準 ...
  • 監聽器的原理: 被監聽對象→對象擁有的事件→捕獲到事件變化→監聽器捕捉事件→監聽器處理該事件 Web伺服器上有4個範圍,拋開page範圍,還有request範圍,session範圍,application範圍。這些範圍的對象什麼時候創建,什麼時候銷毀,什麼時候往範圍中存放了數據,什麼時候替換了存放的 ...
  • 位元組流與和字元流的使用非常相似,兩者除了操作代碼上的不同之外,是否還有其他的不同呢?實際上位元組流在操作時本身不會用到緩衝區(記憶體),是文件本身直接操作的,而字元流在操作時使用了緩衝區,通過緩衝區再操作文件,如圖12-6所示。下麵以兩個寫文件的操作為主進行比較,但是在操作時位元組流和字元流的操作完成之後 ...
  • 最近在苦於思考kmeans演算法的MPI並行化,花了兩天的時間先把串列版本實現了。 聚類問題就是給定一個元素集合V,其中每個元素具有d個可觀察屬性,使用某種演算法將V劃分成k個子集,要求每個子集內部的元素之間相異度儘可能低,而不同子集的元素相異度儘可能高。 下麵是google到該演算法的一個流程圖,表意清 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...