1. 程式人生 > >TCP為什麼要三次握手而結束要四次

TCP為什麼要三次握手而結束要四次

舉個打電話的例子:

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

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

  A : 嗯,聽到了

  建立連線,開始聊天!

簡單而言:如果不是三次握手的話,那麼到底需要幾次握手最佳呢?2次握手,或者4次以上的握手?

先看2次握手的情況:客戶端給伺服器傳送建立連線的請求,伺服器同意連線請求發回應給客戶端,連線就此建立。

有問題的就是網路中經常會出現的包的延遲,如果客戶端的某個包在路由器上延遲了,過了很久才發給伺服器,伺服器收到這個包後迴應給客戶端,伺服器以為連線就此建立成功,分配資源,這樣就會出現問題。

再看四次握手的情況:

①A傳送SYN,

②B收到SYN後傳送ACK+SYN

③A傳送ACK

④B再發送ACK

實際上這樣的過程可以一直迴圈下去,其實3次握手已經是能夠使雙方知道對方裝置都是好用的最少次數。四次握手會浪費資源。

綜上所述,TCP 3次握手最好。


為什麼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連線。

參考:http://blog.chinaunix.net/uid-25002135-id-3314682.html
http://www.cnblogs.com/vamei/archive/2012/12/16/2812188.html

相關推薦

TCP為什麼握手結束

舉個打電話的例子:   A : 你好我是A,你聽得到我在說話嗎   B : 聽到了,我是B,你聽到我在說話嗎   A : 嗯,聽到了   建立連線,開始聊天! 簡單而言:如果不是三次握手的話,那麼到底需要幾次握手最佳呢?2次握手,或者4次以上的握手?

網路TCP建立連線為什麼需要握手結束

 舉個打電話的例子:   A : 你好我是A,你聽得到我在說話嗎   B : 聽到了,我是B,你聽到我在說話嗎   A : 嗯,聽到了   建立連線,開始聊天! 為什麼TCP協議終止連結要四次? 1、當主機A確認傳送完資料且知道B已經接受完了,想

TCP 為什麼握手不是兩握手(正解版)

參考文章 大部分網路部落格的錯誤解讀 首先需要宣告的是, 百度搜索到的大部分網路部落格關於這個問題的解答都是不清晰或者不準確的。 討論這個問題的大部分部落格都會引用《計算機網路》的內容: 防止已失效的連線請求又傳送到伺服器端,因而產生錯誤 不幸的是, 這種

Tcp為什麼需要握手不是兩

找了一下資料發現還是有點門道的 只要還是來源於知戶上:傳送門 首先從Tcp通訊是全雙工通訊分析,全雙工也就是我可以給你發信息你也可以給我發信息(可以同時發) 三次握手也是確認這個全雙工通訊的過程 確認客戶端可以給服務端發訊息 第一次握手的客戶端傳送的syn包以及第二握手服務

為什麼tcp建立連線是握手不是兩握手或者握手?(筆試面試常考)

        先說說tcp三次握手,  不細說了, 也就是syn,  ack/syn,  ack.         為什麼不能是兩次呢?         先假設是兩次吧。我們知道, tcp的連線過程中有一個超時重傳演算法(karn演算法是比較典型的), 如果client發

計算機網路:TCP協議建立連線的過程為什麼是握手不是兩?【對於網上的兩種說法我的思考】

網上關於這個問題吵得很凶,但是仔細看過之後我更偏向認為兩種說的是一樣的。 首先我們來看看 TCP 協議的三次握手過程 如上圖所示: 解釋一下里面的英文: * 裡面起到作用的一些標誌位就是TCP報文首部裡的內容,ACK確認標誌位,SYN同步標誌位,ack確認號; * 兩端的狀態CLOSED 就是

Wireshark抓包示範:TCP握手建立連線和握手斷開連線

以下內容來自網路資源整合,僅供自己記錄,日後檢視方便。 首先介紹Wireshark抓包工具,它長這樣: 下面我們要設定過濾規則: 按如下設定,主要設定: 1、需要監控的網絡卡; 2、過濾規則(圖示是“HTTP TCP port(80)”,即只監控TCP連線):

【網路】TCP握手建立連線和揮手釋放連結

TCP協議 TCP報文格式 TCP建立連線的過程   (1)Client將標誌位SYN置為1,隨機產生一個值seq=J,並將該資料包傳送給Server,Client進入SYN_SENT狀態,等待Se

為什麼是握手不是兩握手,為什麼是揮手

為什麼是三次握手? 三次握手可以簡單看做是客戶傳送請求,伺服器對客戶的請求進行確認,客戶對伺服器的確認再進行確認。 如果採用兩次握手,假設下面這種情況,客戶向伺服器傳送請求,伺服器沒有對客戶的請求進行

TCP/IP詳解--TCP握手建立連線與握手終止連線

1.TCP連線的建立 (1)首先是伺服器初始化的過程,從CLOSED(關閉)狀態開始通過順序呼叫SOCKET、BIND、LISTEN和ACCEPT原語建立Socket套接字,進入LISTEN(監聽)狀態,等待客戶端的TCP傳輸連線請求。      (2)客戶端最開始也是從CLOSED狀態開始呼叫SOCKET

TCP建立連線握手和釋放連線握手

TCP的報文結構如下下所示:序列號seq:佔4個位元組,用來標記資料段的順序,TCP把連線中傳送的所有資料位元組都編上一個序號,第一個位元組的編號由本地隨機產生;給位元組編上序號後,就給每一個報文段指派

TCP握手建連以及揮手斷連詳解

這是我見過最詳盡的TCP三次握手以及四次斷連的文章,文末已註明出處,若有冒犯,請通知,將會刪除。 不過,其中加入了我自己的理解,試著讓文章更加完善,做了一定的補充工作。增加了實際應用中的注意事項,做到知其然,更知其所以然的效果。 一. TCP/IP協議族      

什麼是RST包,什麼是握手,什麼是握手

三次握手 Three-way Handshake 一個虛擬連線的建立是通過三次握手來實現的 1. (B) --> [SYN] --> (A) 假如伺服器A和客戶機B通訊. 當A要和B通訊時,B首先向A發一個SYN (Synchronize) 標記的包,告訴A請求建立連線. 注意: 一個

什麼是握手、什麼是握手

在上一篇我們瞭解的TCP的報文格式和TCP連線管理機制:TCP初認識 今天來理解什麼是三次握手,什麼是四次揮手 圖1 TCP連線管理 什麼是三次握手 在網路資料傳輸中,傳輸層協議TCP(傳輸控制協議)是建立連線的可靠傳輸,TCP

TCP為什麼握手不是

  其實這個問題就是說,為什麼tcp不能兩次握手,或者一次握手就建立連線,和三次握手時怎麼解決兩次握手中的問題的。     為什麼不能一次握手很容易理解,TCP是面向連線的,一次握手肯定建立不了連線,一條資訊發出去連個回信都沒有怎麼連線?所以問題在為什麼不能兩次握手,這

TCP為什麼握手?為什麼揮手的TIME_WAIT?

一:首先奉上 TCP三次握手的過程 TCP連線釋放的過程: 二: 1。為什麼兩次就建立連線還要三次握手呢?這主要是為了防止已失效的連線請求報文又突然傳遞伺服器。 所謂“防止已失效的連線請求報文又突然傳遞伺服器。”是這樣一種

TCP為什麼握手,不是兩

第一次握手:黃河發起呼叫,長江收到了。這時長江可以確認的是,黃河的發信機和自己的收信機是好的,否則的話他收不到黃河的呼叫;黃河能確認什麼呢?他什麼也不能確認,有可能自己的電臺除了指示燈是好的,其它都是壞的,他在對著一臺鐵疙瘩發功。 第二次握手:長江迴應,黃河收到了。這時

知識點 - tcp協議建立連接 為什麽是握手 斷開連接需要

重新 小寫 term 新的 請求 syn 完成後 字段 防止 在談及TCP建立連接和釋放連接過程,先來簡單認識一下TCP報文段首部格式的的幾個名詞(這裏只是簡單說明,具體請查看相關教程) 序列號seq:占4個字節,用來標記數據段的順序,TCP把連接中發送的所有

tcp協議建立連線 為什麼是握手 斷開連線需要

三次握手: A:“喂,你聽得到嗎?”A->SYN_SEND B:“我聽得到呀,你聽得到我嗎?”應答與請求同時發出 B->SYN_RCVD | A->ESTABLISHED A:“我能聽到你,今天balabala……”B->ESTABLISHE

tcp握手建立連線和4揮手斷開連線

[LAST_ACK -> CLOSED] 伺服器收到了對FIN的ACK, 徹底關閉連線. 客戶端狀態改變: 1.[CLOSED -> SYN_SENT] 客戶端呼叫connect, 傳送同步報文段; 2.[SYN_SENT -> ESTABLISHED] connect呼叫成功, 則進入ES