TCP中三次握手及四次揮手理解

相關(guān)概念

  • SYN:表示同步序號(hào),用來建立連接。SYN標(biāo)志位和ACK標(biāo)志位搭配使用。當(dāng)連接請(qǐng)求的時(shí)候,SYN=1,ACK=0;連接被響應(yīng)的時(shí)候,SYN=1,ACK=1;這個(gè)標(biāo)志的數(shù)據(jù)包經(jīng)常被用來端口掃描。掃描者只發(fā)送一個(gè)只有SYN的數(shù)據(jù)包,如果對(duì)方主機(jī)響應(yīng)了一個(gè)數(shù)據(jù)包回來,就表明這臺(tái)主機(jī)存在這個(gè)端口。但是由于這種掃描方式只是進(jìn)行TCP三次握手的第一次握手,因此這種掃描成功表示被掃描機(jī)器不安全,一臺(tái)安全的主機(jī)會(huì)強(qiáng)制要求一個(gè)連接嚴(yán)格的進(jìn)行TCP的三次握手。

  • ACK:代表報(bào)文到達(dá)確認(rèn),是對(duì)接收到的數(shù)據(jù)的最高序列號(hào)的確認(rèn),并向發(fā)送端返回一個(gè)下次接收時(shí)期望的TCP數(shù)據(jù)包的序列號(hào)。如發(fā)送方發(fā)送了100字節(jié)數(shù)據(jù),那么接收方回將ACK置為101,代表希望的到100之后的數(shù)據(jù),然后回復(fù)給發(fā)送方。

  • FIN:表示發(fā)送端已經(jīng)到達(dá)數(shù)據(jù)末尾,也就是說雙方的數(shù)據(jù)傳輸完成,沒有數(shù)據(jù)可以傳送了,發(fā)送FIN標(biāo)志位的TCP數(shù)據(jù)包后,連接將被斷開。這個(gè)標(biāo)志的數(shù)據(jù)包也經(jīng)常被用于進(jìn)行端口掃描。

  • SEQ:表示這個(gè)包中第一個(gè)字節(jié)的序號(hào)。如已經(jīng)發(fā)送了100字節(jié)的數(shù)據(jù),要再發(fā)送10字節(jié),那么再次發(fā)送的包的SEQ就是101,數(shù)據(jù)的字節(jié)編號(hào)是101到110,之后再次發(fā)送的話SEQ就是111。

    如果接收端收到這個(gè)10字節(jié)的包的話,便會(huì)返回一個(gè)ACK為111的包。表示前面110個(gè)字節(jié)已經(jīng)成功接收。

三次握手

TCP的3次握手本質(zhì)是信道不可靠,但是通信雙方需要就某個(gè)問題達(dá)成一致。而要解決這個(gè)問題,無論在消息中包含什么信息,三次通信是理論上的最小值。所以三次握手不是TCP本身的要求,而是為了滿足在不可靠信道上傳輸可靠消息這一需求所導(dǎo)致的。如果信道可靠,或并不關(guān)心數(shù)據(jù)對(duì)方是否可以收到,那么三次握手就沒有必要。

  • 第一次握手:建立連接??蛻舳税l(fā)送請(qǐng)求報(bào)文,將SYN置為1,SEQ為x(系統(tǒng)動(dòng)態(tài)隨機(jī)取一個(gè)32位長的序列號(hào)),然后客戶端進(jìn)入SYN_SEND狀態(tài),等待服務(wù)端確認(rèn)。

    理解: SYN=1,代表將要發(fā)起一個(gè)請(qǐng)求。SEQ=x,是一個(gè)隨機(jī)數(shù)。代表序號(hào)的初始值,之后的序號(hào)在此值之上累加

  • 第二次握手:服務(wù)端收到SYN報(bào)文。對(duì)SYN報(bào)文進(jìn)行確認(rèn),設(shè)置ACK為x+1。同時(shí)也發(fā)送一個(gè)SYN請(qǐng)求。將SYN置為1,SEQ為y(系統(tǒng)動(dòng)態(tài)隨機(jī)取一個(gè)32位長的序列號(hào))。服務(wù)端將上述所有信息發(fā)送給客戶端,同時(shí)也進(jìn)入SYN_RECV狀態(tài)。

    理解:服務(wù)器接收到SYN=1的請(qǐng)求,由于SEQ(序列號(hào)為)x,那么需要告訴客戶端需要x后面的數(shù)據(jù),所以ACK+1也就是x+1。同時(shí)服務(wù)端也要發(fā)起一個(gè)請(qǐng)求和客戶端建立連接,所以再設(shè)置一個(gè)SEQ(序列號(hào))=y(初始隨機(jī)值)。然后將上述內(nèi)容發(fā)送給客戶端

  • 第三次握手:客戶端收到服務(wù)端的報(bào)文。將ACK置為y+1。向服務(wù)端發(fā)送ACK報(bào)文段。發(fā)送完成后,客戶端和服務(wù)端都進(jìn)入ESTABLISHED狀態(tài),完成TCP三次握手

    理解:客戶端收到服務(wù)端消息,由于服務(wù)端發(fā)起了連接請(qǐng)求,需要將ACK設(shè)置為服務(wù)端的SEQ(序列號(hào))+1,也就是y+1,告訴服務(wù)端下次發(fā)送時(shí),從y+1開始

四次揮手

四次揮手是因?yàn)殡m然主機(jī)1(可以是客戶端也可以是服務(wù)端)沒有信息發(fā)送給主機(jī)2了,但是不代表主機(jī)2沒有信息發(fā)送給主機(jī)1,所以主機(jī)2首先要返回一個(gè)報(bào)文,表示知道主機(jī)1沒有數(shù)據(jù)發(fā)送了,同時(shí)檢查自己是否還有數(shù)據(jù)發(fā)送,并處理完后。再向主機(jī)1發(fā)起斷開連接請(qǐng)求。

  • 第一次分手:主機(jī)1設(shè)置SEQ和ACK,向主機(jī)2發(fā)送一個(gè)FIN報(bào)文,此時(shí)主機(jī)1進(jìn)入FIN_WAIT_1狀態(tài),表示主機(jī)1沒有數(shù)據(jù)要發(fā)送給主機(jī)2了
  • 第二次分手:主機(jī)2收到主機(jī)1發(fā)來的FIN報(bào)文,向主機(jī)1回復(fù)一個(gè)ACK報(bào)文。主機(jī)1進(jìn)入FIN_WAIT_2狀態(tài),主機(jī)2告訴主機(jī)1,同意你的請(qǐng)求
  • 第三次分手:主機(jī)2向主機(jī)1發(fā)送FIN報(bào)文,請(qǐng)求關(guān)閉連接。同時(shí)主機(jī)2進(jìn)入LAST_ACK狀態(tài)
  • 第四次分手:主機(jī)1收到主機(jī)2的FIN報(bào)文,向主機(jī)2發(fā)送ACK報(bào)文,然后主機(jī)1進(jìn)入TIME_WAIT狀態(tài),主機(jī)2收到主機(jī)1的ACK報(bào)文以后,就關(guān)閉連接。此時(shí)主機(jī)1等待2MSL(報(bào)文最大生存時(shí)間)后依然沒有收到回復(fù),則證明主機(jī)2連接已經(jīng)正常關(guān)閉,那么主機(jī)1也斷開連接。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容