TCP\IP三次握手連接,四次握手斷開分析


TCP(Transmission Control Protocol) 傳輸控制協議

TCP是主機對主機層的傳輸控制協議,提供可靠的連接服務,采用三次握手確認建立一個連接:

位碼即tcp標志位,有6種標示:SYN(synchronous建立聯機) ACK(acknowledgement 確認) PSH(push傳送) FIN(finish結束) RST(reset重置) URG(urgent緊急)

Sequence number(發送序列) Acknowledge number(確認序列)

第一次握手:主機A發送位碼為syn=1,隨機產生seq number=1234567的數據包到服務器,主機B由SYN=1知道,A要求建立聯機;
第二次握手:主機B收到請求后要確認聯機信息,向A發送ack number=(主機A的seq+1),syn=1,ack=1,隨機產生seq=7654321的包
第三次握手:主機A收到后檢查ack number是否正確,即第一次發送的seq number+1,以及位碼ack是否為1,若正確,主機A會再發送ack number=(主機B的seq+1),ack=1,主機B收到后確認seq值與ack=1則連接建立成功。
完成三次握手,主機A與主機B開始傳送數據。

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

握手過程中傳送的包里不包含數據,三次握手完畢后,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP 連接都將被一直保持下去。斷開連接時服務器和客戶端均可以主動發起斷開TCP連接的請求,斷開過程需要經過“四次握手”(過程就不細寫了,就是服務器和客戶端交互,最終確定斷開)

四次握手斷開:

由於 TCP 連接是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的數據發送任務后就能發送一個FIN 來終止這個方向的發送通道。收到一個 FIN 只意味着這一方向上沒有數據流動,一個 TCP 連接在收到一個 FIN 后仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。  
( 1 )客戶端 A 發送一個 FIN ,用來關閉客戶 A 到服務器 B 的數據傳送(報文段 4 )。  
( 2 )服務器 B 收到這個 FIN ,它發回一個 ACK ,確認序號為收到的序號加 1 (報文段 5 )。和 SYN 一樣,一個FIN 將占用一個序號。  
( 3 )服務器 B 關閉與客戶端 A 的連接,發送一個 FIN 給客戶端 A (報文段 6 )。  
( 4 )客戶端 A 發回 ACK 報文確認,並將確認序號設置為收到序號加 1 (報文段 7 )。  

 

 

實例:
IP 192.168.1.116.3337 > 192.168.1.123.7788: S 3626544836:3626544836
IP 192.168.1.123.7788 > 192.168.1.116.3337: S 1739326486:1739326486 ack 3626544837
IP 192.168.1.116.3337 > 192.168.1.123.7788: ack 1739326487,ack 1
第一次握手:192.168.1.116發送位碼syn=1,隨機產生seq number=3626544836的數據包到192.168.1.123,192.168.1.123由SYN=1知道192.168.1.116要求建立聯機;
第二次握手:192.168.1.123收到請求后要確認聯機信息,向192.168.1.116發送ack number=3626544837,syn=1,ack=1,隨機產生seq=1739326486的包;
第三次握手:192.168.1.116收到后檢查ack number是否正確,即第一次發送的seq number+1,以及位碼ack是否為1,若正確,192.168.1.116會再發送ack number=1739326487,ack=1,192.168.1.123收到后確認seq=seq+1,ack=1則連接建立成功。

http實例:
pc瀏覽服務器網頁此過程不包括域名查詢,只描述TCP與http數據流的變化。
一、pc與http服務器進行三次握手來建立連接。
1.pc:seq=0 ack=0 syn=1 ack=0 發送給服務器建立同步請求。
2.server: seq=0 ack=1 syn=1 ack=1 發送給客戶端建立同步響應.
3.pc:seq=1 ack=1 syn=0 ack=1 發送給服務器,三次握手完成建立同步信息成功.
4.pc產生http數據消息,向服務器發送get請求.
5.服務器收到請求並發送TCP確認,然后發送http數據信息給客戶端的瀏覽器.
6.客戶端收到服務器的http信息,然后發送TCP確認信息給服務器.
7.客戶端發送FIN+ACK給服務器,要求結束數據傳輸.
8.服務器發送TCP確認消息用於確認pc的TCP的FIN消息
9.服務器向客戶端發送FIN+ACK消息用於結束TCP會話.
10.客戶端發送確認信息給服務器,整個會話結束.

HTTP連接
HTTP協議即超文本傳送協議(Hypertext Transfer Protocol ),是Web聯網的基礎,也是手機聯網常用的協議之一,HTTP協議是建立在TCP協議之上的一種應用。
HTTP連接最顯著的特點是客戶端發送的每次請求都需要服務器回送響應,在請求結束后,會主動釋放連接。從建立連接到關閉連接的過程稱為“一次連接”。
1)在HTTP 1.0中,客戶端的每次請求都要求建立一次單獨的連接,在處理完本次請求后,就自動釋放連接。
2)在HTTP 1.1中則可以在一次連接中處理多個請求,並且多個請求可以重疊進行,不需要等待一個請求結束后再發送下一個請求。
由於HTTP在每次請求結束后都會主動釋放連接,因此HTTP連接是一種“短連接”,要保持客戶端程序的在線狀態,需要不斷地向服務器發起連接請求。通常 的做法是即時不需要獲得任何數據,客戶端也保持每隔一段固定的時間向服務器發送一次“保持連接”的請求,服務器在收到該請求后對客戶端進行回復,表明知道客戶端“在線”。若服務器長時間無法收到客戶端的請求,則認為客戶端“下線”,若客戶端長時間無法收到服務器的回復,則認為網絡已經斷開。
問題:
1.為什么建立連接協議是三次握手,而關閉連接卻是四次握手呢?  
這是因為服務端的 LISTEN 狀態下的 SOCKET 當收 到 SYN 報文的建立連接請求后,它可以把 ACK 和 SYN ( ACK 起應答作用,而 SYN 起同步作用)放在一個報文里來發送。但關閉連接時, 當收到對方的 FIN 報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你所有的數據都全部發送給對方了,所以你可以未必會馬上會關閉 SOCKET, 也即你可能還需要發送一些數據給對方之后,再發送 FIN 報文給對方來表示你同意現在可以關閉連接了,所以它這里的 ACK 報文 和 FIN報文多數情況下都是分開發送的。  
2.為什么 TIME_WAIT 狀態還需要等 2MSL 后才能返回到 CLOSED 狀態?  
這是因為雖然雙方都同意關閉連接了,而且握手的 4 個報文也都協調和發送完畢,按理可以直接回到 CLOSED 狀態(就好比從 SYN_SEND 狀態 到 ESTABLISH 狀態那樣);但是因為我們必須要假想網絡是不可靠的,你無法保證你最后發送的 ACK 報文會一定被對方收到,因此對方處 於 LAST_ACK 狀態下的 SOCKET 可能會因為超時未收到 ACK 報文,而重發 FIN 報文,所以這個 TIME_WAIT 狀態的作用 就是用來重發可能丟失的 ACK 報文

總結:
三次握手,三種狀態(SYN_SEND\SYN_RECV\ESTABLISHED);兩種包(請求包\應答包),兩樣東西(標志位碼\序列號碼)
四次握手,兩次分開
心跳監測(client-<保持>-server-<在線>-client)

參考博客:

http://www.cnblogs.com/rosesmall/archive/2012/04/09/2439726.html

http://www.cnblogs.com/persist/p/3166225.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM