TCP重要字段
1.序號(hào):Seq序號(hào)漾峡,占32位深夯,用來標(biāo)識(shí)從TCP源端口向目的端口發(fā)送的字節(jié)流弱卡,發(fā)起方發(fā)送數(shù)據(jù)時(shí)對(duì)此進(jìn)行標(biāo)記
2.確認(rèn)序號(hào):Ack序號(hào)乃正,占32位,只有ACK標(biāo)志位為1時(shí)婶博,確認(rèn)序號(hào)字段才有效瓮具,Ack=Seq+1
3.標(biāo)志位:共6個(gè),即URG、ACK搭综、PSH垢箕、RST、SYN兑巾、FIN
①URG:緊急指針(urgent pointer)有效
②ACK:確認(rèn)序號(hào)有效
③PSH:接收方應(yīng)該盡快將這個(gè)報(bào)文交給應(yīng)用層
④RST:重置連接
⑤SYN:發(fā)起一個(gè)新連接
⑥FIN:釋放一個(gè)連接
PS:ACK和Ack不是同一個(gè)東西条获,確認(rèn)方Ack=發(fā)起方Seq+1,兩端配對(duì)
三次握手概念
三次握手為的是什么蒋歌?TCP連接帅掘。為什么叫三次握手?需要客戶端和服務(wù)端總共發(fā)送3個(gè)包以建立連接堂油。為什么要三次握手才行修档??jī)纱位蛘咚拇尾恍袉幔咳绻麅纱挝帐值脑?客戶端有可能因?yàn)榫W(wǎng)絡(luò)阻塞等原因會(huì)發(fā)送多個(gè)請(qǐng)求報(bào)文,這時(shí)服務(wù)器就會(huì)建立連接,浪費(fèi)掉許多服務(wù)器的資源府框。沒有必要握第四次握手吱窝,舉個(gè)例子,A和B打電話迫靖,A說:你聽得到我說話嗎院峡?B說:我聽到了,你聽得到我說話嗎系宜?A說:聽到了照激,@#!¥%&*....如果此時(shí)盹牧,B再問“你能聽到嗎”這就顯得多余了
三次握手流程
在socket編程中俩垃,這一過程由客戶端執(zhí)行connect來觸發(fā)
第一次握手:建立連接時(shí),客戶端發(fā)送syn包(syn=j)到服務(wù)器汰寓,并進(jìn)入SYN_SENT狀態(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_RCVD狀態(tài)
第三次握手:客戶端收到服務(wù)器的SYN+ACK包俺孙,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢掷贾,客戶端和服務(wù)器進(jìn)入ESTABLISHED(TCP連接成功)狀態(tài)睛榄,完成三次握手
四次揮手概念
四次揮手是做什么的?釋放TCP連接想帅。為什么建立連接是三次握手场靴,而關(guān)閉連接卻是四次揮手呢?因?yàn)楫?dāng)Server端收到Client端的SYN連接請(qǐng)求報(bào)文后,可以直接發(fā)送SYN+ACK報(bào)文旨剥。其中ACK報(bào)文是用來應(yīng)答的咧欣,SYN報(bào)文是用來同步的。但是關(guān)閉連接時(shí)轨帜,當(dāng)Server端收到FIN報(bào)文時(shí)魄咕,很可能并不會(huì)立即關(guān)閉SOCKET,所以只能先回復(fù)一個(gè)ACK報(bào)文蚌父,告訴Client端哮兰,"你發(fā)的FIN報(bào)文我收到了"。只有等到我Server端所有的報(bào)文都發(fā)送完了苟弛,我才能發(fā)送FIN報(bào)文喝滞,因此不能一起發(fā)送。故需要四步握手
四次揮手流程
第一次揮手:當(dāng)主機(jī)A的應(yīng)用程序通知TCP數(shù)據(jù)已經(jīng)發(fā)送完畢時(shí)膏秫,TCP向主機(jī)B發(fā)送一個(gè)帶有FIN附加標(biāo)記的報(bào)文段
第二次揮手:主機(jī)B收到這個(gè)FIN報(bào)文段之后右遭,并不立即用FIN報(bào)文段回復(fù)主機(jī)A,而是先向主機(jī)A發(fā)送一個(gè)確認(rèn)序號(hào)ACK缤削,同時(shí)通知自己相應(yīng)的應(yīng)用程序:對(duì)方要求關(guān)閉連接(先發(fā)送ACK的目的是為了防止在這段時(shí)間內(nèi)窘哈,對(duì)方重傳FIN報(bào)文段)
第三次揮手:主機(jī)B的應(yīng)用程序告訴TCP:我要徹底的關(guān)閉連接,TCP向主機(jī)A送一個(gè)FIN報(bào)文段
第四次揮手:主機(jī)A收到這個(gè)FIN報(bào)文段后僻他,向主機(jī)B發(fā)送一個(gè)ACK表示連接徹底釋放
TCP建立和釋放圖解
關(guān)于TIME_WAIT
然按道理宵距,四個(gè)報(bào)文都發(fā)送完畢,我們可以直接進(jìn)入CLOSE狀態(tài)了吨拗,但是我們必須假想網(wǎng)絡(luò)是不可靠的满哪,有可能最后一個(gè)ACK丟失。所以TIME_WAIT狀態(tài)就是用來重發(fā)可能丟失的ACK報(bào)文