當前位置:首頁 » 網路連接 » 計算機網路tcp三次握手分析
擴展閱讀
發布租房找哪個網站 2025-09-25 10:29:21

計算機網路tcp三次握手分析

發布時間: 2022-11-02 09:09:59

『壹』 簡述TCP的三次握手過程。

TCP握手協議 :在TCP/IP協議中,TCP協議提供可靠的連接服務,採用三次握手建立一個連接。

1、第一次握手:建立連接時,客戶端發送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認; SYN:同步序列編號(Synchronize Sequence Numbers)

2、第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;

3、第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。

完成三次握手,客戶端與伺服器開始傳送數據。

『貳』 簡述TCP的三次握手過程。

TCP握手協議
在TCP/IP協議中,TCP協議提供可靠的連接服務,採用三次握手建立一個連接.
第一次握手:建立連接時,客戶端發送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
SYN:同步序列編號(Synchronize Sequence Numbers)
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手.
完成三次握手,客戶端與伺服器開始傳送數據

『叄』 網路 之 三次握手&四次揮手 介紹

要了解三次握手&四次揮手的過程,就需要對TCP的報頭以及有限狀態機的概念有所了解,本文將介紹TCP報頭的欄位的含義,以及有限狀態機各個狀態的意義,最後對三次握手和四次揮手的過程做介紹

TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接的、可靠的、基於位元組流的傳輸層通信協議,由IETF的RFC 793定義。在簡化的計算機網路OSI模型中,它完成第四層傳輸層所指定的功能,用戶數據報協議(UDP)是同一層內另一個重要的傳輸協議。在網際網路協議族(Internet protocol suite)中,TCP層是位於IP層之上,應用層之下的中間層。不同主機的應用層之間經常需要可靠的、像管道一樣的連接,但是IP層不提供這樣的流機制,而是提供不可靠的包交換。

這里將介紹TCP報頭的特性以及TCP報頭各個欄位的含義

.工作在傳輸層面向連接協議

.全雙工協議

.半關閉

.錯誤檢查

.將數據打包成段,排序

.確認機制

.數據恢復,重傳

.流量控制,滑動窗口

.擁塞控制,慢啟動和擁塞避免演算法

.源埠、目標埠 :計算機上的進程要和其他進程通信是要通過計算機埠的,而一個計算機埠某個時刻只能被一個進程佔用,所以通過指定源埠和目標埠,就可以知道是哪兩個進程需要通信。源埠、目標埠是用16位表示的,可推算計算機的埠個數為2^16個

. 序列號 :表示本報文段所發送數據的第一個位元組的編號。在TCP連接中所傳送的位元組流的每一個位元組都會按順序編號。由於序列號由32位表示,所以每2^32個位元組,就會出現序列號回繞,再次從0 開始

. 確認號 :表示接收方期望收到發送方下一個報文段的第一個位元組數據的編號。也就是告訴發送發:我希望你(指發送方)下次發送的數據的第一個位元組數據的編號是這個確認號

. 數據偏移 :表示TCP報文段的首部長度,共4位,由於TCP首部包含一個長度可變的選項部分,需要指定這個TCP報文段到底有多長。它指出TCP 報文段的數據起始處距離TCP 報文段的起始處有多遠。該欄位的單位是32位(即4個位元組為計算單位),4位二進制最大表示15,所以數據偏移也就是TCP首部最大60位元組

. URG :表示本報文段中發送的數據是否包含緊急數據。後面的緊急指針欄位(urgent pointer)只有當URG=1時才有效

. ACK :表示是否前面的確認號欄位是否有效。ACK=1,表示有效。只有當ACK=1時,前面的確認號欄位才有效。TCP規定,連接建立後,ACK必須為1,帶ACK標志的TCP報文段稱為確認報文段

. PSH :提示接收端應用程序應該立即從TCP接收緩沖區中讀走數據,為接收後續數據騰出空間。如果為1,則表示對方應當立即把數據提交給上層應用,而不是緩存起來,如果應用程序不將接收到的數據讀走,就會一直停留在TCP接收緩沖區中

. RST :如果收到一個RST=1的報文,說明與主機的連接出現了嚴重錯誤(如主機崩潰),必須釋放連接,然後再重新建立連接。或者說明上次發送給主機的數據有問題,主機拒絕響應,帶RST標志的TCP報文段稱為復位報文段

. SYN :在建立連接時使用,用來同步序號。當SYN=1,ACK=0時,表示這是一個請求建立連接的報文段;當SYN=1,ACK=1時,表示對方同意建立連接。SYN=1,說明這是一個請求建立連接或同意建立連接的報文。只有在前兩次握手中SYN才置為1,帶SYN標志的TCP報文段稱為同步報文段

. FIN :表示通知對方本端要關閉連接了,標記數據是否發送完畢。如果FIN=1,即告訴對方:「我的數據已經發送完畢,你可以釋放連接了」,帶FIN標志的TCP報文段稱為結束報文段

. 窗口大小 :表示現在充許對方發送的數據量,也就是告訴對方,從本報文段的確認號開始允許對方發送的數據量

. 校驗和 :提供額外的可靠性

. 緊急指針 :標記緊急數據在數據欄位中的位置

. 選項部分 :其最大長度可根據TCP首部長度進行推算。TCP首部長度用4位表示,選項部分最長為:(2^4-1)*4-20=40位元組

常見選項 :

.最大報文段長度:MaxiumSegment Size,MSS

.窗口擴大:Windows Scaling

.時間戳:Timestamps

.a 最大報文段長度

指明自己期望對方發送TCP報文段時那個數據欄位的長度。默認是536位元組。數據欄位的長度加上TCP首部的長度才等於整個TCP報文段的長度。MSS不宜設的太大也不宜設的太小。若選擇太小,極端情況下,TCP報文段只含有1位元組數據,在IP層傳輸的數據報的開銷至少有40位元組(包括TCP報文段的首部和IP數據報的首部)。這樣,網路的利用率就不會超過1/41。若TCP報文段非常長,那麼在IP層傳輸時就有可能要分解成多個短數據報片。在終點要把收到的各個短數據報片裝配成原來的TCP報文段。當傳輸出錯時還要進行重傳,這些也都會使開銷增大。因此MSS應盡可能大,只要在IP層傳輸時不需要再分片就行。在連接建立過程中,雙方都把自己能夠支持的MSS接入這一欄位。MSS只出現在SYN報文中。即:MSS出現在SYN=1的報文段中

.b 窗口擴大

為了擴大窗口,由於TCP首部的窗口大小欄位長度是16位,所以其表示的最大數是65535。但是隨著時延和帶寬比較大的通信產

生(如衛星通信),需要更大的窗口來滿足性能和吞吐率,所以產生了這個窗口擴大選項

.c 時間戳

可以用來計算RTT(往返時間),發送方發送TCP報文時,把當前的時間值放入時間戳欄位,接收方收到後發送確認報文時,把這個時間戳欄位的值復制到確認報文中,當發送方收到確認報文後即可計算出RTT。也可以用來防止回繞序號PAWS,也可以說可以用來區分相同序列號的不同報文。因為序列號用32為表示,每2^32個序列號就會產生回繞,那麼使用時間戳欄位就很容易區分相同序列號的不同報文

2.3 TCP協議PORT

.傳輸層通過port號,確定應用層協議

.Port number:

. tcp :0-65535,傳輸控制協議,面向連接的協議;通信前需要建立虛擬鏈路;結束後拆除鏈路.

. udp :0-65535,User Datagram Protocol,無連接的協議.

. IANA :互聯網數字分配機構(負責域名,數字資源,協議分配)

0-1023:系統埠或特權埠(僅管理員可用) ,眾所周知,永久的分配給固定的系統應用使用,22/tcp(ssh), 80/tcp(http), 443/tcp(https)

1024-49151:用戶埠或注冊埠,但要求並不嚴格,分配給程序注冊為某應用使用,1433/tcp(SqlServer),1521/tcp(oracle),

3306/tcp(mysql),11211/tcp/udp(memcached)

49152-65535:動態埠或私有埠,客戶端程序隨機使用的埠

其范圍的定義:/proc/sys/net/ipv4/ip_local_port_range

有限狀態機,(英語:Finite-state machine, FSM),又稱有限狀態自動機,簡稱狀態機,是表示有限個狀態以及在這些狀態之間的轉移和動作等行為的數學模型。

常見的計算機就是使用有限狀態機作為計算模型的:對於內存的不同狀態,CPU通過讀取內存值進行計算,更新內存中的狀態。CPU還通過消息匯流排接受外部輸入設備(如鍵盤、滑鼠)的指令,計算後更改內存中的狀態,計算結果輸出到外部顯示設備(如顯示器),以及持久化存儲在硬碟。

TCP協議也存在有限狀態機的概念,TCP 協議的操作可以使用一個具有 11 種狀態的有限狀態機來表示

.CLOSED 沒有任何連接狀態

.LISTEN 偵聽狀態,等待來自遠方TCP埠的連接請求

.SYN-SENT 在發送連接請求後,等待對方確認

.SYN-RECEIVED 在收到和發送一個連接請求後,等待對方確認

.ESTABLISHED 代表傳輸連接建立,雙方進入數據傳送狀態

.FIN-WAIT-1 主動關閉,主機已發送關閉連接請求,等待對方確認

.FIN-WAIT-2 主動關閉,主機已收到對方關閉傳輸連接確認,等待對方發送關閉傳輸連接請求

.TIME-WAIT 完成雙向傳輸連接關閉,等待所有分組消失

.CLOSE-WAIT 被動關閉,收到對方發來的關閉連接請求,並已確認

.LAST-ACK 被動關閉,等待最後一個關閉傳輸連接確認,並等待所有分組消失

.CLOSING 雙方同時嘗試關閉傳輸連接,等待對方確認

.客戶端通過connect系統調用主動與伺服器建立連接connect系統調用首先給伺服器發送一個同步報文段,使連接轉移到SYN_SENT狀態。

.此後connect系統調用可能因為如下兩個原因失敗返回:

.1、如果connect連接的目標埠不存在(未被任何進程監聽),或者該埠仍被處於TIME_WAIT狀態的連接所佔用(見後文),則伺服器將給客戶端發送一個復位報文段,connect調用失敗。

.2、如果目標埠存在,但connect在超時時間內未收到伺服器的確認報文段,則connect調用失敗。

.connect調用失敗將使連接立即返回到初始的CLOSED狀態。如果客戶端成功收到伺服器的同步報文段和確認,則connect調用成功返回,連接轉移至ESTABLISHED狀態

.當客戶端執行主動關閉時,它將向伺服器發送一個結束報文段FIN,同時連接進入FIN_WAIT_1狀態。若此時客戶端收到伺服器專門用於確認目的的確認報文段,則連接轉移至FIN_WAIT_2狀態。當客戶端處於FIN_WAIT_2狀態時,伺服器處於CLOSE_WAIT狀態,這一對狀態是可能發生半關閉的狀態。此時如果伺服器也關閉連接(發送結束報文段),則客戶端將給予確認並進入TIME_WAIT狀態

.客戶端從FIN_WAIT_1狀態可能直接進入TIME_WAIT狀態(不經過FIN_WAIT_2狀態),前提是處於FIN_WAIT_1狀態的伺服器直接收到帶確認信息的結束報文段(而不是先收到確認報文段,再收到結束報文段)

注意,客戶端先發送一個FIN給服務端,自己進入了FIN_WAIT_1狀態,這時等待接收服務端的報文,該報文會有三種可能:

a 只有服務端的ACK,只收到伺服器的ACK,客戶端會進入FIN_WAIT_2狀態,後續當收到服務端的FIN時,回應發送一個ACK,會進入到TIME_WAIT狀態,這個狀態會持續2MSL(TCP報文段在網路中的最大生存時間,RFC 1122標準的建議值是2min).客戶端等待2MSL,是為了當最後一個ACK丟失時,可以再發送一次。因為服務端在等待超時後會再發送一個FIN給客戶端,進而客戶端知道ACK已丟失

b 只有服務端的FIN,回應一個ACK給服務端,進入CLOSING狀態,然後接收到服務端的ACK時,進入TIME_WAIT狀態

c 同時收到服務端的ACK和FIN,直接進入TIME_WAIT狀態

.收到伺服器ACK後,客戶端處於FIN_WAIT_2狀態,此時需要等待伺服器發送結束報文段,才能轉移至TIME_WAIT狀態,否則它將一直停留在這個狀態。如果不是為了在半關閉狀態下繼續接收數據,連接長時間地停留在FIN_WAIT_2狀態並無益處。連接停留在FIN_WAIT_2狀態的情況可能發生在:客戶端執行半關閉後,未等伺服器關閉連接就強行退出了。此時客戶端連接由內核來接管,可稱之為孤兒連接(和孤兒進程類似)。

.Linux為了防止孤兒連接長時間存留在內核中,定義了兩個內核參數:

./proc/sys/net/ipv4/tcp_max_orphans 指定內核能接管的孤兒連接數目

./proc/sys/net/ipv4/tcp_fin_timeout指定孤兒連接在內核中生存的時間

TCP協議中的三次握手和四次揮手

客戶機端的三次握手和四次揮手

伺服器端的三次握手和四次揮手

1 client 首先發送一個連接試探,此時ACK=0,表示確認號無效,SYN=1表示這是一個請求連接或連接接受報文,同時表示這個數據包不攜帶數據,seq=x表示此時client自己數據的初始序號是x,這時候client進入syn_sent狀態,表示客戶端等等伺服器的回復

2 server 監聽到連接請求報文後,如同意建立連接,則向client發送確認,將TCP報文首部的SYN和ACK都置為1,因為client上一個請求連接的報文中seq=x,所以伺服器端這次就發ack=x+1,表示伺服器端希望客戶端下一個報文段的第一個數據位元組序號是x+1,同時表示x為止的所有數據都已經正確收到了,其中,此時伺服器端發送seq=y表示server自己的初始序號是y,這時伺服器進入了SYN_RCVD狀態,表示伺服器已經收到了客戶端的請求,等待client的確認。

3 client收到確認後還要再次給伺服器端發送確認,同時攜帶要發給server的數據。ACK=1表示確認號ack=y+1有效,client這時的序號seq為x+1

一旦client確認後,這個TCP連接的client 和 server 都直接進入到established狀態,可以發起http請求了

4.2 四次揮手詳解

第一次揮手:client向server,發送FIN報文段,表示關閉數據傳送,此時ACK=0,seq=u,表示客戶端此時數據的報文序號是u,此時,client進入FIN_WAIT_1狀態,表示沒有數據要傳輸了

第二次揮手:server收到FIN報文段後進入CLOSE_WAIT狀態(被動關閉),然後發送ACK確認,表示同意你關閉請求了,主機到主機的數據鏈路關閉,同時發送seq=v,表示此時server端的數據包位元組序號是v,ack=u+1,表示希望client發送的下一個包的序號是u+1,表示確認了序號u之前的包都已經收到,客戶端收到server的ACK報文後,進入FIN_WAIT_2狀態

第三次揮手:server等待client發送完數據,發送FIN=1,ACK=1到client請求關閉,server進入LAST_ACK狀態。此時發送的seq有變化,因為上一個ACK的後server端可能又發送了一些數據,說以數據位元組序號發送了變化,為w,但是ack還是保持不變

第四次揮手:client收到server發送的FIN後,回復ACK確認到server,client進入TIME_WAIT狀態。發送ack=w+1,表示希望伺服器下個發送的報文的位元組序號是w+1,確認了伺服器之前發送的w位元組都已經正確收到,發送seq=u+1表示當前client的位元組序號是u+1.server收到client的ACK後就關閉連接了,狀態為CLOSED。client等待2MSL,仍然沒有收到server的回復,說明server已經正常關閉了,client關閉連接。

其中,MSL(Maximum Segment Lifetime):報文最大生存時間,是任何報文段被丟棄前在網路內的最長時間。當client回復server的FIN後,等待(2-4分鍾),即使兩端的應用程序結束。

TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態的原因是如果client直接進入CLOSED狀態,由於IP協議不可靠性或網路問題,導致client最後發出的ACK報文未被server接收到,那麼server在超時後繼續向client重新發送FIN,而client已經關閉,那麼找不到向client發送FIN的連接,server這時收到RST並把錯誤報告給高層,不符合TCP協議的可靠性特點。如果client直接進入CLOSED狀態,而server還有數據滯留在網路中,當有一個新連接的埠和原來server的相同,那麼當原來滯留的數據到達後,client認為這些數據是新連接的。等待2MSL確保本次連接所有數據消失。

當客戶端等待2MSL後伺服器端沒有再次發送確認的報文後,client認為該次斷開連接已經正常結束,client進入closed狀態。四次揮手正式結束

『肆』 TCP三次握手原理

本文主要內容

1、TCP數據包格式

TCP數據包格式如下:

注意到中間還有幾個標志位:

數據包格式當中,最重要的是理解序號和確認序號。TCP為什麼是穩定可靠的,與序號與確認序號這套機制緊密相關,這也是TCP的精髓。

2、TCP的三次握手

眾所周知,TCP協議是可靠的,而UDP協議是不可靠的。在一些場景中必須用TCP,比如說用戶登錄,必須給出明確答復是否登錄成功等。而有些場景中,用戶是否接收到數據則不那麼關鍵,比如網路游戲當中,玩家射出一顆子彈,另外的玩家是否看到,完全取決於當前網路環境,如果網路卡頓,就會有玩家已經被射殺,但界面仍然刷新不出來的情況。這種情形適合UDP。

為了保證TCP協議可靠,在建立連接之時就要得到保證。

最初兩端的TCP進程都處於CLOSED關閉狀態,A主動打開連接,而B被動打開連接。(A、B關閉狀態CLOSED——B收聽狀態LISTEN——A同步已發送狀態SYN-SENT——B同步收到狀態SYN-RCVD——A、B連接已建立狀態ESTABLISHED)

B伺服器進程就處於LISTEN(收聽)狀態,等待客戶的連接請求。若有,則作出響應。

3、TCP的傳輸和確認

TCP 傳輸的可靠性,可以用一句話歸結:每收到對方數據,就發送 ACK 進行確定,發送方發送後沒有收到 ACK 就隔一段時間重發。

就是 A 向 B 發送消息(下面將 TCP 的報文直接看做是消息,消息一詞跟 TCP 報文混用),B 收到消息後需要向 A 發送 ACK。這個 ACK 相當於返回結果,沒有返回結果,A 就重新發送消息。

歸納起來,A 有 3 種消息需要確認。

另外 A 也可以發送 RST 消息,代表出錯了。出錯消息不需要確認。RST 也可以當成返回介面,替代正常的 ACK。返回 ACK,表示消息發送並處理成功,返回 RST 表示消息處理失敗。因為通過網路傳輸,還有第三種結果,就是不確定成功失敗。這樣歸納起來。就有三種返回結果。

這兩種具體情況,A 根本識別不了,都只能重發。

4、TCP的序號和確認序號

A 向 B 發送消息,假如同時發送 a、b、c、d 消息,因為通過網路,這些消息的順序並非固定的。而 B 返回 ACK 結果,這樣就有一個問題,這個結果到底對應了哪個消息?另外當 A 超時重發後,原來的消息延時一段時候,又重新到達了 B,這樣 B 就收到兩條相同的消息,那麼 B 怎麼確定這兩條消息是相同的呢?

為了解決這個對應問題,每一條消息都需要有一個編號,返回結果也應該有一個編號。TCP 的序號可以看成是發送消息的編號,確認序號可以看成是返回結果的編號。有了編號,重復的消息才可以忽略,返回結果(ACK)才可以跟消息對應起來。

當建立連接的時候,TCP 選定一個初始序號,之後每發送一個數據包(消息),就將序號遞增,保證每發送不同的數據包,數據包的序號都是不同的。TCP 是這樣處理的:

SYN、FIN 也需要遞增序號。不然 A 向 B 重發多個 SYN 或者 FIN, B 根本判斷不了 SYN 是否相同,這樣就不可以忽略重復的數據包了。

當 TCP 發送 ACK 時,相當於返回結果,需要帶有確認序號,以便跟發送的消息對應起來。

當發送包編號為 a,遞增長度為 len。其中 SYN 和 FIN 可以看成是遞增長度為 1。這條消息可以這樣表示為:

現在來回顧三次握手過程。 A 發送序列號x給 B , B 回復 A 確認號 x+ 1,同時發送序列號 y, A 接收到 B 的回復後,再回復確認號 y+1,同時發送序列號 x+1。給對方的回復一定是接收到的序號加1(或者是數據長度),這樣對方才能知道我已經收到了,這樣才能保證TCP是可靠的。

『伍』 tcp 為什麼要三次握手

tcp 為什麼要三次握手? 我們假設A和B是通信的雙方。我理解的握手實際上就是通信,發一次信息就是進行一次握手。
第一次握手:A給B打電話說,你可以聽到我說話嗎?
第二次握手:B收到了A的信息,然後對A說:我可以聽得到你說話啊,你能聽得到我說話嗎?
第三次握手:A收到了B的信息,然後說可以的,我要給你發信息啦!
在三次握手之後,A和B都能確定這么一件事:我說的話,你能聽到;你說的話,我也能聽到。這樣,就可以開始正常通信了。
注意:HTTP是基於TCP協議的,所以每次都是客戶端發送請求,伺服器應答,但是TCP還可以給其他應用層提供服務,即可能A、B在建立鏈接之後,誰都可能先開始通信。如果採用兩次握手,那麼只要伺服器發出確認數據包就會建立連接,但由於客戶端此時並未響應伺服器端的請求,那此時伺服器端就會一直在等待客戶端,這樣伺服器端就白白浪費了一定的資源。若採用三次握手,伺服器端沒有收到來自客戶端的再此確認,則就會知道客戶端並沒有要求建立請求,就不會浪費伺服器的資源。

『陸』 一文搞懂TCP的三次握手和四次揮手

TCP的三次握手和四次揮手實質就是TCP通信的連接和斷開。

三次握手:為了對每次發送的數據量進行跟蹤與協商,確保數據段的發送和接收同步,根據所接收到的數據量而確認數據發送、接收完畢後何時撤消聯系,並建立虛連接。

四次揮手:即終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務端總共發送4個包以確認連接的斷開。

TCP三次握手、四次揮手時序圖

TCP協議位於傳輸層,作用是提供可靠的位元組流服務,為了准確無誤地將數據送達目的地,TCP協議採納三次握手策略。

三次握手原理:

第1次握手:客戶端發送一個帶有SYN(synchronize)標志的數據包給服務端;

第2次握手:服務端接收成功後,回傳一個帶有SYN/ACK標志的數據包傳遞確認信息,表示我收到了;

第3次握手:客戶端再回傳一個帶有ACK標志的數據包,表示我知道了,握手結束。

其中:SYN標志位數置1,表示建立TCP連接;ACK標志表示驗證欄位。

可通過以下趣味圖解理解三次握手:

三次握手過程詳細說明:

1、客戶端發送建立TCP連接的請求報文,其中報文中包含seq序列號,是由發送端隨機生成的,並且將報文中的SYN欄位置為1,表示需要建立TCP連接。(SYN=1,seq=x,x為隨機生成數值);

2、服務端回復客戶端發送的TCP連接請求報文,其中包含seq序列號,是由回復端隨機生成的,並且將SYN置為1,而且會產生ACK欄位,ACK欄位數值是在客戶端發送過來的序列號seq的基礎上加1進行回復,以便客戶端收到信息時,知曉自己的TCP建立請求已得到驗證。(SYN=1,ACK=x+1,seq=y,y為隨機生成數值)這里的ack加1可以理解為是確認和誰建立連接;

3、客戶端收到服務端發送的TCP建立驗證請求後,會使自己的序列號加1表示,並且再次回復ACK驗證請求,在服務端發過來的seq上加1進行回復。(SYN=1,ACK=y+1,seq=x+1)。

由於TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接。收到一個 FIN只意味著這一方向上沒有數據流動,一個TCP連接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。

四次揮手原理:

第1次揮手:客戶端發送一個FIN,用來關閉客戶端到服務端的數據傳送,客戶端進入FIN_WAIT_1狀態;

第2次揮手:服務端收到FIN後,發送一個ACK給客戶端,確認序號為收到序號+1(與SYN相同,一個FIN佔用一個序號),服務端進入CLOSE_WAIT狀態;

第3次揮手:服務端發送一個FIN,用來關閉服務端到客戶端的數據傳送,服務端進入LAST_ACK狀態;

第4次揮手:客戶端收到FIN後,客戶端t進入TIME_WAIT狀態,接著發送一個ACK給Server,確認序號為收到序號+1,服務端進入CLOSED狀態,完成四次揮手。

其中:FIN標志位數置1,表示斷開TCP連接。

可通過以下趣味圖解理解四次揮手:

四次揮手過程詳細說明:

1、客戶端發送斷開TCP連接請求的報文,其中報文中包含seq序列號,是由發送端隨機生成的,並且還將報文中的FIN欄位置為1,表示需要斷開TCP連接。(FIN=1,seq=x,x由客戶端隨機生成);

2、服務端會回復客戶端發送的TCP斷開請求報文,其包含seq序列號,是由回復端隨機生成的,而且會產生ACK欄位,ACK欄位數值是在客戶端發過來的seq序列號基礎上加1進行回復,以便客戶端收到信息時,知曉自己的TCP斷開請求已經得到驗證。(FIN=1,ACK=x+1,seq=y,y由服務端隨機生成);

3、服務端在回復完客戶端的TCP斷開請求後,不會馬上進行TCP連接的斷開,服務端會先確保斷開前,所有傳輸到A的數據是否已經傳輸完畢,一旦確認傳輸數據完畢,就會將回復報文的FIN欄位置1,並且產生隨機seq序列號。(FIN=1,ACK=x+1,seq=z,z由服務端隨機生成);

4、客戶端收到服務端的TCP斷開請求後,會回復服務端的斷開請求,包含隨機生成的seq欄位和ACK欄位,ACK欄位會在服務端的TCP斷開請求的seq基礎上加1,從而完成服務端請求的驗證回復。(FIN=1,ACK=z+1,seq=h,h為客戶端隨機生成)

至此TCP斷開的4次揮手過程完畢。

LISTEN:等待從任何遠端TCP 和埠的連接請求。

SYN_SENT:發送完一個連接請求後等待一個匹配的連接請求。

SYN_RECEIVED:發送連接請求並且接收到匹配的連接請求以後等待連接請求確認。

ESTABLISHED:表示一個打開的連接,接收到的數據可以被投遞給用戶。連接的數據傳輸階段的正常狀態。

FIN_WAIT_1:等待遠端TCP 的連接終止請求,或者等待之前發送的連接終止請求的確認。

FIN_WAIT_2:等待遠端TCP 的連接終止請求。

CLOSE_WAIT:等待本地用戶的連接終止請求。

CLOSING:等待遠端TCP 的連接終止請求確認。

LAST_ACK:等待先前發送給遠端TCP 的連接終止請求的確認(包括它位元組的連接終止請求的確認)

TIME_WAIT:等待足夠的時間過去以確保遠端TCP 接收到它的連接終止請求的確認。

TIME_WAIT 兩個存在的理由:

          1.可靠的實現tcp全雙工連接的終止;

          2.允許老的重復分節在網路中消逝。

CLOSED:不在連接狀態(這是為方便描述假想的狀態,實際不存在)。

『柒』 計算機網路中的「三次握手」是什麼

TCP握手協議

在TCP/IP協議中,TCP協議提供可靠的連接服務,採用三次握手建立一個連接。

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

第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。

完成三次握手,客戶端與伺服器開始傳送數據,在上述過程中,還有一些重要的概念:

未連接隊列:在三次握手協議中,伺服器維護一個未連接隊列,該隊列為每個客戶端的SYN包(syn=j)開設一個條目,該條目表明伺服器已收到SYN包,並向客戶發出確認,正在等待客戶的確認包。這些條目所標識的連接在伺服器處於Syn_RECV狀態,當伺服器收到客戶的確認包時,刪除該條目,伺服器進入ESTABLISHED狀態。
Backlog參數:表示未連接隊列的最大容納數目。

SYN-ACK 重傳次數 伺服器發送完SYN-ACK包,如果未收到客戶確認包,伺服器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳,如果重傳次數超過系統規定的最大重傳次數,系統將該連接信息從半連接隊列中刪除。注意,每次重傳等待的時間不一定相同。

半連接存活時間:是指半連接隊列的條目存活的最長時間,也即服務從收到SYN包到確認這個報文無效的最長時間,該時間值是所有重傳請求包的最長等待時間總和。有時我們也稱半連接存活時間為Timeout時間、SYN_RECV存活時間。

『捌』 6 張圖帶你搞懂 TCP 為什麼是三次握手,而不是兩次或四次

1三次握手

2兩次握手(情況1)

3兩次握手(情況2)

OK,下面正經地來回答下這個問題,要搞清楚這個問題,首先得了解TCP究竟是如何保證可靠傳輸的。

PS:TCP協議中,主動發起請求的一端稱為『客戶端』,被動連接的一端稱為『服務端』。不管是客戶端還是服務端,TCP連接建立完後都能發送和接收數據。

起初,伺服器和客戶端都為CLOSED狀態。在通信開始前,雙方都得創建各自的傳輸控制塊(TCB)。伺服器創建完TCB後便進入LISTEN狀態,此時准備接收客戶端發來的連接請求。

第一次握手

客戶端向服務端發送連接請求報文段。該報文段的頭部中SYN=1,ACK=0,seq=x。請求發送後,客戶端便進入SYN-SENT狀態。

第二次握手

服務端收到連接請求報文段後,如果同意連接,則會發送一個應答:SYN=1,ACK=1,seq=y,ack=x+1。該應答發送完成後便進入SYN-RCVD狀態。

第三次握手

當客戶端收到連接同意的應答後,還要向服務端發送一個確認報文段,表示:服務端發來的連接同意應答已經成功收到。該報文段的頭部為:ACK=1,seq=x+1,ack=y+1。客戶端發完這個報文段後便進入ESTABLISHED狀態,服務端收到這個應答後也進入ESTABLISHED狀態,此時連接的建立完成!

防止失效的連接請求報文段被服務端接收,從而產生錯誤。

PS:失效的連接請求:若客戶端向服務端發送的連接請求丟失,客戶端等待應答超時後就會再次發送連接請求,此時,上一個連接請求就是『失效的』。

若建立連接只需兩次握手,客戶端並沒有太大的變化,仍然需要獲得服務端的應答後才進入ESTABLISHED狀態,而服務端在收到連接請求後就進入ESTABLISHED狀態。

此時如果網路擁塞,客戶端發送的連接請求遲遲到不了服務端,客戶端便超時重發請求,如果服務端正確接收並確認應答,雙方便開始通信,通信結束後釋放連接。此時,如果那個失效的連接請求抵達了服務端,由於只有兩次握手,服務端收到請求就會進入ESTABLISHED狀態,等待發送數據或主動發送數據。但此時的客戶端早已進入CLOSED狀態,服務端將會一直等待下去,這樣浪費服務端連接資源。

TCP連接的釋放一共需要四步,因此稱為『四次揮手』。

我們知道,TCP連接是雙向的,因此在四次揮手中,前兩次揮手用於斷開一個方向的連接,後兩次揮手用於斷開另一方向的連接。

第一次揮手

若A認為數據發送完成,則它需要向B發送連接釋放請求。該請求只有報文頭,頭中攜帶的主要參數為:FIN=1,seq=u。此時,A將進入FIN-WAIT-1狀態。


第二次揮手

B收到連接釋放請求後,會通知相應的應用程序,告訴它A向B這個方向的連接已經釋放。此時B進入CLOSE-WAIT狀態,並向A發送連接釋放的應答,其報文頭包含:ACK=1,seq=v,ack=u+1。

A收到該應答,進入FIN-WAIT-2狀態,等待B發送連接釋放請求。

第二次揮手完成後,A到B方向的連接已經釋放,B不會再接收數據,A也不會再發送數據。但B到A方向的連接仍然存在,B可以繼續向A發送數據。

第三次揮手

當B向A發完所有數據後,向A發送連接釋放請求,請求頭:FIN=1,ACK=1,seq=w,ack=u+1。B便進入LAST-ACK狀態。

第四次揮手

A收到釋放請求後,向B發送確認應答,此時A進入TIME-WAIT狀態。該狀態會持續2MSL時間,若該時間段內沒有B的重發請求的話,就進入CLOSED狀態,撤銷TCB。當B收到確認應答後,也便進入CLOSED狀態,撤銷TCB。

為了保證B能收到A的確認應答。若A發完確認應答後直接進入CLOSED狀態,那麼如果該應答丟失,B等待超時後就會重新發送連接釋放請求,但此時A已經關閉了,不會作出任何響應,因此B永遠無法正常關閉。

本文轉載自:「掘金」,原文:https://tinyurl.com/nrputn47,版權歸原作者所有。

『玖』 簡述TCP的三次握手過程。

TCP握手協議
在TCP/IP協議中,TCP協議提供可靠的連接服務,採用三次握手建立一個連接.
第一次握手:建立連接時,客戶端發送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
SYN:同步序列編號(Synchronize
Sequence
Numbers)
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手.
完成三次握手,客戶端與伺服器開始傳送數據