三次握手和四次揮手

三次握手和四次揮手

  • 序號: 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關閉.
相關文章
相關標籤/搜索