1. 程式人生 > >TCP建立連線為什麼進行三次握手?

TCP建立連線為什麼進行三次握手?

面試被問到這個問題,當時沒回答上來,網路上查了很久,感覺還是這個比較全面,雖然文章並沒有說清楚,但結合文章及後面的評論就差不多搞懂了。

TCP是基於IP的虛電路可靠的全雙工通訊服務,基本上可以分為連結建立,資料傳輸,連結拆除三個階段。

為什麼連結建立階段採用三次握手機制?

先約定兩個名字。A代表連結建立的發起方,B代表連結建立的接受方。

三次握手是指A向B傳送一個Sync,B向A回送Ack+Sync,A再向B傳送Ack,這樣一個過程。
通過這個過程,TCP的全雙工的虛電路服務就建立起來了。
為什麼是三次握手?
我認為原因是TCP連結邏輯上區分成兩個通道,一個通道用於A-》B,另一個通道用於B-》A。這一點從連結建立階段看不明晰,但是連結拆除階段非常清楚。我們

知道TCP連結的拆除是所謂的優雅拆除,任何一方都可以拆除自己發往對方資料的那個通道,而同時還要保證對方發往自己的資料能被正常處理。所以TCP連結拆除就要經歷一個半連結的階段。用四個協議資料包進行拆除。
再回過頭看看連結建立階段,就非常明確的看出來,這三次握手確實是用於建立這個鏈路上的兩個通道的。
那麼為什麼要三次握手?最近看到彎曲評論上有一篇文章,說TCP連結甚至可以建立半連結,也就是隻建立一個通道,資料只能單向流動。這時候的三次握手就退化成兩次握手,一次Sync以及一個對應的Ack。[同時文章指出,Socket
API並沒有提供建立半連結的能力,但是下層的協議確實具有]
所以說三次握手也不是必需的。
我們暫且不關心建立半連結。
究竟為什麼需要三次握手?
從邏輯上講,三次握手是最省的建立TCP鏈路[兩個通道]規程機制了,所以就應該三次握手。
但是,實際上我們必須進行三次握手麼?我們知道UDP是資料報服務,也就是無連線的服務。其實無連線的服務也可以看作某種連線服務,比如:看做連結建立、資料傳輸、連結拆除在一個協議資料包中完成的快速短暫連結服務。這就是說,我們可以複用資料包。有了這個啟示,我們就可能對三次握手進行更進一步的優化,實際上,可以優化到沒有任何純協議資料包,只有業務資料包,只要把這幾個協議資料包複用於初始資料傳輸包即可。
但是為什麼TCP連結要三次握手進行建立?
我個人認為其實沒有理由非得如此。不過我們可以通過TCP的擁塞控制機制得到一些啟示。TCP的擁塞控制由“慢啟動(Slow
start)”和“擁塞避免(Congestion avoidance)”,“快速重傳(Fast retransmit)”、“快速恢復(Fast
Recovery)”,選 擇性應答( selective
acknowledgement,SACK)等一系列機制組成的。其中慢啟動是TCP連結建立以後,開始傳送資料時的策略。為了避免TCP擁塞,採用緩慢提高TCP資料傳輸速率的辦法。所以三次握手我猜想也是為了減緩TCP連結的建立,就如同古代的擊鼓伸冤,你可以擊鼓伸冤,但在此之前你得過好幾關,比如跪帶刺的鐵板凳等等……,這樣的目的是為了提高擊鼓伸冤的門檻,免的有人惡意的利用這種機制——除非你願意為你的冤情付出相應的代價[這也說明冤情沉重],否則你的冤屈不必申述。
當然,有人說三次握手是為了約定初始序號(ISN,Initial Sequence
Number,這兒的序號並不是按照資料包自然數序排列的,其實叫成偏移Offset更合理,因為它其實是指出這個包攜帶的資料在整個TCP資料流中的偏移量的,也就是說,如果一個包序號為x,而攜帶的資料長度為y,那麼下一個包的序號為x
+
y,如果達到了最大值,就繞到0那兒開始迴環。順便說一句,最初序號是32bit的,現在提升到64bit了,因為要保證協議棧能識別出相同序號的不同的包,不能溢位迴環的太快,否則ack的語義不清晰),這當然是對的,三次握手確實約定了初始序號,但是約定初始序號不是為什麼是三次握手的原因。實際上正如我前面所說的,沒有握手也可以約定初始序號。[在網上找到這樣一篇論文,內容看不了,但應該大致跟我的複用資料包的設想差不多,地址:

http://d.wanfangdata.com.cn/Periodical_czsfgdzkxxxb200902019.aspx]
歸根結底,TCP連結的建立、使用、拆除三階段是清晰的分離的,連結建立階段是獨立的,也不能用於傳遞資料,當然,資料傳遞階段也沒有建立連結的功能。
那麼現在還是那個問題:為什麼需要三次握手?

看評論:

1.

這是通訊當中的基本問題, 看明白Two Generals' Problem:
http://en.wikipedia.org/wiki/Two_Generals'_Problem
就很容易明白為什麼三次握手是必須的了.
這個問題的本質是, 通過一個不完全可靠的通道, 最少需要幾次訊息傳輸, 通道兩邊的人能夠對一個問題達成一致. 對於TCP來說, 無論有沒有初始
序號的要求, 想要兩邊都同意開始傳出資料, 就至少需要3次訊息的交換:
0次: 顯然不行
1次: A->B, A不知道B是否同意
2次: A->B, B->A. B不知道A是否收到自己的訊息, 因為通道不完全可靠
3次: A->B, B->A, A->B. 兩邊都收到了對方的ACK, 意味著各自都瞭解了對方的意圖, 從而可以對是否開始通訊這個最簡單的問題
達成一致. 

2.

這種主考官很好對付,我就遇到過類似的。直接就說三次握手的協議是理論結果和工程實踐結合後,選擇的一個折中方案,在網際網路出現之初,這是一個比較好的方案。主

考聽明白的話,應該沒興趣問下去了。

對於現在的網際網路,三次握手其實已經落後了,效率低下。所以現在才有不少新的號稱高效能面向連線的協議出來討生活。

3.

TCP的三次握手是婦孺皆知的事情,似乎沒有什麼可以討論的。筆者也曾經面試別人,提出過下面的問題:

“TCP為何要三次握手,四次斷開?”

筆者期望的答案是:

TCP的連線建立一定要雙向,所以第二個報文SYN/ACK齊發,而斷開的時候可以保持半連線,即斷開一半。理論依據是筆者根據Socket的實現得出的,Socket之中沒有給出建立半連線的API,但是給出了shutdown可以關閉半連線。


我的理解:

tcp要建立一個全雙工的連線,也就是可以理解為兩個單獨的通道,A->B和B->A。當A發給B 資料包(syn)時,可以理解為要和B建立連結,B回覆給A資料包(ACK+SYN)時,即B同意建立A->B的連線,同時詢問要和A建立連結,然後A回覆B資料包(ACK)表示同意建立B->A的連線。這樣一個全雙工的連線便建立起來了。


相關推薦

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

TCP建立連線時,為什麼要進行三次揮手?   每一次TCP連線都需要三個階段:連線建立、資料傳送和連線釋放。三次握手就發生在連線建立階段。 在謝希仁著《計算機網路》第四版中講三次握手的目的是為了防止已失效的連線請求報文段突然又傳送到了服務端,因而

TCP 建立連線握手 和釋放連線的四揮手 圖解

   相對於SOCKET開發者,TCP建立過程和連結折除過程是由TCP/IP協議棧自動建立的.因此開發者並不需要控制這個過程.但是對於理解TCP底層運作機制,相當有幫助.      而且對於有網路協議工程師之類筆

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

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

TCP建立連線握手

1.TCP建立連線的過程採用三次握手,已知第三次握手報文的傳送序列號為1000,確認序列號為2000,請問第二次握手報文的傳送序列號和確認序列號分別為 1999,999 1999,1000 999,2000 9

TCP協議建立連線握手)和斷開連線(四揮手)

首先先看下TCP的報頭格式 發現在中間有一個6位的標誌位(紅色標出) 標誌位欄位 含義 URG 緊急指標是否有效;置為1表示要優先處理 ACK 確認號是否有效;設為1表示為確認應答報文(通常情況下會設為1,但是第一

TCP基礎 —— 為什麼建立連線需要握手,而斷開連線則需要四?能不能是

一、TCP包概述 一個 segment 包含 header 和 data 兩個部分,對於這篇文章需要理解的就是,Sequence

【轉】TCP建立連接握手和釋放連接四握手

eight 請求 置1 計時器 響應 發送數據 出現 期望 本地 在談及TCP建立連接和釋放連接過程,先來簡單認識一下TCP報文段首部格式的的幾個名詞(這裏只是簡單說明,具體請查看相關教程) 序列號seq:占4個字節,用來標記數據段的順序,TCP把連接中發送的所有數

TCP建立連線為什麼進行握手

面試被問到這個問題,當時沒回答上來,網路上查了很久,感覺還是這個比較全面,雖然文章並沒有說清楚,但結合文章及後面的評論就差不多搞懂了。 TCP是基於IP的虛電路可靠的全雙工通訊服務,基本上可以分為連結建立,資料傳輸,連結拆除三個階段。 為什麼連結建立階段採用三次握手機制?

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

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

TCP連線建立只需要握手,為什麼斷開連線需要四揮手?

通常TCP連線是由客戶端向伺服器發起和斷開的。因為只有伺服器在監聽埠,客戶端上沒有監聽埠,所以客戶端無法接收主動來的連線。而客戶端獲得了自己想要的資源或者服務之後,就會斷開連線。下面的三次握手和四次揮手描述了典型情況。 TCP連線建立過程: 1、客戶端向伺服器傳送SYN,其中seq=x。 2、伺服器

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

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

TCP/IP協議的握手和四揮手(建立連線和斷開連線

1、TCP/IP協議概述 TCP/IP協議(TransmissionControl Protocol/Internet Protocol)叫做傳輸控制/網際協議,又叫網路通訊協議,這個協議是Internet國際網際網路絡的基礎。TCP/IP是網路中使用的基本的通訊協議。雖然

建立TCP連線握手

今天又重新看了看計算機網路,加深了對三次握手的理解。 當兩臺主機用tcp協議通訊時,在交換資料前需要建立連線,有三個步驟。如下圖。 步驟1:客戶端向伺服器傳送包含SYN(同步序列號)的資料段,開啟連線,seq為順序號(隨機值),設為x。 步驟2:伺服器為了確認收到了該資料

TCP報文格式和握手——握手tcp包(header+data),此外,TCP 報文段中的數據部分是可選的,在一個連接建立和一個連接終止時,雙方交換的報文段僅有 TCP 首部。

pan 內容 由於 clas nts data 奇偶校驗 rom 加載中 from:https://blog.csdn.net/mary19920410/article/details/58030147 TCP報文是TCP層傳輸的數據單元,也叫報文段。 1、端口號:用來標

圖片詳解TCP連線握手,四斷開基本原理

圖片詳解TCP連線的三次握手,四次斷開 作者:林子            TCP(TransmissionControl Protocol 傳輸控制協議)是一種面向連線傳輸協議,就像打電話一

TCP協議的連線機制---握手訊號的原理

這篇文章是寫給什麼人看的? 網路程式設計是現代計算機程式設計中不可缺少的一個環節,這裡面的程式設計師主要分為兩種型別:一種是專門搞網路程式設計的,估計是一些通訊專業的童鞋,他們的任務是管理整個網路的通

詳解TCP連線的“握手”與“四揮手”(上)

一、TCP connection 客戶端與伺服器之間資料的傳送和返回的過程當中需要建立一個叫TCP connection的東西; 由於TCP不存在連線的概念,只存在請求和響應,請求和響應都是資料包,它們之間都是經過由TCP建立的一個從客戶端發起,伺服器接收的類似連線的通道,這個連線可以一直保持,ht

詳解TCP連線的“握手”與“四揮手”(下)

上文連結: 詳解TCP連線的“三次握手”與“四次揮手”(上) 四、TCP的四次揮手(Four-Way Wavehand) 0.前言 對於"三次握手"我們耳熟能詳,因為其相對的簡單。但是,我們卻不常聽見“四次揮手”,就算聽過也未必能詳細地說明白它的具體過程。下面就為大家詳盡,直觀,完

tcp協議報文和握手與四揮手

tcp報文 三次握手與四次揮手 tcp11種狀態tcp協議:tcp是面向連接、可靠的進程到進程之間的協議。tcp提供全雙工服務:即:數據可在同一時間雙向傳輸。tcp報文段首部格式:各字段含義:源端口號:16位字段,為發送端進程對應的端口號目標端口:16位字段,為接收端進程對應的端口號,接收方接收到數據

為什麽TCP連接需要握手分開需要四握手

發送數據 回復 兩件 請求 com 可靠性 網絡 浪費 準備工作 原文地址:http://lixiangfeng.com/blog/article/content/7908246 TCP的三次握手和四次斷開TCP是一個面向連接的服務,面向連接的服務是電話系統服務模式的抽象,