wireshark抓包爲:(wireshark會將seq序號和ACK自動顯示爲相對值)
1)主機A發送標誌syn=1,隨機產生seq =1234567的數據包到服務器,主機B由syn=1知道,A要求創建鏈接; 此時狀態A爲SYN_SENT,B爲LISTEN
2)主機B收到請求後要確認鏈接信息,向A發送ack =(主機A的seq+1),標誌syn=1,ack=1,隨機產生seq=7654321的包, 此時狀態A爲ESTABLISHED,B爲SYN_RCVD
3)主機A收到後檢查ack 是否正確,即第一次發送的seq number+1,以及位碼ack是否爲1,若正確,主機A會再發送ack =(主機B的seq+1),標誌ack=1,主機B收到後確認seq值與ack=1則鏈接創建成功。 此時A、B狀態都變爲ESTABLISHED
linux
斷開鏈接過程與創建鏈接相似
1)主機A發送位碼爲FIN=1,用來關閉客戶A到服務器B的數據傳送。此時A的狀態爲FIN_WAIT_1
2)服務器B收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1。此時A爲FIN_WAIT_2,B爲CLOSE_WAIT
3)服務器B關閉與客戶端A的鏈接,發送一個FIN給客戶端A。此時A爲TIME_WAIT,B爲LAST_ACK
4)客戶端A發回ACK報文確認,並將確認序號設置爲收到序號加1。此時A、B都關閉了,狀態變爲CLOSED。
當(2)、(3)步中的ACK和FIN在一個包中發送時,A的狀態會直接從FIN_WAIT_1變爲TIME_WAIT
安全
由於每一個方向都須要一個FIN和ACK,當一端發送了FIN包以後,處於半關閉狀態,此時仍然能夠接收數據包。
在創建鏈接時,服務器能夠把SYN和ACK放在一個包中發送。
可是在斷開鏈接時,若是一端收到FIN包,但此時仍有數據未發送完,此時就須要先向對端回覆FIN包的ACK。等到將剩下的數據都發送完以後,再向對端發送FIN,斷開這個方向的鏈接。
所以不少時候FIN和ACK須要在兩個數據包中發送,所以須要四次握手
服務器
持續時間未2MSL,一個數據包在網絡中的最長生存時間爲MSL。
假設最後客戶端回覆的ACK丟失,服務器端會在超時時間到來時,重傳最後一個FIN包。
ACK和FIN在網絡中的最長生存時間就爲2MSL,這樣就能夠可靠的斷開TCP的雙向鏈接。
cookie
TCP首部選項字段多達40B,一些經常使用的字段有:
1)選項結束字段(EOP,0x00),佔1B,一個報文段僅用一次。放在末尾用於填充,用途是說明:首部已經沒有更多的消息,應用數據在下一個32位字開始處
2)無操做字段(NOP, 0x01),佔1B,也用於填充,放在選項的開頭
3)MSS(最大報文段長度),格式以下:種類(1B,值爲2),長度(1B,值爲4),數值(2B)
用於在鏈接開始時肯定MSS的大小,若是沒有肯定,就用默認的(通常實現是536B)
4)窗口擴大因子,格式以下:種類(1B,值爲3),長度(1B,值爲3),數值(1B)
新窗口值 = 首部窗口值 * 2的(擴大因子)次方
當通訊雙方認爲首部的窗口值還不夠大的時候,在鏈接開始時用這個來定義更大的窗口。僅在鏈接開始時有效。一經定義,通訊過程當中沒法更改。
5)時間戳(應用測試RTT和防止序號繞回)
6)容許SACK和SACK選項
網絡
linux內核中會維護兩個隊列:
1)未完成隊列:接收到一個SYN創建鏈接請求,處於SYN_RCVD狀態
2)已完成隊列:已完成TCP三次握手過程,處於ESTABLISHED狀態
當有一個SYN到來請求創建鏈接時,就在未完成隊列中新建一項。當三次握手過程完成後,就將套接口從未完成隊列移動到已完成隊列。
backlog曾被定義爲兩個隊列的總和的最大值,也曾將backlog的1.5倍做爲未完成隊列的最大長度
通常將backlog指定爲5
tcp
accept會監聽已完成隊列是否非空,當隊列爲空時,accept就會阻塞。當隊列非空時,就從已完成隊列中取出一項並返回。
而已完成隊列中的都是三次握手過程已經完成的,所以accept發生在三次握手以後。
測試
1)假裝的IP向服務器發送一個SYN請求創建鏈接,而後服務器向該IP回覆SYN和ACK,可是找不到該IP對應的主機,當超時時服務器收不到ACK會重複發送。當大量的攻擊者請求創建鏈接時,服務器就會存在大量未完成三次握手的鏈接,服務器主機backlog被耗盡而不能響應其它鏈接。即SYN泛洪攻擊
防範措施:
一、下降SYN timeout時間,使得主機儘快釋放半鏈接的佔用
二、採用SYN cookie設置,若是短期內連續收到某個IP的重複SYN請求,則認爲受到了該IP的攻擊,丟棄來自該IP的後續請求報文
三、在網關處設置過濾,拒絕將一個源IP地址不屬於其來源子網的包進行更遠的路由
2)當一個主機向服務器發送SYN請求鏈接,服務器回覆ACK和SYN後,攻擊者截獲ACK和SYN。而後假裝成原始主機繼續與服務器進行通訊。
spa