原創(chuàng)地址:https://blog.51cto.com/jinlong/2065461原創(chuàng)作者:IT_外賣小哥
三次握手
置位概念:根據(jù)TCP的包頭字段,存在3個重要的標(biāo)識ACK粗截、SYN秉继、FIN
ACK:表示驗(yàn)證字段 SYN:位數(shù)置1奄容,表示建立TCP連接 FIN:位數(shù)置1康聂,表示斷開TCP連接
三次握手過程說明:
1.由客戶端發(fā)送建立TCP連接的請求報文,其中報文中包含seq序列號北滥,是由發(fā)送端隨機(jī)生成的刚操,并且將報文中的SYN字段置為1,表示需要建立TCP連接再芋。(SYN=1菊霜,seq=x,x為隨機(jī)生成數(shù)值)
2.由服務(wù)端回復(fù)客戶端發(fā)送的TCP連接請求報文济赎,其中包含seq序列號鉴逞,是由回復(fù)端隨機(jī)生成的,并且將SYN置為1司训,而且會產(chǎn)生ACK字段华蜒,ACK字段數(shù)值是在客戶端發(fā)送過來的序列號seq的基礎(chǔ)上加1進(jìn)行回復(fù),以便客戶端收到信息時豁遭,知曉自己的TCP建立請求已得到驗(yàn)證。(SYN=1贺拣,ACK=x+1蓖谢,seq=y捂蕴,y為隨機(jī)生成數(shù)值)這里的ack加1可以理解為是確認(rèn)和誰建立連接。
3.客戶端收到服務(wù)端發(fā)送的TCP建立驗(yàn)證請求后闪幽,會使自己的序列號加1表示啥辨,并且再次回復(fù)ACK驗(yàn)證請求,在服務(wù)端發(fā)過來的seq上加1進(jìn)行回復(fù)盯腌。(SYN=1溉知,ACK=y+1,seq=x+1)
四次揮手
四次揮手過程說明:
1.客戶端發(fā)送斷開TCP連接請求的報文腕够,其中報文中包含seq序列號级乍,是由發(fā)送端隨機(jī)生成的,并且還將報文中的FIN字段置為1帚湘,表示需要斷開TCP連接玫荣。(FIN=1,seq=x大诸,x由客戶端隨機(jī)生成)
2.服務(wù)端會回復(fù)客戶端發(fā)送的TCP斷開請求報文捅厂,其包含seq序列號,是由回復(fù)端隨機(jī)生成的资柔,而且會產(chǎn)生ACK字段焙贷,ACK字段數(shù)值是在客戶端發(fā)過來的seq序列號基礎(chǔ)上加1進(jìn)行回復(fù),以便客戶端收到信息時贿堰,知曉自己的TCP斷開請求已經(jīng)得到驗(yàn)證辙芍。(FIN=1,ACK=x+1官边,seq=y沸手,y由服務(wù)端隨機(jī)生成)
3.服務(wù)端在回復(fù)完客戶端的TCP斷開請求后,不會馬上進(jìn)行TCP連接的斷開注簿,服務(wù)端會先確保斷開前契吉,所有傳輸?shù)紸的數(shù)據(jù)是否已經(jīng)傳輸完畢,一旦確認(rèn)傳輸數(shù)據(jù)完畢诡渴,就會將回復(fù)報文的FIN字段置1捐晶,并且產(chǎn)生隨機(jī)seq序列號。(FIN=1妄辩,ACK=x+1惑灵,seq=z,z由服務(wù)端隨機(jī)生成)
4.客戶端收到服務(wù)端的TCP斷開請求后眼耀,會回復(fù)服務(wù)端的斷開請求英支,包含隨機(jī)生成的seq字段和ACK字段,ACK字段會在服務(wù)端的TCP斷開請求的seq基礎(chǔ)上加1哮伟,從而完成服務(wù)端請求的驗(yàn)證回復(fù)干花。(FIN=1妄帘,ACK=z+1,seq=h池凄,h為客戶端隨機(jī)生成)至此TCP斷開的4次揮手過程完畢
11種狀態(tài)
1.一開始抡驼,建立連接之前服務(wù)器和客戶端的狀態(tài)都為CLOSED
2.服務(wù)器創(chuàng)建socket后開始監(jiān)聽,變?yōu)長ISTEN狀態(tài)肿仑;
3.客戶端請求建立連接致盟,向服務(wù)器發(fā)送SYN報文,客戶端的狀態(tài)變味SYN_SENT尤慰;
4.服務(wù)器收到客戶端的報文后向客戶端發(fā)送ACK和SYN報文馏锡,此時服務(wù)器的狀態(tài)變?yōu)镾YN_RCVD;
5.然后割择,客戶端收到ACK眷篇、SYN,就向服務(wù)器發(fā)送ACK荔泳,客戶端狀態(tài)變?yōu)镋STABLISHED蕉饼;
6.服務(wù)器端收到客戶端的ACK后變?yōu)镋STABLISHED。此時3次握手完成玛歌,連接建立昧港!
由于TCP連接是全雙工的,斷開連接會比建立連接麻煩一點(diǎn)點(diǎn)支子。
1.客戶端先向服務(wù)器發(fā)送FIN報文创肥,請求斷開連接,其狀態(tài)變?yōu)镕IN_WAIT1值朋;
2.服務(wù)器收到FIN后向客戶端發(fā)送ACK叹侄,服務(wù)器的狀態(tài)圍邊CLOSE_WAIT;
3.客戶端收到ACK后就進(jìn)入FIN_WAIT2狀態(tài)昨登,此時連接已經(jīng)斷開了一半了趾代。如果服務(wù)器還有數(shù)據(jù)要發(fā)送給客戶端,就會繼續(xù)發(fā)送丰辣;
4.直到發(fā)完數(shù)據(jù)撒强,就會發(fā)送FIN報文,此時服務(wù)器進(jìn)入LAST_ACK狀態(tài)笙什;
5.客戶端收到服務(wù)器的FIN后飘哨,馬上發(fā)送ACK給服務(wù)器,此時客戶端進(jìn)入TIME_WAIT狀態(tài)琐凭;
6.再過了2MSL長的時間后進(jìn)入CLOSED狀態(tài)芽隆。服務(wù)器收到客戶端的ACK就進(jìn)入 CLOSED狀態(tài)。至此,還有一個狀態(tài)沒有出來:CLOSING狀態(tài)摆马。
CLOSING狀態(tài)表示: 客戶端發(fā)送了FIN臼闻,但是沒有收到服務(wù)器的ACK,卻收到了服務(wù)器的FIN囤采,這種情況發(fā)生在服務(wù)器發(fā)送的ACK丟包的時候,因?yàn)榫W(wǎng)絡(luò)傳輸有時會有意外惩淳。
LISTEN:等待從任何遠(yuǎn)端TCP 和端口的連接請求蕉毯。
SYN_SENT:發(fā)送完一個連接請求后等待一個匹配的連接請求。SYN_RECEIVED:發(fā)送連接請求并且接收到匹配的連接請求以后等待連接請求確認(rèn)思犁。
ESTABLISHED:表示一個打開的連接代虾,接收到的數(shù)據(jù)可以被投遞給用戶。連接的數(shù)據(jù)傳輸階段的正常狀態(tài)激蹲。
FIN_WAIT_1:等待遠(yuǎn)端TCP 的連接終止請求棉磨,或者等待之前發(fā)送的連接終止請求的確認(rèn)。
FIN_WAIT_2:等待遠(yuǎn)端TCP 的連接終止請求学辱。
CLOSE_WAIT:等待本地用戶的連接終止請求乘瓤。
CLOSING:等待遠(yuǎn)端TCP 的連接終止請求確認(rèn)。
LAST_ACK:等待先前發(fā)送給遠(yuǎn)端TCP 的連接終止請求的確認(rèn)(包括它字節(jié)的連接終止請求的確認(rèn))
TIME_WAIT:等待足夠的時間過去以確保遠(yuǎn)端TCP 接收到它的連接終止請求的確認(rèn)策泣。
TIME_WAIT 兩個存在的理由:
? 可靠的實(shí)現(xiàn)tcp全雙工連接的終止衙傀;
? 允許老的重復(fù)分節(jié)在網(wǎng)絡(luò)中消逝。
CLOSED:不在連接狀態(tài)(這是為方便描述假想的狀態(tài)萨咕,實(shí)際不存在)