tcp 四次挥手_TCP三次握手和四次挥手
1,TCP三次握手
第一次握手:客戶端發送syn包(syn=x)到服務器,并進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=x+1),同時自己也發送一個SYN包(syn=y),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=y+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。
問題1:為什么是3次而不是兩次或四次?
如果是兩次握手,客戶端向服務端發的syn由于網絡原因,在上次連接失效后才傳給了服務端,服務端以為是新的連接,發送ack+syn后便開始等待數據傳輸,但是其實客戶端并沒有發送syn,服務端就會一直傻傻的等待
如果是四次握手,三次握手都能搞定的事,增加一次握手并不能提高可靠性,所以沒必要
問題2:什么是SYN攻擊?
Syn攻擊就是 攻擊客戶端 在短時間內偽造大量不存在的IP地址,向服務器不斷地發送syn包,服務器回復確認包,并等待客戶的確認,由于源地址是不存在的,服務器需要不斷的重發直 至超時,這些偽造的SYN包將長時間占用未連接隊列,正常的SYN請求被丟棄,目標系統運行緩慢,嚴重者引起網絡堵塞甚至系統癱瘓。
解決辦法: SynAttackProtect保護機制、SYN cookies技術、增加最大半連接和縮短超時時間等
2,TCP數據傳輸
3,TCP四次揮手
第一次揮手:客戶端發送一個FIN,用來關閉客戶端到服務器的數據傳送,此時客戶端不會再發新的數據,但是還可以接受數據
第二次揮手:服務器收到FIN包后,發送一個ACK給對方并且帶上自己的序列號seq,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態,還可以發送數據
客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送連接釋放報文
第三次揮手:服務器發送一個FIN,用來關閉服務器到客戶端的數據傳送,也就是告訴客戶端,我的數據也發送完了,不會再給你發數據了, 此時,服務器就進入了LAST-ACK(最后確認)狀態,等待客戶端的確認。
第四次揮手:主動關閉方收到FIN后,發送一個ACK給被動關閉方,確認序號為收到序號+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態, 必須經過2?MSL的時間后,才進入CLOSED狀態。
服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態。
問題1: 為什么建立連接是3次握手,關閉連接卻是4次揮手?
建立連接的時候, 服務器在LISTEN狀態下,收到建立連接請求的SYN報文后,把ACK和SYN放在一個報文里發送給客戶端。
而關閉連接時,服務器收到對方的FIN報文時,僅僅表示對方不再發送數據了但是還能接收數據,而自己也未必全部數據都發送給對方了,所以己方可以立即發送FIN,也可以發送一些數據給對方后,再發送FIN報文給對方來表示同意現在關閉連接,因此,己方ACK和FIN一般都會分開發送,從而導致多了一次。
問題2:為什么要等待2msl ?
第一,保證客戶端發送的最后一個ACK報文能夠到達服務器,因為這個ACK報文可能丟失,站在服務器的角度看來,我已經發送了FIN+ACK報文請求斷開了,客戶端還沒有給我回應,應該是我發送的請求斷開報文它沒有收到,于是服務器又會重新發送一次,而客戶端就能在這個2MSL時間段內收到這個重傳的報文,接著給出回應報文,并且會重啟2MSL計時器。
第二,防止類似與“三次握手”中提到了的“已經失效的連接請求報文段”出現在本連接中。客戶端發送完最后一個確認報文后,在這個2MSL時間中,就可以使本連接持續的時間內所產生的所有報文段都從網絡中消失。這樣新的連接中不會出現舊連接的請求報文。
總結
以上是生活随笔為你收集整理的tcp 四次挥手_TCP三次握手和四次挥手的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python hello world重复
- 下一篇: 杂志订阅管理系统c++_电池管理系统BM