1. 程式人生 > 遊戲攻略 >《寶可夢晶燦鑽石明亮珍珠》雙版本限定寶可夢一覽表

《寶可夢晶燦鑽石明亮珍珠》雙版本限定寶可夢一覽表

TCP建立連結的過程需要經歷三次握手,TCP斷開連線的過程需要四次揮手

一、TCP是傳輸層協議,對應OSI網路模型的第四層傳輸層。特點如下:

  1. TCP協議是基於連線的,也就是傳輸資料前需要先建立好連結,然後再進行傳輸。
  2. TCP連結一旦建立,就可以在連結上進行雙向的通訊。
  3. TCP的傳輸是基於位元組流而不是報文,將資料按位元組大小進行編號,接收端通過ACK來確認收到的資料編號,通過這種機制,TCP協議能夠保證接收資料的有序性和完整性,因此TCP能夠提供可靠性傳輸。
  4. TCP還能提供流量控制的能力,通過滑動視窗來控制資料的傳送速率。滑動視窗的本質是動態緩衝區,接收端根據自己的處理能力,在TCP的Header中動態調整視窗的大小,通過ACK應答包通知給傳送端,傳送端根據視窗大小調整發送的速度。
  5. 僅僅有了流量控制能力還不夠,TCP協議還考慮了網路問題可能會導致大量重傳,進而導致網路情況進一步惡化,因此TCP協議還提供擁塞控制。TCP處理擁塞控制主要用到了慢啟動、擁塞避免、擁塞發生、快速恢復四個演算法。

二、詳解三次握手建立連結

TCP是基於連結的,所以在傳輸資料前需要先建立連結,TCP在傳輸上是雙工傳輸,不區分Client端和Server端,為了便於理解,我們將主動發起建鏈請求的的那端稱為Client端,把被動建立連結的一端稱作Server端。****

首先建立連結前需要Server端先監聽埠,因此Server端建立連結前的初始狀態就是LISTEN狀態,這時Client端準備建立連結,先發送一個SYN同步包,傳送完同步包後,Client端的連結狀態變成了 SYN_SENT 狀態。Server 端收到 SYN 後,同意建立連結,會向 Client 端回覆一個 ACK。

由 於 TCP 是 雙 工 傳 輸 , Server 端 也 會 同 時 向 Client 端 發 送 一 個 SYN , 申 請 Server 向 Client 方向建立連結。傳送完 ACK 和 SYN 後,Server 端的連結狀態就變成了 SYN_RCVD。

Client 收到 Server 的 ACK 後,Client 端的連結狀態就變成了 ESTABLISHED 狀態。同時,Client 向 Server 端傳送 ACK,回覆 Server 端的 SYN 請求。

Server 端收到 Client 端的 ACK 後,Server 端的連結狀態也就變成了的 ESTABLISHED 狀態,此時建連完成,雙方隨時可以進行資料傳輸。

大家想必都聽過SYN泛洪攻擊,這個是發生在服務端收到Client的SYN請求後,傳送了ACK和SYN,但是Client端不進行回覆。導致Server端大量的連結處於SYN_RCVD狀態,進而影響其他正常請求的建連。

那麼如何防範這種攻擊呢?

1、修改等待數
sysctl -w net.ipv4.tcp_max_syn_backlog=2048

2、啟用syncookies
sysctl -w net.ipv4.tcp_syncookies=1

3、修改重試次數
sysctl -w net.ipv4.tcp_syn_retries = 0
重傳次數設定為0,只要收不到客戶端的響應,立即丟棄該連線,預設設定為5次

4、限制單IP併發數
使用iptables限制單個地址的併發連線數量:
iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 10 --connlimit-mask 32 -j REJECT

5、限制C類子網併發數
使用iptables限制單個c類子網的併發連結數量:
iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 10 --connlimit-mask 24 -j REJECT

6、限制單位時間內連線數
設定如下:
iptables -t filter -A INPUT -p tcp --dport 80 -m --state --syn -m recent --set iptables -t filter -A INPUT -p tcp --dport 80 -m --state --syn -m recent --update --seconds 60 --hitcount 30 -j DROP

7、修改modprobe.conf
為了取得更好的效果,需要修改/etc/modprobe.conf
options ipt_recent ip_list_tot=1000 ip_pkt_list_tot=60
作用:記錄10000個地址,每個地址60個包,ip_list_tot最大為8100,超過這個數值會導致iptables錯誤

8、限制單個地址最大連線數
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j D

三、詳解四次握手斷開連結


TCP 連結的關閉,通訊雙方都可以先發起,我們暫且把先發起的一方看作 Client,從圖中 看出,通訊中 Client 和 Server 兩端的連結都是 ESTABLISHED 狀態,然後 Client 先主動 發起了關閉連結請求,Client 向 Server 傳送了一個 FIN 包,表示 Client 端已經沒有資料要傳送了,然後 Client 進入了 FIN_WAIT_1 狀態。

Server 端收到 FIN 後,返回 ACK,然後進入 CLOSE_WAIT 狀態。此時 Server 屬於半關 閉狀態,因為此時 Client 向 Server 方向已經不會發送資料了,可是 Server 向 Client 端可能還有資料要傳送。

當 Server 端資料傳送完畢後,Server 端會向 Client 端傳送 FIN,表示 Server 端也沒有數 據要傳送了,此時 Server 進入 LAST_ACK 狀態,就等待 Client 的應答就可以關閉連結了。

Client 端 收 到 Server 端 的 FIN 後 , 回 復 ACK , 然 後 進 入 TIME_WAIT 狀 態 。TIME_WAIT 狀態下需要等待 2 倍的最大報文段生存時間,來保證連結的可靠關閉,之後才會進入 CLOSED 關閉狀態。而 Server 端收到 ACK 後直接就進入 CLOSED 狀態。

疑問1:問為什麼需要等待 2 倍最大報文段生存時間之後再關閉連結?
原因是:

  1. 保證 TCP 協議的全雙工連線能夠可靠關閉;
  2. 保證這次連線的重複資料段從網路中消失,防止埠被重用時可能產生資料混淆。

疑問2:為啥建立連結需要3次,斷開連結需要4次?
原因:
從這個互動流程可以看出,無論是建連還是斷鏈,都是需要在兩個方向上進行,只不過建連時,Server 端的 SYN 和 ACK 合併為一次傳送,而斷鏈時,兩個方向上資料傳送停止的時 間可能不同,所以不能合併傳送 FIN 和 ACK。這就是建連三次握手而斷鏈需要四次的原因。

參考網址伺服器遭到SYN攻擊怎麼辦?如何防禦SYN攻擊?

本文來自部落格園,作者:程式設計狸,轉載請註明原文連結:https://www.cnblogs.com/ping-pong/p/15675791.html