一、三次握手html
(1)三次握手的詳述緩存
首先Client端發送鏈接請求報文,Server段接受鏈接後回覆ACK報文,併爲此次鏈接分配資源。Client端接收到ACK報文後也向Server段發生ACK報文,並分配資源,這樣TCP鏈接就創建了。服務器
最初兩端的TCP進程都處於CLOSED關閉狀態,A主動打開鏈接,而B被動打開鏈接。(A、B關閉狀態CLOSED——B收聽狀態LISTEN——A同步已發送狀態SYN-SENT——B同步收到狀態SYN-RCVD——A、B鏈接已創建狀態ESTABLISHED)網絡
(2)總結三次握手過程:tcp
起初A和B都處於CLOSED狀態——B建立TCB,處於LISTEN狀態,等待A請求——A建立TCB,發送鏈接請求(SYN=1,seq=x),進入SYN-SENT狀態——B收到鏈接請求,向A發送確認(SYN=ACK=1,確認號ack=x+1,初始序號seq=y),進入SYN-RCVD狀態——A收到B的確認後,給B發出確認(ACK=1,ack=y+1,seq=x+1),A進入ESTABLISHED狀態——B收到A的確認後,進入ESTABLISHED狀態。測試
TCB傳輸控制塊Transmission Control Block,存儲每個鏈接中的重要信息,如TCP鏈接表,到發送和接收緩存的指針,到重傳隊列的指針,當前的發送和接收序號。操作系統
(3)爲何A還要發送一次確認呢?能夠二次握手嗎?指針
答:主要爲了防止已失效的鏈接請求報文段忽然又傳送到了B,於是產生錯誤。如A發出鏈接請求,但因鏈接請求報文丟失而未收到確認,因而A再重傳一次鏈接請求。後來收到了確認,創建了鏈接。數據傳輸完畢後,就釋放了鏈接,A工發出了兩個鏈接請求報文段,其中第一個丟失,第二個到達了B,可是第一個丟失的報文段只是在某些網絡結點長時間滯留了,延誤到鏈接釋放之後的某個時間纔到達B,此時B誤認爲A又發出一次新的鏈接請求,因而就向A發出確認報文段,贊成創建鏈接,不採用三次握手,只要B發出確認,就創建新的鏈接了,此時A不理睬B的確認且不發送數據,則B一致等待A發送數據,浪費資源。htm
(4)Server端易受到SYN攻擊?blog
服務器端的資源分配是在二次握手時分配的,而客戶端的資源是在完成三次握手時分配的,因此服務器容易受到SYN洪泛攻擊,SYN攻擊就是Client在短期內僞造大量不存在的IP地址,並向Server不斷地發送SYN包,Server則回覆確認包,並等待Client確認,因爲源地址不存在,所以Server須要不斷重發直至超時,這些僞造的SYN包將長時間佔用未鏈接隊列,致使正常的SYN請求由於隊列滿而被丟棄,從而引發網絡擁塞甚至系統癱瘓。
防範SYN攻擊措施:下降主機的等待時間使主機儘快的釋放半鏈接的佔用,短期受到某IP的重複SYN則丟棄後續請求。
二、四次揮手
(1)四次揮手的詳述
假設Client端發起中斷鏈接請求,也就是發送FIN報文。Server端接到FIN報文後,意思是說"我Client端沒有數據要發給你了",可是若是你還有數據沒有發送完成,則沒必要急着關閉Socket,能夠繼續發送數據。因此你先發送ACK,"告訴Client端,你的請求我收到了,可是我還沒準備好,請繼續你等個人消息"。這個時候Client端就進入FIN_WAIT狀態,繼續等待Server端的FIN報文。當Server端肯定數據已發送完成,則向Client端發送FIN報文,"告訴Client端,好了,我這邊數據發完了,準備好關閉鏈接了"。Client端收到FIN報文後,"就知道能夠關閉鏈接了,可是他仍是不相信網絡,怕Server端不知道要關閉,因此發送ACK後進入TIME_WAIT狀態,若是Server端沒有收到ACK則能夠重傳。「,Server端收到ACK後,"就知道能夠斷開鏈接了"。Client端等待了2MSL後依然沒有收到回覆,則證實Server端已正常關閉,那好,我Client端也能夠關閉鏈接了。Ok,TCP鏈接就這樣關閉了!
數據傳輸結束後,通訊的雙方均可釋放鏈接,A和B都處於ESTABLISHED狀態。(A、B鏈接創建狀態ESTABLISHED——A終止等待1狀態FIN-WAIT-1——B關閉等待狀態CLOSE-WAIT——A終止等待2狀態FIN-WAIT-2——B最後確認狀態LAST-ACK——A時間等待狀態TIME-WAIT——B、A關閉狀態CLOSED)
(2)總結四次揮手過程:
起初A和B處於ESTABLISHED狀態——A發出鏈接釋放報文段並處於FIN-WAIT-1狀態——B發出確認報文段且進入CLOSE-WAIT狀態——A收到確認後,進入FIN-WAIT-2狀態,等待B的鏈接釋放報文段——B沒有要向A發出的數據,B發出鏈接釋放報文段且進入LAST-ACK狀態——A發出確認報文段且進入TIME-WAIT狀態——B收到確認報文段後進入CLOSED狀態——A通過等待計時器時間2MSL後,進入CLOSED狀態。
(3)爲何A在TIME-WAIT狀態必須等待2MSL的時間?
MSL最長報文段壽命Maximum Segment Lifetime,MSL=2
答: 兩個理由:1)保證A發送的最後一個ACK報文段可以到達B。2)防止「已失效的鏈接請求報文段」出如今本鏈接中。
(4)爲何鏈接的時候是三次握手,關閉的時候倒是四次握手?
答:由於當Server端收到Client端的SYN鏈接請求報文後,能夠直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。可是關閉鏈接時,當Server端收到FIN報文時,極可能並不會當即關閉SOCKET,因此只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端全部的報文都發送完了,我才能發送FIN報文,所以不能一塊兒發送。故須要四步握手。
(5)爲何TIME_WAIT狀態須要通過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?
答:雖然按道理,四個報文都發送完畢,咱們能夠直接進入CLOSE狀態了,可是咱們必須假象網絡是不可靠的,有能夠最後一個ACK丟失。因此TIME_WAIT狀態就是用來重發可能丟失的ACK報文。