TCP協(xié)議的三次握手和四次揮手過程
1、TCP/IP協(xié)議族
TCP/IP是一個協(xié)議族,通常分不同層次進行開發(fā),每個層次負責不同的通信功能。包含以下四個層次:
鏈路層:
也稱作數(shù)據(jù)鏈路層或者網(wǎng)絡接口層,通常包括操作系統(tǒng)中的設備驅動程序和計算機中對應的網(wǎng)絡接口卡。它們一起處理與電纜(或其他任何傳輸媒介)的物理接口細節(jié)。
網(wǎng)絡層:
也稱作互聯(lián)網(wǎng)層,處理分組在網(wǎng)絡中的活動,例如分組的選路。網(wǎng)絡層協(xié)議包括IP協(xié)議(網(wǎng)際協(xié)議)、ICMP協(xié)議(Internet互聯(lián)網(wǎng)控制報文協(xié)議),以及IGMP協(xié)議(Internet組管理協(xié)議)。
運輸層主要為兩臺主機上的應用程序提供端到端的通信:
有兩個互不相同的傳輸協(xié)議:TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報協(xié)議)。TCP為兩臺主機提供高可靠性的數(shù)據(jù)通信。他所作的工作包括把應用程序交給它的數(shù)據(jù)分成合適的小塊交給下面的網(wǎng)絡層,確認接收到的分組,設置發(fā)送***確認分組的超時時鐘等。由于運輸層提供了高可靠性的端到端通信,因此應用層可以忽略所有這些細節(jié)。而另一方面,UDP則為應用層提供一種非常簡單的服務。它只是把稱作數(shù)據(jù)報的分組從一臺主機發(fā)送到另一臺主機,但并不保證該數(shù)據(jù)報能到達另一端。任何必須的可靠性必須由應用層來提供。
應用層負責處理特定的應用程序細節(jié):
包括Telnet(遠程登錄)、FTP(文件傳輸協(xié)議)、SMTP(簡單郵件傳送協(xié)議)以及SNMP(簡單網(wǎng)絡管理協(xié)議)等。
2、TCP協(xié)議簡介
TCP是一種面向連接(連接導向)的、可靠的基于字節(jié)流的傳輸層通信協(xié)議。TCP將用戶數(shù)據(jù)打包成報文段,它發(fā)送后啟動一個定時器,另一端收到的數(shù)據(jù)進行確認、對失序的數(shù)據(jù)重新排序、丟棄重復數(shù)據(jù)。
TCP的特點有:
- TCP是面向連接的運輸層協(xié)議
- 每一條TCP連接只能有兩個端點,每一條TCP連接只能是點對點的
- TCP提供可靠交付的服務
- TCP提供全雙工通信。數(shù)據(jù)在兩個方向上獨立的進行傳輸。因此,連接的每一端必須保持每個方向上的傳輸數(shù)據(jù)序號。
- 面向字節(jié)流。面向字節(jié)流的含義:雖然應用程序和TCP交互是一次一個數(shù)據(jù)塊,但TCP應用程序交下來的數(shù)據(jù)僅僅是一連串的無結構的字節(jié)流。
TCP報文首部,如下圖所示:
- 源端口號:數(shù)據(jù)發(fā)起者的端口號,16bit
- 目的端口號:數(shù)據(jù)接收者的端口號,16bit
- 序號:32bit的序列號,由發(fā)送方使用
- 確認序號:32bit的確認號,是接收數(shù)據(jù)方期望收到發(fā)送方的下一個報文段的序號,因此確認序號應當是上次已成功收到數(shù)據(jù)字節(jié)序號加1。
- 首部長度:首部中32bit字的數(shù)目,可表示15*32bit=60字節(jié)的首部。一般首部長度為20字節(jié)。
- 保留:6bit, 均為0
- 緊急URG:當URG=1時,表示報文段中有緊急數(shù)據(jù),應盡快傳送。
- 確認比特ACK:ACK = 1時代表這是一個確認的TCP包,取值0則不是確認包。
- 推送比特PSH:當發(fā)送端PSH=1時,接收端盡快的交付給應用進程。
- 復位比特(RST):當RST=1時,表明TCP連接中出現(xiàn)嚴重差錯,必須釋放連接,再重新建立連接。
- 同步比特SYN:在建立連接是用來同步序號。SYN=1, ACK=0表示一個連接請求報文段。SYN=1,ACK=1表示同意建立連接。
- 終止比特FIN:FIN=1時,表明此報文段的發(fā)送端的數(shù)據(jù)已經(jīng)發(fā)送完畢,并要求釋放傳輸連接。
- 窗口:用來控制對方發(fā)送的數(shù)據(jù)量,通知發(fā)放已確定的發(fā)送窗口上限。
- 檢驗和:該字段檢驗的范圍包括首部和數(shù)據(jù)這兩部分。由發(fā)端計算和存儲,并由收端進行驗證。
- 緊急指針:緊急指針在URG=1時才有效,它指出本報文段中的緊急數(shù)據(jù)的字節(jié)數(shù)。
- 選項:長度可變,最長可達40字節(jié)。
3、 三次握手過程詳解
所謂三次握手(Three-Way Handshake)即建立TCP連接,就是指建立一個TCP連接時,需要客戶端和服務端總共發(fā)送3個包以確認連接的建立。在socket編程中,這一過程由客戶端執(zhí)行connect來觸發(fā),整個流程如下圖所示:
(1)***次握手:
Client將標志位SYN置為1,隨機產(chǎn)生一個值seq=J,并將該數(shù)據(jù)包發(fā)送給Server,Client進入SYN_SENT狀態(tài),等待Server確認。
(2)第二次握手:
Server收到數(shù)據(jù)包后由標志位SYN=1知道Client請求建立連接,Server將標志位SYN和ACK都置為1,ack=J+1,隨機產(chǎn)生一個值seq=K,并將該數(shù)據(jù)包發(fā)送給Client以確認連接請求,Server進入SYN_RCVD狀態(tài)。
(3)第三次握手:
Client收到確認后,檢查ack是否為J+1,ACK是否為1,如果正確則將標志位ACK置為1,ack=K+1,并將該數(shù)據(jù)包發(fā)送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,Client和Server進入ESTABLISHED狀態(tài),完成三次握手,隨后Client與Server之間可以開始傳輸數(shù)據(jù)了。
4、四次揮手過程詳解
所謂四次揮手(Four-Way Wavehand)即終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務端總共發(fā)送4個包以確認連接的斷開。在socket編程中,這一過程由客戶端或服務端任一方執(zhí)行close來觸發(fā),整個流程如下圖所示:
由于TCP連接時全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成數(shù)據(jù)發(fā)送任務后,發(fā)送一個FIN來終止這一方向的連接,收到一個FIN只是意味著這一方向上沒有數(shù)據(jù)流動了,即不會再收到數(shù)據(jù)了,但是在這個TCP連接上仍然能夠發(fā)送數(shù)據(jù),直到這一方向也發(fā)送了FIN。首先進行關閉的一方將執(zhí)行主動關閉,而另一方則執(zhí)行被動關閉,上圖描述的即是如此。
***次揮手:
Client發(fā)送一個FIN,用來關閉Client到Server的數(shù)據(jù)傳送,Client進入FIN_WAIT_1狀態(tài)。
第二次揮手:
Server收到FIN后,發(fā)送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個FIN占用一個序號),Server進入CLOSE_WAIT狀態(tài)。
第三次揮手:
Server發(fā)送一個FIN,用來關閉Server到Client的數(shù)據(jù)傳送,Server進入LAST_ACK狀態(tài)。
第四次揮手:
Client收到FIN后,Client進入TIME_WAIT狀態(tài),接著發(fā)送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態(tài),完成四次揮手。
結語
為什么建立連接是三次握手,而關閉連接卻是四次揮手呢?
這是因為服務端在LISTEN狀態(tài)下,收到建立連接請求的SYN報文后,把ACK和SYN放在一個報文里發(fā)送給客戶端。而關閉連接時,當收到對方的FIN報文時,僅僅表示對方不再發(fā)送數(shù)據(jù)了但是還能接收數(shù)據(jù),己方也未必全部數(shù)據(jù)都發(fā)送給對方了,所以己方可以立即close,也可以發(fā)送一些數(shù)據(jù)給對方后,再發(fā)送FIN報文給對方來表示同意現(xiàn)在關閉連接,因此,己方ACK和FIN一般都會分開發(fā)送。