TCP3次握手:
---------------------------------
是指建立1個TCP連接時,需要客戶端和服務器總共發送3個包。
3次握手的目的是連接服務器指定端口,建立TCP連接,并同步連接雙方的序列號和確認號并交換 TCP 窗口大小信息,在socket編程中,客戶端履行connect()時。將觸發3次握手。
序號(seq):本報文段所發送的數據的第1個字節的序號
確認號(ack):是期望收到對方下1個報文段的第1個數據字節的序號;若確認號為x,則到序號x⑴為止(包括x⑴)的所有數據都已正確收到
確認(ACK):僅當 ACK=1 時,確認號字段才有效,當 ACK=0時,確認號無效;TCP規定:在連接建立后所有傳送的報文都必須把ACK置1
同步(SYN):當 SYN=1 而 ACK=0 時,表明這是1個連接要求報文段,若對方同意建立連接,則應在響應的報文中使用 SYN=1 和 ACK=1 ;SYN=1 就表示這是1個連接要求或連接接受報文。
終止(FIN):用來釋放1個連接。當 FIN=1 時,表明此報文的發送方的數據已發送終了,并要求釋放運輸連接。
TCP規定:
*在連接建立后所有傳送的報文都必須把ACK置1。
*SYN 報文段、FIN 報文段不能攜帶數據,但要消耗掉1個序號。
*ACK 報文段可以攜帶數據,但如果不攜帶數據則不消耗序號。
1個完全的3次握手也就是:要求--應對--再次確認
第1次握手:
客戶端進程向服務器進程發出連接要求報文段,報文段首部中 (初始)序號seq=x,同步SYN=1,這時候客戶端進程進入SYN-SENT(同步已發送)狀態。
第2次握手:
服務器進程收到連接要求報文段后,若同意建立連接,則向客戶端進程發送響應報文段,報文段首部中 同步SYN=1,確認ACK=1,確認號ack=x+1(注:確認號ack=客戶端進程的seq+1),(初始)序號seq=y,這時候服務器進程進入SYN-RCVD(同步收到)狀態。
第3次握手:
客戶端進程收到服務器進程的響應報文段后,還要想服務器進程發出確認報文段,報文段的首部中 同步SYN=0,確認ACK=1,確認號ack=y+1,序號seq=x+1,這時候TCP連接已建立,客戶端進程和服務器進程都進入ESTABLISHED(已建立連接)
完成3次握手,主機A與主機B開始傳送數據
注:序號seq等于前面已傳送過的數據的最后1個字節的序號+1,在第1次握手中,seq=x,SYN=1(占1個序號位,即把 x 這個序號位給占了,所以下1次傳送的序號應當從x+1開始,揮手時的FIN也同理)
---------------------------------
TCP 4次揮手
---------------------------------
TCP的連接的撤除需要發送4個包,因此稱為4次揮手(four-way handshake)。客戶端或服務器都可主動發起揮手動作,在socket編程中,任何1方履行close()操作便可產生揮手操作
第1次揮手:
客戶端進程向服務器段進程發出連接釋放報文段,并停止再發送數據,主動關閉TCP連接,報文段首部中 終止FIN=1,序號seq=u,此時客戶端進程進入FIN-WAIT⑴(終止等待1)狀態
第2次揮手:
服務器進程收到客戶端進程的連接釋放報文段后,向客戶端進程發送確認報文段,報文段首部中 確認ACK=1,確認號ack=u+1,序號seq=v,此時服務器進程就進入CLOSE-WAIT(關閉等待)狀態,并通知高層利用進程。
客戶端進程收到服務器進程的確認報文段后,客戶端進程就進入FIN-WAIT⑵(終止等待2)狀態。
第3次揮手:
利用進程通知服務器進程釋放連接后,服務器進程發出連接釋放報文段,報文段首部中 確認ACK=1,FIN=1 ,序號seq=w(在半關閉狀態時服務器進程可能又發送了1些數據),確認號ack=u+1,此時服務器進程進入LAST-ACK(最后肯定)狀態。
第4次揮手:
客戶端進程收到服務器進程的連接釋放報文段后,向服務器進程發送肯定報文段,報文段段首部中 確認ACK=1,序號seq=u+1,確認號ack=w+1,此時客戶端進程進入到TIME-WAIT(時間等待)狀態,等到等待時間過后,2者才都進入到CLOSED(關閉)狀態
*>3次握手的目的:
1 要雙方做好發送數據的準備工作(雙方都知道彼此已準備好)
2 要雙方就初始序列號進行協商和肯定
*>3次握手改成兩次握手會產生死鎖
如果采取兩次握手,有以下情況:A,B兩臺主機,A發送連接要求,B給予確認,則認為連接建立,如果B的確認包在傳輸的進程中丟失,對A而言將1直處于等待B的確認狀態,而B認為建立以成功,可以傳輸數據,B傳給A的數據,A將不予接受,從而B處于等待A的確 認狀態,相互等待造成死鎖。
*>SYN攻擊
在3次握手進程中,服務器發送SYN-ACK以后,收到客戶真個ACK之前的TCP連接稱為半連接(half-open connect).此時服務器處于SYN-RCVD狀態.當收到ACK后,服務器轉入ESTABLISHED狀態.
SYN攻擊就是 攻擊客戶端 在短時間內捏造大量不存在的IP地址,向服務器不斷地發送syn包,服務器回復確認包,并等待客戶的確認,由于源地址是不存在的,服務器需要不斷的重發直至超時,這些捏造的SYN包將長時間占用未連接隊列,正常的SYN要求被拋棄,目標系統運行緩慢,嚴重者引發網絡梗塞乃至系統癱瘓。
SYN攻擊是1個典型的DDOS攻擊。檢測SYN攻擊非常的方便,當你在服務器上看到大量的半連接狀態時,特別是源IP地址是隨機的,基本上可以判定這是1次SYN攻擊.在Linux下可以以下命令檢測是不是被Syn攻擊
netstat -n -p TCP | grep SYN_RECV
1般較新的TCP/IP協議棧都對這1進程進行修正來防范SYN攻擊,修改tcp協議實現。主要方法有SynAttackProtect保護機制、SYN cookies技術、增加最大半連接和縮短超時時間等.但是不能完全防范syn攻擊