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(順序號(hào)碼)
Acknowledge number(確認(rèn)號(hào)碼)
三次握手步驟:
第一次握手:主機(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í)炒刁,客戶端發(fā)送syn包(syn=j)到服務(wù)器恩沽,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn)切心;
第二次握手:服務(wù)器收到syn包飒筑,必須確認(rèn)客戶的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k)绽昏,即SYN+ACK包协屡,此時(shí)服務(wù)器 進(jìn)入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN+ACK包全谤,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1)肤晓,此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入 ESTABLISHED狀態(tài)认然,完成三次握手补憾。 完成三次握手,客戶端與服務(wù)器開(kāi)始傳送數(shù)據(jù).
實(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則連接建立成功岩瘦。
一個(gè)完整的三次握手也就是 請(qǐng)求---應(yīng)答---再次確認(rèn)
四次分手
-
由于TCP連接是全雙工的,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉窿撬。這個(gè)原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來(lái)終止這個(gè)方向的連接启昧。收到一個(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)閉。
- 客戶端A發(fā)送一個(gè)FIN跛璧,用來(lái)關(guān)閉客戶A到服務(wù)器B的數(shù)據(jù)傳送(報(bào)文段4)严里。
- 服務(wù)器B收到這個(gè)FIN,它發(fā)回一個(gè)ACK赡模,確認(rèn)序號(hào)為收到的序號(hào)加1(報(bào)文段5)田炭。和SYN一樣,一個(gè)FIN將占用一個(gè)序號(hào)漓柑。
- 服務(wù)器B關(guān)閉與客戶端A的連接教硫,發(fā)送一個(gè)FIN給客戶端A(報(bào)文段6)
- 客戶端A發(fā)回ACK報(bào)文確認(rèn),并將確認(rèn)序號(hào)設(shè)置為收到序號(hào)加1(報(bào)文段7)
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ǎn)單點(diǎn)說(shuō):
- 在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù),采用三次握手建立一個(gè)連接.
- 第一次握手:建立連接時(shí),客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn)灿巧;
- SYN:同步序列編號(hào)(Synchronize Sequence Numbers)
- 第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)赶袄;
- 第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手.
- 完成三次握手,客戶端與服務(wù)器開(kāi)始傳送數(shù)據(jù)
再簡(jiǎn)單點(diǎn)說(shuō):
- A與B建立TCP連接時(shí):首先A向B發(fā)SYN(同步請(qǐng)求)诬烹,然后B回復(fù)SYN+ACK(同步請(qǐng)求應(yīng)答),最后A回復(fù)ACK確認(rèn)弃鸦,這樣TCP的一次連接(三次握手)的過(guò)程就建立了