TCP/IP详解--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)
總結
以上是生活随笔為你收集整理的TCP/IP详解--TCP/IP中三次握手 四次握手状态分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PCI与PXI的区别
- 下一篇: TCP/IP详解--五层协议的作用以及对