1. 程式人生 > >什麼是三次握手、什麼是四次握手

什麼是三次握手、什麼是四次握手

在上一篇我們瞭解的TCP的報文格式和TCP連線管理機制:TCP初認識

今天來理解什麼是三次握手,什麼是四次揮手

TCP連線管理機制

圖1 TCP連線管理

什麼是三次握手


在網路資料傳輸中,傳輸層協議TCP(傳輸控制協議)是建立連線的可靠傳輸,TCP建立連線的過程,我們稱為三次握手。
第一次,客戶端向伺服器傳送SYN同步報文段,請求建立連線
第二次,伺服器確認收到客戶端的連線請求,並向客戶端傳送SYN同步報文,表示要向客戶端建立連線
第三次,客戶端收到伺服器端的確認請求後,處於建立連線狀態,向伺服器傳送確認報文
客戶端是在收到確認請求後,先建立連線
伺服器是在收到最後客戶端的確認後,建立連線
發起連線請求的一定是客戶端

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

我們可以分析一次握手肯定是不行的,這樣伺服器都不一定能收到連線請求

那麼如果是兩次握手呢?

如果是兩次握手,連線過程應該是這樣的,當伺服器收到對端的連線請求時,就認為連線建立好了,進入ESTABLISHED狀態。客戶端在收到伺服器發來的同步確認報文後,就認為連線建立好了,進入ESTABLISHED,在報文都能正常收到的情況下,兩次握手是可以安全建立連線的。
但是存在這樣的情況,假設第二次握手的報文丟失了,當前的狀態是,伺服器認為連線已經建立好了,可是客戶端沒有收到同步確認報文,認為連線還沒有建立好,此時,伺服器端的連線其實是無效連線,客戶端因為沒有收到確認,便會向伺服器重傳同步報文,同樣,在伺服器收到客戶端的同步報文時,認為連線已經建立好了,同樣糟糕的事情發生了,伺服器給客戶端傳送的同步確認報文丟失了,或者是說有人惡意向伺服器不斷髮送SYN同步報文(SYN洪水)。那麼伺服器端就會有大量的無效連線,伺服器處理連線的數量是有限的,當有大量的無效連線建立後,伺服器處理有效連線是能力就會受限,且建立連線會消耗大量是資源,至此有可能導致伺服器崩潰。
這樣看來兩次握手是不可行的。

三次握手為什麼是可行的呢?

在上面的兩次握手的方案中,我們看到建立連線過程中,是伺服器先處於連線建立好的狀態,出現差錯時,客戶端沒有連線建立成功,致使伺服器可能有大量的無效連線,導致伺服器安全問題。
那麼在三次握手方案中,客戶端收到伺服器的同步確認報文後,就認為連線建立好了(先處於連線建立好的狀態),而伺服器是要收到客戶端的確認報文後才認為連線建立好了。
那麼也可能存在這樣的問題,在最後一次握手時,伺服器沒有收到客戶端的確認報文,此時的狀態是,客戶端處於建立連線狀態,伺服器處於沒有建立連線狀態,此時客戶端負責維護這次連線

  1. 三次握手中,是誰先發起請求,誰來負責維護這次連線,那麼會出現上面類似SYN洪水的問題嗎?顯然是不會的,自己發出SYN,最終無效連線還是建立在自己這方,客戶端也不會這麼無聊吧
  2. 而當客戶端嘗試向伺服器傳送資料時,伺服器看到的是,還沒有建立連線的資料,伺服器會響應一個帶有RST標誌位的報文,告知客戶端你需要先建立連線,此時當客戶端收到這個報文時,就會重新發起建立連線的請求。

總結下來就是,三次握手中,即使建立連線失敗,對伺服器是沒有影響的,保證伺服器的安全,而對客戶端而言,也不過是多次建立連線而已。並且在經過驗證,三次握手的成功率也是非常高的。

四次握手可行嗎?

很明顯,三次握手已經可以滿足我們的需求了,也就沒必要多一次而浪費資源了。
在兩次握手和三次握手的方案中,我們發現要保證客戶端先建立連線的話,能保證連線的安全建立。若是偶數次握手,或者是說讓伺服器先建立連線,就是不安全不可行的方案。所以四次 握手是不可行的。

什麼是四次揮手


在網路資料傳輸中,傳輸層協議斷開連線的過程我們稱為四次揮手
第一次,A端像B端傳送FIN結束報文段,準備關閉連線
第二次,B端確認A端的FIN,表示自己已經收到對方關閉連線的請求
中間這段時間,A端停止向B端傳送資料,但是B端可以向A端傳送資料,要將自己未處理完任務處理完
第三次,B端向A端傳送FIN結束報文段,準備關閉連線
第四次,A端確認B端的FIN,進入TIME_WAIT狀態,此時A端程序已經退出,但是連線還在
當B端收到A端的ACK之後,先斷開連線
當A端等待2 MSL之後,確認的B端接收到ACK後,再斷開連線
發起斷開連線請求的一端最後要進入有一個TIME_WAIT狀態
發起連線請求的可以是客戶端也可以是伺服器端

為什麼斷開連線要四次?
不像建立連線的過程,伺服器端在呼叫了accept()之後,剩下的都交給核心來處理,使用者空間不用做什麼,斷開連線是,A端呼叫close()關閉檔案描述符後,A端就停止傳送資料了進行傳送,B端收到後結束報文段之後,的得知A端要斷開連線了,但是B端可能有自己還沒有處理完的資料,不能立即斷開連線,就要先給出回覆,表示自己已經收到訊息了,然後將自己的資料處理完之後,可以斷開連線的時候,再呼叫close()發出斷開連線請求,在收到A端的確認回覆之後,斷開連線,這樣看來每一步都不能少,但是有時候若伺服器端沒有什麼要處理的資料,就看可以直接呼叫close()捎帶上響應報文,此時就是3次
為什麼先發起斷開連線請求的一端最後要等待 2MSL?
MSL為一段報文從一段到一段的最大時間,也稱為報文的最大生存時間,我們假設在上面的四次揮手過程中最後A端在收到B端的FIN之後,就關閉連線,最後B端在收到A端的確認報文之後也斷開連線,這種情況是我們預期的
試想是否存在這樣的情況,在A端已經關閉連線後,但是發給B端的ACK報文中途丟失,此時B端就會重發FIN結束報文段,但是A端已經關閉與這臺伺服器的連線,並且已經開始了一段新的連線,那麼A端收到這個過期的FIN,誤認為是關閉當前連線,給出錯誤處理。
也就是說A端等待 2MSL就 可以保證在B端沒有收到A 到ACK時,B端重發的FIN,A端來的及處理,然後重新確認等待2 MSL,保證了最後的ACK 報文 B端成功收到。

相關推薦

握手握手backlog

acc 前端 接受 close overflow 場景 路徑 inux 隨機 TCP:三次握手、四次握手、backlog及其他 TCP是什麽 首先看一下OSI七層模型: 然後數據從應用層發下來,會在每一層都加上頭部信息進行封裝,然後再發送到數據接收端,這個基本的流

TCP握手握手

如果 就是 三次 應用程序 產生 通知 的確 計時器 同時  前言   TCP用於應用程序之間的通信。當應用程序希望通過TCP與另一個應用程序通信時,它會發送一個通信請求。這個請求必須被送到一個確切的地址。在雙方“握手”之後,TCP將在兩個應用程序之間建立一個全雙工的通信

TCP握手端口和有限狀態機

TCP三次握手、四次端口和有限狀態機1、TCP用三次握手(three-way handshake) 一對終端同時初始化一個它們之間的連接是可能的。但通常是由一端打開一個套接字(socket)然後監聽來自另一方的連接,這就是通常所指的被動打開(passive open)。服務器端被被動打開以後,用戶端就能開始創

TCP握手揮手

序號 img 因此 連接重置 .com 也不會 tcp標誌位 失效 gem TCP是主機對主機層的傳輸控制協議,提供可靠的連接服務,采用三次握手確認建立一個連接: 位碼即tcp標誌位,有6種表示: SYN(synchronous建立連接) ACK(acknowledgeme

TCP協議握手揮手

TCP的概述 TCP 把連線作為最基本的物件,每一條 TCP 連線都有兩個端點,這種斷點我們叫作套接字(socket),它的定義為埠號拼接到 IP 地址即構成了套接字,例如,若 IP 地址為 192.3.4.16  而埠號為 80,那麼得到的套接字為 192.3.4.16:80 。 但凡是基於

面試握手揮手

建立TCP需要三次握手才能建立,而斷開連線則需要四次揮手。 https://www.cnblogs.com/thrillerz/p/6464203.html ACK:是用來應答的 SYN:是用來同步的 FIN:終端連線請求 三次握手建立連線 首先Client端傳送連線請求報文,Server段接受連線後回

淺析TCP握手揮手

一、 1、2、3是三次握手 1:客戶端向伺服器請求連線 2:伺服器確認可以連線,,(相當於告訴客戶端,我準備好啦) 3:客戶端確認可以連線,,(客戶端:我也準備好啦) 二、 4,也就是Socket通訊了 三、 5、6、7、8是四次揮手,這裡假設是Client

用wireshark抓包分析TCP握手揮手以及TCP實現可靠傳輸的機制(轉)

關於TCP三次握手和四次揮手大家都在《計算機網路》課程裡學過,還記得當時高超老師耐心地講解。大學裡我遇到的最好的老師大概就是這位了,雖然他只給我講過《java程式設計》和《計算機網路》,但每次課幾乎都動手敲程式碼或者當場做實驗。好了不扯了,下面進入正題。      關

詳解握手揮手

TCP是什麼? 具體的關於TCP是什麼,我不打算詳細的說了;當你看到這篇文章時,我想你也知道TCP的概念了,想要更深入的瞭解TCP的工作,我們就繼續。它只是一個超級麻煩的協議,而它又是網際網路的基礎,也是每個程式設計師必備的基本功。首先來看看OSI的七層模型: 我們需要知道TCP工作在網路OSI的七層

面試題:TCP握手握手內容整理

第一次握手:建立連線時,客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SENT狀態,等待伺服器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。 第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(s

握手揮手的理解

client: socket connect send encode recv decode close server: socket bind listen 1.主動轉換成被動 2.向系統申請佇列(5) accept 1.阻塞等待

TCP協議詳解(TCP報文握手揮手TIME_WAIT狀態滑動視窗擁塞控制粘包問題狀態轉換圖)

一、TCP報文 【重要的欄位】: 序號:Seq序號,佔32位,用來標識從TCP源端向目的端傳送的位元組流,發起方傳送資料時對此進行標記; 確認序號:Ack序號,佔32位,只有ACK標誌位為1時,確

TCP/IP握手揮手11種狀態知識點整理

做應用層做得比較久了,底層的一些知識點有點遺忘,今天正好有空梳理了一下關於TCP/IP通訊相關的一些知識點。 TCP三次握手建立連線 Tcp頭部   六個標誌位中,我們要用到三個: SYN:SYNchronous,SYN= 1 表示這是一個連線請求或連線接受報文。在建立連線時用來進行同步序號(個人理解

為什麼TCP需要“握手揮手”?

更多傳輸層知識點:傳輸層的UDP通訊和TCP通訊 為什麼TCP需要“三次握手”、“四次揮手”? 三次握手過程 1、連線過程最新的一次連線都不可靠,因為最新的這次連線可能丟包、損壞等。 2、如果是兩次握手,伺服器在接收到連線請求後,需要建立資料結構來維護連線請求,如果伺服器

【前端面試】OSI七層模型和TCP握手揮手

osi七層模型: TCP協議頭部的格式 Source Port和DestinationPort:分別佔用16位,表示源埠號和目的埠號;用於區別主機中的不同程序,而IP地址是用來區分不同的主機的,源埠號和目的埠號配合上IP首部中的源IP地址和目的

TCP協議握手揮手詳解

本文參考自文章http://blog.csdn.net/whuslei/article/details/6667471/,但文章只給了大致流程(某些部分太大略了)。這裡將詳細流程記錄下來,並添加了自己

TCP 握手揮手以及安全傳輸

TCP協議使用連線管理、流量控制、擁塞控制三大機制來保證可靠性傳輸 三次握手: 開始客戶端處於 close  初始關閉狀態 客戶端:傳送SYN=1(表示請求連線),seq=x(申明自己序號為x) 之後客戶端處於 syn_sent  表示已經發送syn報文

URL訪問網站的過程(握手揮手),傳送RST包的種情況,常用協議

URL訪問網站(三次握手、四次揮手) 1)獲得域名所對應的IP地址,若DNS快取中沒有相關資料,則IE瀏覽器向DNS伺服器發出DNS請求,以獲取域名所對應的IP地址。 2)IE瀏覽器與域名地址建立TCP連線,三次握手 3)http訪問 4)斷開TCP連線,四次揮手

TCP握手揮手內容整理

轉自:https://blog.csdn.net/qq_18425655/article/details/52163228 三次握手: 在TCP/IP協議中,TCP協議提供可靠的連線服務,採用三次握手建立一個連線. 一次握手:建立連線時,客戶端傳送syn包(syn=

面試總結:TCP握手揮手

TCP三次握手、四次揮手 1、三次握手 三次握手的過程如下: 客戶端A 傳送SYN(seq = x)報文給伺服器B,然後進入SYN_SENT狀態; B收到SYN報文,迴應一個SYN(se