網絡編程----TCP/UDP協議重點詳解(1)

TCP、UDP協議是TCP/IP協議族中很重要的傳輸層協議。和IP協議相比,TCP、UDP更靠近應用層,可操作性更強。TCP協議本身的可靠性也爲網絡中的傳輸提供了一定的保障。相比於TCP協議,UDP協議傳輸和編程更簡單。

TCP的特點:面向連接的,可靠的,字節流服務

TCP協議支持的是端對端的通信,使用TCP通信的雙方必須先建立連接,才能開始數據的讀寫(基於廣播和多播的應用程序不能使用TCP服務)。TCP在數據傳遞時,有確認、窗口、重傳、擁塞控制機制保證數據的可靠傳輸。TCP連接是全雙工的,完成數據交換後,通信雙方必須斷開連接來釋放系統資源。

TCP的C/S模型及建立連接:

 當客戶端發起連接時,TCP通過三次握手建立連接

三次握手的作用:

①確認雙方的接受能力、發送能力是否正常;②指定自己的初始化序列號,爲之後的可靠傳輸做準備(如果是https協議的話,三次握手的過程還會進行數字證書的驗證及加密密鑰的生成)

爲什麼是三次握手,而不是兩次或者四次?

如果只有兩次握手的話,比如說失效的報文段,突然發送到服務端,服務端收到失效報文段的請求後,會發送確認報文,新的連接就建立起來了。但現在由於客戶端並沒有發出請求,所以並不會理睬服務端的確認,也不會像服務端發送數據。而服務端以爲已經連接起來了,一直在等待,會浪費服務器資源。

三次連接的就可以建立連接,四次會浪費網絡資源。

在三次握手過程中,哪個階段容易被攻擊?

在第二次握手服務器處於SYN_REC狀態時容易被攻擊。服務器第一次收到客戶端的 SYN 之後,就會處於 SYN_REC狀態,此時雙方還沒有完全建立其連接,服務器會把此種狀態下請求連接放在一個隊列裏,我們把這種隊列稱之爲半連接隊列(已經完成三次握手,建立起連接的就會放在全連接隊列中)。如果此階段下有同一客戶端不斷的向服務器發送連接,半連接隊列被全部佔用,就會導致其他客戶端不能再連接服務器。(syn溢出攻擊/syn泛洪

四次 揮手斷開連接:

爲什麼是四次揮手?三次行不行?

TCP建立連接要進行3次握手,而斷開連接要進行4次,因爲TCP連接是全雙工的(數據可在兩個方向上同時傳遞)所以進行關閉時每個方向上都要單獨進行關閉。關閉的方法是一方完成它的數據傳輸後,就發送一個FIN來向另一方通告將要終止這個方向的連接。另一端收到一個FIN,它必須通知應用層TCP連接已終止了這個方向的數據傳送並回復確認信息。

當服務器收到客戶端的FIN時,並不會立即關閉連接,會先向客戶端發送一個ACK通知客戶端已經收到了關閉通知。等到將數據發送完後,纔會向客戶端發送自己的FIN。

爲什麼要有TIME_WAIT狀態?

(TIME_WAIT存在時間約爲2MSL,一般2分鐘左右---->MSL:最大報文段生存時間,2MSL:報文段收到並回復的總時間)

①可靠的終止TCP連接

客戶端發出的最後一個ACK可能會丟失,服務器如果沒有收到客戶端的確認信息,就會不斷的發送FIN。所以客戶端不能立即關閉,必須在確認服務器接收到了ACK之後纔會關閉。客戶端會設置一個計時器,等待2MLS的時間,如果這段時間內再次接收到FIN,那麼重發ACK並再次等待2MSL。如果2MSL時間內沒有再次收到FIN,那麼說明服務器成功接收ACK,則關閉TCP連接。

②保證遲來的數據被識別並丟棄

防止上一次連接中的報文段出現影響新連接。經過2MLS後,上一次連接中的包都會消失。

斷開連接時,可能會受到哪些攻擊?

客戶端在TIME_WAIT狀態時,服務器多次間隔式發送FIN,導致客戶端 始終重置等待時間,TIME_WAIT狀態一直存在,服務器收不到ACK確認信息,不能與已關閉的客戶端斷開連接,端口一直被佔用。

注:如果通信雙方的任一方send或recv超時,就會直接進入CLOSED狀態。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章