簡述tcp/ip三次握手、四次揮手、全連接、半連接

tcp/ip

三次握手:

1、client向server端發送建立tcp連接的請求報文,其中包含seq序列號,爲client隨機生成的數字x,並且將報文中的syn置爲1,表示需要建立tcp連接。(syn=1,seq=x
2、server端回覆報文,其中seq爲隨機生成的數字y,ack爲x+1,syn爲1。(syn=1,ack=x+1,seq=y)
3、client端收到server端報文後,回覆請求做ack驗證,在服務端發送過來的seq+1。(syn=1,ack=y+1,seq=x+1)

完成tcp連接。

四次揮手:

1、client發送請求斷開連接的報文,其中包含隨機生成的seq數字x。(fin=1,seq=x
2、server收到報文後回覆報文,seq爲隨機生成的數字y,ack爲x+1,以便client端知道自己的tcp斷開請求已經得到驗證。(fin=1,ack=x+1,seq=y
3、server端並不會立即斷開連接,而是等待傳送到client端的數據發送完畢,之後會生成隨機seq返回報文。(fin=1,ack=x+1,seq=z
4、client端收到斷開連接的請求後,會回覆server端的斷開連接。(fin=1,ack=z+1,seq=h

完成tcp斷開連接。

全連接、半連接:

client端和server端在完成三次握手的過程中,會有一個半連接池和一個全連接池。

在第二次握手的時候,server端在發送ack報文的同時會將連接放到半連接池中,半連接池默認大小爲1024,在收到client端的ack報文(也就是第三次握手)之後會將請求從半連接池中取出放到全連接池中。
如果這個過程中,一直沒有收到client端的ack請求,服務端會一直重試發送ack+syn請求給client端,linux默認爲5次。

從半連接池放到全連接池的過程中有多種情況:
1、全連接池未滿:從半連接池中放到全連接池中,之後server端accept()請求。
2、全連接池滿,tcp_abort_on_overflow=0:server端丟棄client端發送的ack數據,定時重試第二次握手數據,如果client端一直排不上隊,報超時異常。
3、全連接池滿,tcp_abort_on_overflow=1:server端發送一個reset包給client端,表示廢棄這次tcp連接,client端報錯。

SYN flooding攻擊:

指client端惡意發送syn連接給server端,並且不做ack迴應,將server端的半連接池惡意佔滿。
linux實現了一種叫做SYNcookie的機制,簡單說就是將client端的連接信息保存在ISN中返回給client端,在client端發送ack迴應的時候,從ISN中解析出連接信息完成三次握手,避免半連接池佔滿。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章