TCP/IP協議三次握手和四次揮手大白話解說
TCP/IP協議三次握手和四次揮手大白話解說
前言
昨天晚上被一位師傅問到了TCP/IP的工作機制,心裏很清楚三次握手,然而對於四次揮手卻忘了,這是大學習裏學過的,奮而翻閱書籍和網絡對之前所學的做一個溫顧,算是夯實自我吧。
TCP(Transmission Control Protocol)網絡傳輸控制協議,是一種面向連接的、可靠的、基於字節流的傳輸層通信協議,數據傳輸前建立連接的工作要經過三次握手,數據傳輸後斷開連接的工作要經過四次揮手。
工作過程
TCP標誌位:
TCP共有6個標誌位,分別是:
- SYN(synchronous),建立聯機。
- ACK(acknowledgement),確認。
- PSH(push),傳輸。
- FIN(finish),結束。
- RST(reset),重置。
- URG(urgent),緊急。
圖解三次握手和四次揮手的過程:
三次握手建立連接闡述:
第一次握手:客戶端要和服務端進行通信,首先要告知服務端一聲,遂發出一個SYN=1的連接請求信號,”服務端哥哥,我想給你說說話”。
第二次握手:當服務端接收到客戶端的連接請求,此時要給客戶端一個確認信息,”我知道了(ACK),我這邊已經準備好了,你現在能連嗎(SYN)”。
第三次握手:當客戶端收到了服務端的確認連接信息後,要禮貌的告知一下服務端,“好的,咱們開始聯通吧(ACK)”。
到此整個建立連接的過程已經結束,接下來就是雙方你一句我一句甚至同時交流傳遞信息的過程了。
四次揮手斷開連接闡述:
第一次揮手:雙方交流的差不多了,此時客戶端也已經結尾了,接下來要斷開通信連接,所以告訴服務端“我說完了(FIN)”,此時自身形成等待結束連接的狀態。
第二次揮手:服務端知道客戶端已經沒話說了,服務端此時還有兩句心裏話要給客戶端說,“我知道你說完了(ACK),我再給你說兩句,&*……%¥”。
第三次揮手:此時客戶端洗耳恭聽繼續處於等待結束的狀態,服務器端也說完了,自身此時處於等待關閉連接的狀態,並對告訴客戶端,“我說完了,咱們斷了吧(FIN)”。
第四次揮手:客戶端收知道服務端也說完了,也要告訴服務端一聲(ACK),因為連接和斷開要雙方都按下關閉操作才能斷開,客戶端同時又為自己定義一個定時器,因為不知道剛才說的這句話能不能準確到達服務端(網絡不穩定或者其他因素引起的網絡原因),默認時間定為兩個通信的最大時間之和,超出這個時間就默認服務器端已經接收到了自己的確認信息,此時客戶端就關閉自身連接,服務器端一旦接收到客戶端發來的確定通知就立刻關閉服務器端的連接。
到此為止雙方整個通信過程就此終結。這裏要聲明一下:斷開鏈接不一定就是客戶端,誰都可以先發起斷開指令,另外客戶端和服務端是沒有固定標準的,誰先發起請求誰就是客戶端。
問題:
1.為什麽斷開鏈接的時候客戶端設置的定時器時間等待要2MSL(兩個通信報文的最大時間)?
這個問題也很好理解,當客戶端最終告訴服務器端斷開確認的時候,他不知道自己的發出的指令是否能準確的一次性被服務器接收。假如服務器沒有接收到(這已經耗費了一個報文的最大通信時間了),服務器端將會重新發起一個結束通話的指令(FIN)到客戶端,客戶端又接收到了服務器發來的結束通信指令將繼續給服務器進行一個確認,有人會說那要是客戶端發出的確認信息服務端沒收到,而服務端重發的斷開指令客戶端也沒收到怎麽辦,說實話我也無奈,遇到這種情況咱們幹脆認為網確實不行了。
2.為什麽建立連接要三次握手而斷開連接要四次揮手?
說起這個,打一個比喻,目前祖國正在高速發展高鐵,建立連接的過程正如上海到北京打通一條高鐵線,TCP通信過程是一個全雙工模式,即在這條高鐵線上要有兩個軌道,即能從上海發車到北京又能從北京發車到上海,甚至兩邊可以同時發車。所以斷開連接前提就是要保證兩條軌道都沒有車,然後雙方才能各自發起斷開動作。
雙方各自工作流程圖:
客戶端工作流程:
註意:在TIME_WAIT狀態中,如果TCP client端最後一次發送的ACK丟失了,它將重新發送。TIME_WAIT狀態中所需要的時間是依賴於實現方法的。典型的值為30秒、1分鐘和2分鐘。等待之後連接正式關閉,並且所有的資源(包括端口號)都被釋放。
服務器端工作流程:
附加
SYN網絡攻擊:
原理:
在三次握手過程中,Server發送SYN-ACK之後,收到Client的ACK之前的TCP連接稱為半連接(half-open connect),此時Server處於SYN_RCVD狀態,當收到ACK後,Server轉入ESTABLISHED狀態。SYN攻擊就是Client在短時間內偽造大量不存在的IP地址,並向Server不斷地發送SYN包,Server回復確認包,並等待Client的確認,由於源地址是不存在的,因此,Server需要不斷重發直至超時,這些偽造的SYN包將產時間占用未連接隊列,導致正常的SYN請求因為隊列滿而被丟棄,從而引起網絡堵塞甚至系統癱瘓。
檢測:
SYN攻擊時一種典型的DDOS攻擊,檢測SYN攻擊的方式非常簡單,即當Server上有大量半連接狀態且源IP地址是隨機的,則可以斷定遭到SYN攻擊了。windows下打開cmd,輸入命令:”netstat -n -p TCP“,查看是否有大量的”SYN_RECEIVED“狀態。
以下圖片是表明正常的。
參考:TCP/IP協議三次握手和四次揮手大白話解說
TCP/IP協議三次握手和四次揮手大白話解說