1. 程式人生 > >TCP三次握手原理詳解

TCP三次握手原理詳解

TCP/IP協議不是TCPIP這兩個協議的合稱,而是指因特網整個TCP/IP協議族。

從協議分層模型方面來講,TCP/IP由四個層次組成:網路介面層網路層傳輸層應用層

TCP協議:即傳輸控制協議,它提供的是一種可靠的資料流服務。當傳送受差錯干擾的資料,或舉出網路故障,或網路負荷太重而使網際基本傳輸系統不能正常工作時,就需要通過其他的協議來保證通訊的可靠。TCP就是這樣的協議。TCP採用“帶重傳的肯定確認”技術來實現傳輸的可靠性。並使用“滑動視窗”的流量控制機制來高網路的吞吐量。TCP通訊建立實現了一種“虛電路”的概念。雙方通訊之前,先建立一條連結然後雙方就可以在其上傳送資料流。這種資料交換方式能提高效率,但事先建立連線和事後拆除連線需要開銷。

本文主要講述的是

1、TCP三次握手原理,以及為什麼要三次握手,兩次握手帶來的不利後果。

2、TCP四次揮手原理,為什麼要四次揮手。

TCP三次握手原理:

首先,給張圖片,建立TCP三次握手的直觀印象。

                                   

每次握手(傳送資料請求或應答)時,傳送的資料為TCP報文,TCP段包含了源/目的地址,埠號,初始序號,滑動視窗大小,視窗 擴大因子,最大報文段長度等。還有一些標誌位:

(1)SYN:同步序號

(2)ACK:應答回覆

(3)RST:復位連線,消除舊有的同步序號

(4)PSH:儘可能的將資料送往接收程序

(5)FIN:傳送方完成資料傳送

(6)URG

從圖中,可以看出三次握手的基本步驟是:

第一次握手:客戶端向伺服器端傳送連線請求包SYN(syn=j),等待伺服器迴應;

第二次握手:伺服器端收到客戶端連線請求包SYN(syn=j)後,將客戶端的請求包SYN(syn=j)放入到自己的未連線佇列,此時伺服器需要傳送兩個包給客戶端;

  (1)向客戶端傳送確認自己收到其連線請求的確認包ACK(ack=j+1),向客戶端表明已知道了其連線請求

  (2)向客戶端傳送連線詢問請求包SYN(syn=k),詢問客戶端是否已經準備好建立連線,進行資料通訊;

  即在第二次握手時伺服器向客戶端傳送ACK(ack=j+1)和SYN(syn=k)包,此時伺服器進入SYN_RECV狀態。

第三次握手:客戶端收到伺服器的ACK(ack=j+1)和SYN(syn=k)包後,知道了伺服器同意建立連線,此時需要傳送連線已建立的訊息給伺服器;

  向伺服器傳送連線建立的確認包ACK(ack=k+1),迴應伺服器的SYN(syn=k)告訴伺服器,我們之間已經建立了連線,可以進行資料通訊。

  ACK(ack=k+1)包傳送完畢,伺服器收到後,此時伺服器與客戶端進入ESTABLISHED狀態,開始進行資料傳送。 

為什麼不能只兩次握手?

有了三次握手的詳細步驟,就可以分析為什麼需要三次握手而不是兩次握手了。

三次握手的目的:消除舊有連線請求的SYN訊息對新連線的干擾,同步連線雙方的序列號和確認號並交換TCP 視窗大小資訊。

設想:如果只有兩次握手,那麼第二次握手後伺服器只向客戶端傳送ACK包,此時客戶端與伺服器端建立連線。在這種握手規則下: 

假設:如果傳送網路阻塞,由於TCP/IP協議定時重傳機制,B向A傳送了兩次SYN請求,分別是x1和x2,且因為阻塞原因,導致x1連線請求和x2連線請求的TCP視窗大小和資料報文長度不一致,如果最終x1達到A,x2丟失,此時A同B建立了x1的連線,這個時候,因為AB已經連線,B無法知道是請求x1還是請求x2同B連線,如果B預設是最近的請求x2同A建立了連線,此時B開始向A傳送資料,資料報文長度為x2定義的長度,視窗大小為x2定義的大小,而A建立的連線是x1,其資料包長度大小為x1,TCP視窗大小為x1定義,這就會導致A處理資料時出錯。

很顯然,如果A接收到B的請求後,A向B傳送SYN請求y3(y3的視窗大小和資料報長度等資訊為x1所定義),確認了連線建立的視窗大小和資料報長度為x1所定義,A再次確認回答建立x1連線,然後開始相互傳送資料,那麼就不會導致資料處理出錯了。

TCP釋放連線需四次揮手

先看圖,直觀的瞭解下:

                                 

需四次揮手原因:由於TCP的半關閉特性,TCP連線時雙全工(即資料在兩個方向上能同時傳遞),因此,每個方向必須單獨的進行關閉。這個原則就是:當一方完成它的資料傳送任務後就能傳送一個FIN來終止這個方向上的連線。當一端收到一個FIN後,它必須通知應用層另一端已經終止了那個方向的資料傳送。即收到一個FIN意味著在這一方向上沒有資料流動了。

目的:保證伺服器與客戶端都能完全的接受對方傳送的資料。

假設客戶機A向伺服器B請求釋放TCP連線,則:

第一次揮手:主機A向主機B傳送FIN包;A告訴B,我(A)傳送給你(B)的資料大小是N,我傳送完畢,請求斷開A->B的連線。

第二次揮手:主機B收到了A傳送的FIN包,並向主機A傳送ACK包;B回答A,是的,我總共收到了你發給我N大小的資料,A->B的連線關閉。

第三次揮手:主機B向主機A傳送FIN包;B告訴A,我(B)傳送給你(A)的資料大小是M,我傳送完畢,請求斷開B->A的連線。

第四次揮手:主機A收到了B傳送的FIN包,並向主機B傳送ACK包;A回答B,是的,我收到了你傳送給我的M大小的資料,B->A的連線關閉。

相關推薦

TCP握手原理

TCP/IP協議不是TCP和IP這兩個協議的合稱,而是指因特網整個TCP/IP協議族。 從協議分層模型方面來講,TCP/IP由四個層次組成:網路介面層、網路層、傳輸層、應用層。 TCP協議:即傳輸控制協議,它提供的是一種可靠的資料流服務。當傳送受差錯干擾的資料,或舉出

TCP 握手原理以及半連線和全連線

問題描述 JAVA的client和server,使用socket通訊。server使用NIO。  間歇性的出現client向server建立連線三次握手已經完成,但server的selector沒有響應到這連線。  出問題的時間點,會同時有很多連接出現這個問題

TCP握手原理,你真的瞭解嗎?

最近碰到一個問題,Client 端連線伺服器總是拋異常。在反覆定位分析、並查閱各種資料搞懂後,我發現並沒有文章能把這兩個佇列以及怎麼觀察他們的指標說清楚。 問題描述 場景:Java 的 Client 和 Server,使用 Socket 通訊。Server 使用 NIO。 問題: 間歇性出現 Clien

TCP 握手原理,你真的理解嗎

最近,阿里中介軟體小哥哥蟄劍碰到一個問題——client端連線伺服器總是拋異常。在反覆定位分析、並查閱各種資料文章搞懂後,他發現沒有文章把這兩個佇列以及怎麼觀察他們的指標說清楚。 因此,蟄劍寫下這篇文章,希望藉此能把這個問題說清楚。歡迎大家一起交流探討。 問題描述

TCP握手和四揮手

tcp三次握手和四次揮手詳解TCP(Transmission Control Protocol)網絡傳輸控制協議,是一種面向連接的、可靠的、基於字節流的傳輸層通信協議,數據傳輸前建立連接的工作要經過三次握手,數據傳輸後斷開連接的工作要經過四次揮手。工作過程TCP標誌位:TCP共有6個標誌位,分別是:SYN(s

TCP握手及釋放連接過程

alt 信息 情況 序列號 丟失 浪費 需要 nbsp image TCP在傳輸之前會進行三次溝通,一般稱為“三次握手”,傳完數據斷開的時候要進行四次溝通,一般稱為“四次揮手”。 兩個序號和三個標誌位: (1)序號:seq 序號,占 32 位,用來標識從 TCP

TCP握手與四揮手

socket 抓包 掉線 syn 還要 就是 創建 iss closed TCP三次握手與四次揮手詳解 @(TCP/IP) [TOC] 1.TCP報文格式 TCP(Transmission Control Protocol) 傳輸控制協議。TCP是主機對主機層的傳輸控制協議

TCP握手揮手

位置 center 下載 服務器端 沒有 ctrl+c 有效 網絡協議 為我 相對於SOCKET開發者,TCP創建過程和鏈接折除過程是由TCP/IP協議棧自動創建的.因此開發者並不需要控制這個過程.但是對於理解TCP底層運作機制,相當有幫助. 而且對於有網絡協議工程師之類

TCP握手與四揮手

一、TCP三次握手和socket詳解 1.TCP連線 第一次:cli傳送SYN包(SYN = j)到ser,並且進入SYN_SEND狀態,等待伺服器確認; 第二次:ser收到SYN包,必須確認客戶的SYN(ACK = j+1),同事自己也傳送一個SYN包(SYN = k),即SYN+

tcp握手揮手(與udp的區別)

tcp詳解 TCP使用固定的連線 TCP用於應用程式之間的通訊 IP負責計算之間的通訊 TCP負責把資料分割並裝入IP包,然後他們到達的時候重新組合他們。 IP負責將包傳送至接收者。 TCP報文格式 URG:緊急標誌。緊急標誌位“1”標明該位有效。 ACK:確認

TCP握手揮手過程

TCP頭部: 其中 ACK   SYN  序號  這三個部分在以下會用到,它們的介紹也在下面。 暫時需要的資訊有: ACK : TCP協議規定,只有ACK=1時有效,也規定連線建立後所有傳送的報文的ACK必須為1 SYN(SYNchronization) : 在連線建立

tcp握手揮手(及原因)

TCP(Transmission Control Protocol,傳輸控制協議)是 面向連線的協議,也就是說在收發資料之前,必須先和對方建立連線, 一個TCP連線必須要經過三次“對話”才能建立起來,其中的過程非常複雜,只簡單的 描述下這三次對話的簡單過程:主機A向主機B發

TCP握手報文 例項&&syn flood C/C++ 完整程式碼實現

在TCP/IP協議中,TCP協議提供可靠的連線服務,採用三次握手建立一個連線。 第一次握手: 建立連線時,客戶端傳送syn包到伺服器,並進入SYN_SENT狀態,等待伺服器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。 第二次握手

TCP握手及四揮手及常見面試題

TCP的報頭: 1. 源埠號:表示傳送端埠號,欄位長為16位。 2. 目標埠號:表示接收埠號,欄位長為16位。 3. 序列號:表示傳送資料的位置,欄位長為32位。每傳送一次資料,就累加一次該資料位元組數的大小。 注意:序列號不會從0或1開始,而是在建

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

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

TCP握手和四揮手以及原因

三次握手 三次握手(three times handshake;three-way handshake)所謂的“三次握手”即對每次傳送的資料量是怎樣跟蹤進行協商使資料段的傳送和接收同步,根據所接收到的資料量而確定的資料確認數及資料傳送、接收完畢後何時撤消聯絡,

wireshark抓包圖解 TCP握手/四揮手

原地址:http://www.seanyxie.com/wireshark%E6%8A%93%E5%8C%85%E5%9B%BE%E8%A7%A3-tcp%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B%E5%9B%9B%E6%AC%A1%E6%8

TCP握手(建立連線)與四揮手(釋放連線)

上圖畫出了TCP的建立連線的過程。假定主機A執行的是TCP客戶程式,而B執行TCP服務程式。最初兩端的TCP程序都處於 CLOSED(關閉)狀態。圖中在主機下面的方框分別是TCP程序所處的狀態。請注意,A主動開啟連線,而B被動開啟連線。 B的TCP伺服器程

TCP握手建連以及四揮手斷連

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

Linux 網路程式設計 全)--------TCP握手、資料傳輸、四揮手、滑動視窗

寫在前面:今天中秋佳節,首先祝大家佳節快樂,身體健康,恭喜發財。吃也吃了,喝也喝了,玩也玩了,乾點正事吧。 說一下寫這個系列的目的,隨著對物聯網開發的深入,越來越覺得自己網路基礎知識的薄弱,雖然開發過程中不需要對網路基礎有很深入的瞭解照樣能進行,但有一些問題仍然是不知其因,