TCP/IP详解--TCP/IP中三次握手 四次握手状态分析
TCP(Transmission Control Protocol) 傳輸控制協(xié)議
TCP是主機(jī)對(duì)主機(jī)層的傳輸控制協(xié)議,提供可靠的連接服務(wù),采用三次握手確認(rèn)建立一個(gè)連接:
位碼即tcp標(biāo)志位,有6種標(biāo)示:SYN(synchronous建立聯(lián)機(jī)) ACK(acknowledgement 確認(rèn)) PSH(push傳送) FIN(finish結(jié)束) RST(reset重置) URG(urgent緊急)
Sequence number(發(fā)送序列) Acknowledge number(確認(rèn)序列)
第一次握手:主機(jī)A發(fā)送位碼為syn=1,隨機(jī)產(chǎn)生seq number=1234567的數(shù)據(jù)包到服務(wù)器,主機(jī)B由SYN=1知道,A要求建立聯(lián)機(jī);
第二次握手:主機(jī)B收到請(qǐng)求后要確認(rèn)聯(lián)機(jī)信息,向A發(fā)送ack number=(主機(jī)A的seq+1),syn=1,ack=1,隨機(jī)產(chǎn)生seq=7654321的包
第三次握手:主機(jī)A收到后檢查ack number是否正確,即第一次發(fā)送的seq number+1,以及位碼ack是否為1,若正確,主機(jī)A會(huì)再發(fā)送ack number=(主機(jī)B的seq+1),ack=1,主機(jī)B收到后確認(rèn)seq值與ack=1則連接建立成功。
完成三次握手,主機(jī)A與主機(jī)B開(kāi)始傳送數(shù)據(jù)。
在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù),采用三次握手建立一個(gè)連接。?
第一次握手:建立連接時(shí),客戶(hù)端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);?
第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶(hù)的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn) 入SYN_RECV狀態(tài); 第三次握手:客戶(hù)端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶(hù)端和服務(wù)器進(jìn)入 ESTABLISHED狀態(tài),完成三次握手。 完成三次握手,客戶(hù)端與服務(wù)器開(kāi)始傳送數(shù)據(jù).
握手過(guò)程中傳送的包里不包含數(shù)據(jù),三次握手完畢后,客戶(hù)端與服務(wù)器才正式開(kāi)始傳送數(shù)據(jù)。理想狀態(tài)下,TCP連接一旦建立,在通信雙方中的任何一方主動(dòng)關(guān)閉連接之前,TCP 連接都將被一直保持下去。斷開(kāi)連接時(shí)服務(wù)器和客戶(hù)端均可以主動(dòng)發(fā)起斷開(kāi)TCP連接的請(qǐng)求,斷開(kāi)過(guò)程需要經(jīng)過(guò)“四次握手”(過(guò)程就不細(xì)寫(xiě)了,就是服務(wù)器和客戶(hù)端交互,最終確定斷開(kāi))
四次握手?jǐn)嚅_(kāi):
由于?TCP?連接是全雙工的,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉。這個(gè)原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN?來(lái)終止這個(gè)方向的發(fā)送通道。收到一個(gè)?FIN?只意味著這一方向上沒(méi)有數(shù)據(jù)流動(dòng),一個(gè)?TCP?連接在收到一個(gè)?FIN?后仍能發(fā)送數(shù)據(jù)。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方執(zhí)行被動(dòng)關(guān)閉。??
(?1?)客戶(hù)端?A?發(fā)送一個(gè)?FIN?,用來(lái)關(guān)閉客戶(hù)?A?到服務(wù)器?B?的數(shù)據(jù)傳送(報(bào)文段?4?)。??
(?2?)服務(wù)器?B?收到這個(gè)?FIN?,它發(fā)回一個(gè)?ACK?,確認(rèn)序號(hào)為收到的序號(hào)加?1?(報(bào)文段?5?)。和?SYN?一樣,一個(gè)FIN?將占用一個(gè)序號(hào)。??
(?3?)服務(wù)器?B?關(guān)閉與客戶(hù)端?A?的連接,發(fā)送一個(gè)?FIN?給客戶(hù)端?A?(報(bào)文段?6?)。??
(?4?)客戶(hù)端?A?發(fā)回?ACK?報(bào)文確認(rèn),并將確認(rèn)序號(hào)設(shè)置為收到序號(hào)加?1?(報(bào)文段?7?)。??
?
?
實(shí)例:
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發(fā)送位碼syn=1,隨機(jī)產(chǎn)生seq number=3626544836的數(shù)據(jù)包到192.168.1.123,192.168.1.123由SYN=1知道192.168.1.116要求建立聯(lián)機(jī);
第二次握手:192.168.1.123收到請(qǐng)求后要確認(rèn)聯(lián)機(jī)信息,向192.168.1.116發(fā)送ack number=3626544837,syn=1,ack=1,隨機(jī)產(chǎn)生seq=1739326486的包;
第三次握手:192.168.1.116收到后檢查ack number是否正確,即第一次發(fā)送的seq number+1,以及位碼ack是否為1,若正確,192.168.1.116會(huì)再發(fā)送ack number=1739326487,ack=1,192.168.1.123收到后確認(rèn)seq=seq+1,ack=1則連接建立成功。
http實(shí)例:
pc瀏覽服務(wù)器網(wǎng)頁(yè)此過(guò)程不包括域名查詢(xún),只描述TCP與http數(shù)據(jù)流的變化。
一、pc與http服務(wù)器進(jìn)行三次握手來(lái)建立連接。
1.pc:seq=0 ack=0 syn=1 ack=0 發(fā)送給服務(wù)器建立同步請(qǐng)求。
2.server: seq=0 ack=1 syn=1 ack=1 發(fā)送給客戶(hù)端建立同步響應(yīng).
3.pc:seq=1 ack=1 syn=0 ack=1 發(fā)送給服務(wù)器,三次握手完成建立同步信息成功.
4.pc產(chǎn)生http數(shù)據(jù)消息,向服務(wù)器發(fā)送get請(qǐng)求.
5.服務(wù)器收到請(qǐng)求并發(fā)送TCP確認(rèn),然后發(fā)送http數(shù)據(jù)信息給客戶(hù)端的瀏覽器.
6.客戶(hù)端收到服務(wù)器的http信息,然后發(fā)送TCP確認(rèn)信息給服務(wù)器.
7.客戶(hù)端發(fā)送FIN+ACK給服務(wù)器,要求結(jié)束數(shù)據(jù)傳輸.
8.服務(wù)器發(fā)送TCP確認(rèn)消息用于確認(rèn)pc的TCP的FIN消息
9.服務(wù)器向客戶(hù)端發(fā)送FIN+ACK消息用于結(jié)束TCP會(huì)話.
10.客戶(hù)端發(fā)送確認(rèn)信息給服務(wù)器,整個(gè)會(huì)話結(jié)束.
HTTP連接
HTTP協(xié)議即超文本傳送協(xié)議(Hypertext Transfer Protocol ),是Web聯(lián)網(wǎng)的基礎(chǔ),也是手機(jī)聯(lián)網(wǎng)常用的協(xié)議之一,HTTP協(xié)議是建立在TCP協(xié)議之上的一種應(yīng)用。
HTTP連接最顯著的特點(diǎn)是客戶(hù)端發(fā)送的每次請(qǐng)求都需要服務(wù)器回送響應(yīng),在請(qǐng)求結(jié)束后,會(huì)主動(dòng)釋放連接。從建立連接到關(guān)閉連接的過(guò)程稱(chēng)為“一次連接”。
1)在HTTP 1.0中,客戶(hù)端的每次請(qǐng)求都要求建立一次單獨(dú)的連接,在處理完本次請(qǐng)求后,就自動(dòng)釋放連接。
2)在HTTP 1.1中則可以在一次連接中處理多個(gè)請(qǐng)求,并且多個(gè)請(qǐng)求可以重疊進(jìn)行,不需要等待一個(gè)請(qǐng)求結(jié)束后再發(fā)送下一個(gè)請(qǐng)求。
由于HTTP在每次請(qǐng)求結(jié)束后都會(huì)主動(dòng)釋放連接,因此HTTP連接是一種“短連接”,要保持客戶(hù)端程序的在線狀態(tài),需要不斷地向服務(wù)器發(fā)起連接請(qǐng)求。通常 的做法是即時(shí)不需要獲得任何數(shù)據(jù),客戶(hù)端也保持每隔一段固定的時(shí)間向服務(wù)器發(fā)送一次“保持連接”的請(qǐng)求,服務(wù)器在收到該請(qǐng)求后對(duì)客戶(hù)端進(jìn)行回復(fù),表明知道客戶(hù)端“在線”。若服務(wù)器長(zhǎng)時(shí)間無(wú)法收到客戶(hù)端的請(qǐng)求,則認(rèn)為客戶(hù)端“下線”,若客戶(hù)端長(zhǎng)時(shí)間無(wú)法收到服務(wù)器的回復(fù),則認(rèn)為網(wǎng)絡(luò)已經(jīng)斷開(kāi)。
問(wèn)題:
1.為什么建立連接協(xié)議是三次握手,而關(guān)閉連接卻是四次握手呢???
這是因?yàn)榉?wù)端的?LISTEN?狀態(tài)下的?SOCKET?當(dāng)收 到?SYN?報(bào)文的建立連接請(qǐng)求后,它可以把?ACK?和?SYN?(?ACK?起應(yīng)答作用,而?SYN?起同步作用)放在一個(gè)報(bào)文里來(lái)發(fā)送。但關(guān)閉連接時(shí), 當(dāng)收到對(duì)方的?FIN?報(bào)文通知時(shí),它僅僅表示對(duì)方?jīng)]有數(shù)據(jù)發(fā)送給你了;但未必你所有的數(shù)據(jù)都全部發(fā)送給對(duì)方了,所以你可以未必會(huì)馬上會(huì)關(guān)閉?SOCKET,?也即你可能還需要發(fā)送一些數(shù)據(jù)給對(duì)方之后,再發(fā)送?FIN?報(bào)文給對(duì)方來(lái)表示你同意現(xiàn)在可以關(guān)閉連接了,所以它這里的?ACK?報(bào)文 和?FIN報(bào)文多數(shù)情況下都是分開(kāi)發(fā)送的。??
2.為什么?TIME_WAIT?狀態(tài)還需要等?2MSL?后才能返回到?CLOSED?狀態(tài)???
這是因?yàn)殡m然雙方都同意關(guān)閉連接了,而且握手的?4?個(gè)報(bào)文也都協(xié)調(diào)和發(fā)送完畢,按理可以直接回到?CLOSED?狀態(tài)(就好比從?SYN_SEND?狀態(tài) 到?ESTABLISH?狀態(tài)那樣);但是因?yàn)槲覀儽仨氁傧刖W(wǎng)絡(luò)是不可靠的,你無(wú)法保證你最后發(fā)送的?ACK?報(bào)文會(huì)一定被對(duì)方收到,因此對(duì)方處 于?LAST_ACK?狀態(tài)下的?SOCKET?可能會(huì)因?yàn)槌瑫r(shí)未收到?ACK?報(bào)文,而重發(fā)?FIN?報(bào)文,所以這個(gè)?TIME_WAIT?狀態(tài)的作用 就是用來(lái)重發(fā)可能丟失的?ACK?報(bào)文
總結(jié):
三次握手,三種狀態(tài)(SYN_SEND\SYN_RECV\ESTABLISHED);兩種包(請(qǐng)求包\應(yīng)答包),兩樣?xùn)|西(標(biāo)志位碼\序列號(hào)碼)
四次握手,兩次分開(kāi)
心跳監(jiān)測(cè)(client-<保持>-server-<在線>-client)
總結(jié)
以上是生活随笔為你收集整理的TCP/IP详解--TCP/IP中三次握手 四次握手状态分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PCI与PXI的区别
- 下一篇: TCP/IP详解--五层协议的作用以及对