1. 程式人生 > >簡述TCP協議的六個標誌位和三次握手與四次揮手的過程及原理

簡述TCP協議的六個標誌位和三次握手與四次揮手的過程及原理

簡述TCP協議的三次握手與四次揮手的過程及原理

       今天,我們來分享一下TCP協議的六個標誌位和三次握手與四次揮手的過程及原理。

       先介紹一下TCP中的六個控制位,

         SYN表示建立連線;

         FIN表示關閉連線;

         ACK表示響應;

         PSH表示有 DATA資料傳輸;

         RST表示連線重置;

         URG表明緊急指標有效.

       URG標誌表明緊急資料之後正常資料的起始位置,URG的序列號到緊急指標之間的資料為緊急資料,而緊急指標開始的資料才是正常資料。當URG=1時,表示分段中有緊急資料應當加速傳送。

       PSH標誌 PSH 緊急位。當PSH=1時,要求傳送方馬上傳送該分段,而接收方儘快的將報文交給應用層,不做佇列處理。

       URG=1,表示緊急指標指向包內資料段的某個位元組(資料從第一位元組到指標所指位元組就是緊急資料),不進入接收緩衝,直接交給上層程序,而餘下的資料都是要進入接收緩衝的。

      而一般情況下,TCP是要等到整個快取都填滿了後再向上交付,但是如果PSH=1的話,就不用等到整個快取都填滿,直接交付,但是這裡的交付仍然是從緩衝區中交付的。

       所以PSH要經過緩衝區而URG不需要,千萬要記住哦!

       其次,SYN和FIN不能同時有效,當出現SYN和FIN同時有效的資料包時,可能有人在惡意攻擊你的網路,要多多注意,並採取響應措施。

       而RST用於異常終止一個連結,RST報文段不會導致另一端產生任何響應,另一端根本不進行確認。收到RST的一方將終止該連線,並通知應用層連線復位。另外就是RST用於檢測半開啟連線,即一方已經關閉或異常終止連線而另一方卻還不知道,並且只要不打算在半開啟連線上傳輸資料,仍處於連線狀態的一方就不會檢測另一方已經出現異常。此時,TCP的處理原則是接收方以復位作為應答方式。其他的應該就不用解釋了吧!

       TCP協議伺服器和客戶端建立連線的過程被稱為三次握手,而TCP協議伺服器和客戶端斷開連線的過程被稱為四次揮手。在連線之前和斷開連線之後,伺服器和客戶端之間是不能傳輸資料的,

       三次握手:

First:客戶端向伺服器傳送連線的請求(SYN),並等待伺服器應答。

Second:伺服器應答(ACK)客戶端的連線請求,並向客戶端傳送連線請求(SYN),等待伺服器應答。

Third:客戶端應答(ACK)伺服器的連線請求,客戶端和伺服器連線完成,可以相互進行資料傳輸。

       分析:

       如果第二步失敗,客戶端會不斷等待然後重新發送連線請求,直到得到伺服器端應答為止。

       如果第三步失敗,伺服器端會先等待然後重新發送連線請求,在一定時間內得不到客戶端的應答,為避免伺服器受到DOC攻擊,伺服器端有權斷開它與此客戶端的連線。

       所以不管是哪一步失敗,都儘量不影響伺服器的正常執行,並且在不佔用大量系統資源的情況下,完成TCP伺服器和客戶端之間的連線。

       四次揮手:

First:客戶端完成資料接收任務,並不打算再向伺服器傳送資料時,向伺服器的傳送斷開連線的請求(FIN),並等待伺服器應答。

Second:伺服器應答(ACK)客戶端的斷開連線請求。

Third:伺服器完成資料接收任務,並不打算再向伺服器傳送資料時,向客戶端的傳送斷開連線的請求(FIN),並等待客戶端應答。

Fourth:客戶端應答(ACK)伺服器的斷開連線請求。

       此時,客服端與服務端的連線才算斷開。

注:first、second與third、fourth可以交換先後順序,因為已建立連線的雙方都可以先提出斷開連線的請求。

        分析:

       連線是為了傳輸資料,斷開是雙方暫時不再傳輸資料,為了不佔用系統資源而斷開。所以斷開前,雙方必須確定不需要再傳輸資料並且接收資料完畢,由於雙方收發資料速度不同,為確定資料接收的完整性,響應另一方斷開請求的一方,不一定都能在響應斷開請求的同時也能發起斷開請求,所以至少揮手四次才能完成斷開伺服器和客戶端的連線的功能。

       圖解三次握手和四次握手如下:

 

       三次握手其中客戶端要主動請求,如上圖所示至少通過3次才能建立伺服器和客戶端之間的連線,此時即將進入ESTABLISHED狀態。

       而四次揮手雙方都可以先提出,但是隻有都經過雙方的同意而斷開連線,才算真正的斷開了連線。由於雙方接收資料的速度可能存在不一致的問題,在保證資料被接受並且都經過雙方的同意而斷開連線的前提,至少通過四次來完成斷開連線的過程。只有一方斷開連線時,此時處於TIME_WAIT狀態,而伺服器為了減少TIME_WAIT狀態造成的資源浪費,在可能的情況下,儘量不主動斷開連線。所以一般都是客戶端主動斷開連線。

      下面簡要解釋一下ESTABLISHED狀態和TIME_WAIT狀態。

       ESTABLISHED狀態:建立連線,兩臺機器正在通訊。

       TIME_WAIT狀態:我方主動呼叫close()斷開連線,收到對方確認後狀態變為TIME_WAIT。TCP協議規定TIME_WAIT狀態會一直持續2MSL(即兩倍的分 段最大生存期),以此來確保舊的連線狀態不會對新連線產生影響。處於TIME_WAIT狀態的連線佔用的資源不會被核心釋放,所以作為伺服器,在可能的情況下,儘量不要主動斷開連線,以減少TIME_WAIT狀態造成的資源浪費。

       目前有一種避免TIME_WAIT資源浪費的方法,就是關閉socket的LINGER選項。但這種做法是TCP協議不推薦使用的,在某些情況下這個操作可能會帶來錯誤。該怎麼避免TIME_WAIT狀態,達到減少資源浪費,在接下來的部落格會有介紹。

      分享如上,如有錯誤,望斧正!願大家學習有進步!