三次握手和四次揮手

三次握手和四次揮手

  • 序號: seq序號, 佔32位, 用來標識從TCP源端向目地端發送的字節流, 發起方發送數據的時候對此進行標記。
  • 確認序號: ack序號佔32位,只有ACK標誌位爲1的時候, 確認序號字段纔有效,ack=seq+1.
  • 標誌位: 共6個,即URG, ACK, PSH, RST, SYN, FIN等, 具體含義如下:
  • URG: 緊急指針.
  • ACK: 確認序號有效
  • PSH: 接收方應該儘快將這個報文交給應用層.
  • RST: 重置鏈接.
  • SYN: 發起一個鏈接.
  • FIN: 釋放一個鏈接.

首先Client端發送鏈接請求報文, Server端接收鏈接後回覆ACK報文, 併爲這次鏈接分配資源. Client端接收到ACK報文後也想Server端發送ACK報文, 並分配資源, 這樣TCP就成功建立了鏈接.

enter image description here

最初的兩端TCP進行都處於Closed關閉狀態, A主動打開鏈接, 而B被動打開鏈接.

  • B的TCP服務器進程先創建傳輸控制塊, 準備接收客戶端進程的連接請求. 然後服務器進程就處於Listen狀態, 等到客戶的連接請求.
  • 第一次握手: A的TCP客戶端進程創建傳輸控制塊TCB, 然後向B發出鏈接請求報文段, 這時候會給一個 隨機的x 並且SYN=1, 處於發起一個鏈接的請求.
  • 第二次握手: B收到連接請求報文之後, 也收到了A給的隨機x, 這時候給一個 SYN=1 處於請求鏈接階段, ACK=1 確認序號是有效的, 並且隨機發送一個y 和 ack=x+1, 確認這個請求是第一次握手的第二次回覆.
  • 第三次握手: TCP客戶進程收到B的確認之後, 給B確認報文段 ACK=1 確認號ack=y+1, 序號seq=x+1
  • 當B收到A的確認消息之後, 鏈接建立成功.

  • 第一次握手: 起初的時候兩端都處於Closed 關閉狀態, Client將標誌位SYN至爲1, 隨機產生一個seq=x, 並將該數據包發送給Server, Client進入SYN-SENT狀態, 等待Server的確認.
  • 第二次握手: Server收到數據報之後由標誌位SYN=1得知 Client請求建立連接, Server將標誌位SYN和ACK都設置位1, ack=x+1, 隨機產生一個seq=y, 並且將該數據報發送給Client以確認請求, Server進入SYN-RCVD狀態, 此時操作系統位TCP鏈接分配TCP緩存和變量.
  • 第三次握手: Client收到確認之後, 檢查ack是不是x+1, ACK是否爲1, 如果正確則將標誌位ACK至爲1, ack=y+1, 並且此時操作系統爲該TCP鏈接分配TCP緩存和變量, 並將該數據包發送給Server, 此時Server檢查ack是不是y+1, ACK是否爲1, 如果是則鏈接鏈接成功.

SYN攻擊.

遊戲中的炸房就是這個原理. 服務器端的資源分配是在第二次握手的時候分配的, 而客戶端的資源是在第三次握手的時候分配的, 所以服務器容易受到SYN攻擊, SYN攻擊就是客戶端在短時間內僞造大量不存在的IP地址, 並向Server不斷的發送SYN包, Server則回覆確認包, 等到Client的確認 然後自己確認二次握手的信息完成 TCP建立, 但是 因爲Server需要回復第一握手的SYN, 並且IP是僞造的, 所以Server需要不斷髮送直至超時, 這樣就造成了大量的資源浪費, 引起來網絡擁塞設置系統癱瘓.

四次揮手

假設Client端發送中斷連接請求, 也就是FIN. Server端收到了FIN之後就知道 客戶端沒有消息需要發送給服務端了, 但是如果服務端還有消息沒有發送完畢的話 就不着急關閉
Socket, 可以繼續發送數據, 但是服務端是知道客戶端任務已經完成的了, 所以這個時候發送ACK=1 告訴客戶端, 你的關閉請求我知道了, 但是我這邊還需要給你發送消息, 你再等等我的消息. 當服務端完成任務之後, 服務端給客戶端 發送FIN, 客戶端接收到FIN之後就知道服務器也準備好了. 然後客戶端給服務器發送消息說 我要關閉連接了, 然後等待一段時間, 如果服務器沒有再次發送消息, 就說明他收到了上一條消息, 然後大家就都關閉了.
enter image description here

  • A的應用進程先向TCP發送鏈接釋放報文段(FIN=1, 序號seq=u), 並停止繼續發送消息. A發送鏈接釋放報文段的意義就是說自己的活幹完了, 我這邊可以結束連接了.
  • B收到之後發送確認報文段(ACK=1, 確認號ack=u+1, 序號seq=v). 然後B進入關閉等待狀態, 此時TCP處於半 關閉狀態, A到B的鏈接釋放. 然後B速度完成自己的任務.
  • A收到B的消息之後, 進入等待狀態, 等待B完成自己的任務.
  • B任務完成, 然後B請求釋放鏈接. (FIN=1, ACK=1,seq=w, 確認號ack=u+1), B進入最後確認狀態, 等待A的確認.
  • A收到B的鏈接釋放報文之後, 對此發出報文段 (B收到消息, 然後關閉. B沒有收到消息, 一段時間後再次四次揮手.), 然後進入等待關閉狀態, 如果B一段時間內沒有回覆消息就說明已經收到了A的確認關閉消息, 然後A關閉.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章