TCP三次握手四次揮手

TCP頭部報(bào)文

  • source port/destination port
    源/目標(biāo)端口號(hào)
  • sequence number
    字節(jié)流中每個(gè)字節(jié)的編號(hào),用于TCP通信過(guò)程中確定數(shù)據(jù)通信的有序性
  • acknowledgement number
    確認(rèn)序列號(hào),N表示之前N-1為止的所有數(shù)據(jù)都已經(jīng)確認(rèn)收到
  • ISN(Initial Sequence Number)
  • TCP FLAG
    • ACK
      ACK=0表示接收端未應(yīng)答,ACK=1表示接收端已經(jīng)接收到數(shù)據(jù)
    • SYN
      同步序列號(hào),常用于確認(rèn)端口存在,TCP握手發(fā)送的第一個(gè)數(shù)據(jù)包,SYN=1表示接收端已經(jīng)準(zhǔn)備好了
    • FIN
      數(shù)據(jù)末尾,常用于端口掃描,通知接收端已經(jīng)到數(shù)據(jù)末尾,可以關(guān)閉連接了

三次握手過(guò)程

三次握手過(guò)程其實(shí)是指建立一個(gè)TCP連接時(shí),需要客戶(hù)端和服務(wù)器總共發(fā)送3個(gè)包
三次握手主要就是為了確認(rèn)雙方的接收能力和發(fā)送能力是否正常,指定自己的初始化序列號(hào)為后面的可靠性傳輸做準(zhǔn)備。
實(shí)質(zhì)上就是連接服務(wù)器指定端口,建立TCP連接,同步雙方序列號(hào)和確認(rèn)號(hào),交換TCP窗口大小信息

  • 初始狀態(tài)
    客戶(hù)端處于closed狀態(tài),服務(wù)器端處于listen狀態(tài)

  • 第一次握手
    客戶(hù)端 發(fā)送 SYN=1(客戶(hù)端SYN) sequence num=x(客戶(hù)端ISN)
    狀態(tài) SYN_Send

  • 第二次握手
    服務(wù)端 發(fā)送 SYN=1(服務(wù)端SYN) sequence num=y(服務(wù)端ISN) ACK=1 acknowledgement number=x+1
    狀態(tài) SYN_RCVD

  • 第三次握手
    客戶(hù)端 發(fā)送 ACK=1 sequence num=x+1 acknowledgement number=y+1
    狀態(tài) ESTABLISHED

相關(guān)問(wèn)題

  • 為什么是三次握手?
    只有三次握手才能確認(rèn)雙方的發(fā)送和接收能力

  • 兩次握手行不行?
    不行,比如客戶(hù)端發(fā)送連接請(qǐng)求,但是由于網(wǎng)絡(luò)原因過(guò)了一會(huì)兒這個(gè)請(qǐng)求才到達(dá)服務(wù)端,但是客戶(hù)端又發(fā)送了一次連接請(qǐng)求,并且連接成功,傳輸完數(shù)據(jù)后關(guān)閉了連接,但是這時(shí)之前的第一次請(qǐng)求到達(dá)了服務(wù)端,如果是兩次握手,那么服務(wù)端會(huì)認(rèn)為此時(shí)建立了連接,客戶(hù)端會(huì)一直忽略服務(wù)端發(fā)送的確認(rèn)信息,造成服務(wù)端一直在等待客戶(hù)端發(fā)送數(shù)據(jù),浪費(fèi)資源

  • 什么是半連接隊(duì)列?
    服務(wù)端第一次接收到客戶(hù)端的SYN之后,會(huì)處于SYN_RCVD狀態(tài),此時(shí)連接并沒(méi)有建立,服務(wù)端會(huì)把處于這種狀態(tài)下的請(qǐng)求連接放在一個(gè)隊(duì)列中,我把這種隊(duì)列稱(chēng)為半連接隊(duì)列,服務(wù)端同時(shí)還維護(hù)一個(gè)全連接隊(duì)列。服務(wù)端發(fā)送完SYN-ACK包后,如果收不到客戶(hù)端的確認(rèn)消息,會(huì)每隔一段時(shí)間發(fā)送一次SYN-ACK包,當(dāng)發(fā)送次數(shù)超過(guò)規(guī)定次數(shù)后,會(huì)將該客戶(hù)端踢出半連接隊(duì)列。

  • ISN
    三次握手的其中一個(gè)重要功能是客戶(hù)端和服務(wù)端交換 ISN(Initial Sequence Number),以便讓對(duì)方知道接下來(lái)接收數(shù)據(jù)的時(shí)候如何按序列號(hào)組裝數(shù)據(jù)。如果 ISN 是固定的,攻擊者很容易猜出后續(xù)的確認(rèn)號(hào),因此 ISN 是動(dòng)態(tài)生成的。

  • 三次握手時(shí)可以攜帶數(shù)據(jù)么?
    第一次第二次不可以攜帶數(shù)據(jù),防止被惡意攻擊,每次都在第一次握手放入大量數(shù)據(jù),服務(wù)端會(huì)浪費(fèi)很多資源和時(shí)間來(lái)接收這些無(wú)用的報(bào)文。

  • SYN攻擊是什么?
    服務(wù)端的資源分配是第二次握手時(shí)分配的,客戶(hù)端的資源分配是第三次握手時(shí)分配的??蛻?hù)端短時(shí)間內(nèi)通過(guò)不同的偽造IP,不斷向服務(wù)端發(fā)送SYN包,服務(wù)端會(huì)和一堆不存在的IP進(jìn)行第二次握手確認(rèn),同時(shí)會(huì)將這些偽造的客戶(hù)端加入半連接隊(duì)列,導(dǎo)致正常的客戶(hù)端請(qǐng)求被擠出隊(duì)列
    防御方法:縮短超時(shí)時(shí)間、增加半連接隊(duì)列長(zhǎng)度、過(guò)濾網(wǎng)關(guān)防護(hù)、SYN cookies技術(shù)

四次揮手過(guò)程

TCP的半關(guān)閉狀態(tài),指的是TCP提供了連接的一端在結(jié)束發(fā)送后還能接收來(lái)自對(duì)方數(shù)據(jù)的能力。

  • 初識(shí)狀態(tài)
    雙方都處于ESTABLISHED狀態(tài)
  • 第一次揮手
    客戶(hù)端 發(fā)送 FIN=1 sequence num=u(客戶(hù)端seq)
    狀態(tài) FIN_WAIT1
  • 第二次揮手
    服務(wù)端 發(fā)送 ACK=1 sequence num=v(服務(wù)端seq) acknowledgement number=u+1
    狀態(tài) CLOSE_WAIT
  • 第三次揮手
    服務(wù)端 發(fā)送 FIN=1 ACK=1 sequence num=w(服務(wù)端seq) acknowledgement number=u+1
    狀態(tài) LAST_ACK
  • 第四次揮手
    客戶(hù)端 發(fā)送 ACK=1 sequence num=u+1(客戶(hù)端seq) acknowledgement number=w+1
    狀態(tài) CLOSED

相關(guān)問(wèn)題

  • 為什么是四次揮手?
    一方發(fā)送FIN=1,那么另外一方需要先ACK=1確認(rèn)收到最后一條消息,然后再另外發(fā)送一條FIN=1表示這是自己的最后一條信息。
  • 2MSL等待時(shí)間
    MSL(Maximum Segment Lifetime),報(bào)文段被丟棄前在網(wǎng)絡(luò)內(nèi)的最長(zhǎng)時(shí)間,在揮手過(guò)程中最后一次發(fā)送ACK=1包后等待2MSL的時(shí)間內(nèi)不能關(guān)閉,同時(shí)該連接在這2MSL時(shí)間內(nèi)不能再次使用。
  • 等待2MSL的意義
    • 保證客戶(hù)端發(fā)送的最后一個(gè)ACK=1包能夠到達(dá)服務(wù)端
    • 防止已經(jīng)失效的連接的請(qǐng)求包出現(xiàn)在別的連接中
最后編輯于
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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