準備作業
進行連接
能把三次握手改為兩次握手嗎?
改為四次握手行不行?
TCP第三次握手失敗了怎么辦?
初始序列號ISN(Initial Sequence Number)是固定的嗎?
三次握手是否可以攜帶資料?
SYN泛洪攻擊
總結

TCP提供面向有連接的通信傳輸,面向有連接是指在資料通信開始之前先做好通信兩端之間的準備作業,

準備作業
TCP服務器先創建傳輸控制塊TCB,時刻準備接收客戶行程的連接請求,此時服務器處于LISTEN(監聽)狀態,客戶端處于CLOSE(關閉)狀態,
什么是傳輸控制塊?
TCB傳輸控制塊包含了資料發送雙方對應的socket資訊以及擁有裝載資料的緩沖區,
在兩個設備在建立連接之前,雙方都必須要做一些準備作業,分配記憶體建立起TCB傳輸控制塊就是連接之前必須要做的作業,
進行連接
第一次握手:客戶端給服務器發送一個同步報文段SYN,并指定客戶端的初始序列號ISN,此時客 戶端處于SYN_SENT狀態,
首部的同步位SYN = 1(SYN只是一個位元位,0表示不是SYN,1表示是SYN),初始 序列號seq = m,
SYN = 1的報文段不能攜帶任何的資料,但要指定序號,
第二次握手:服務器接收到來自客戶端的同步報文段SYN后,會以自己的SYN報文作為應答, 并且也指定了自己的初始序列號ISN,同時會把客戶端的 seq+1 確認序列號ack的 值,表示自己已經收到了客戶端的同步報文段SYN,此時服務器處于SYN_RCVD的 狀態,
確認報文段中SYN = 1,ACK = 1(ACK也只是一個位元位,0表示不是ACK,1表示是 ACK),確認序列號ack = m+1,初始序列號seq = n,
第三次握手:客戶端收到來自服務器的同步報文段SYN之后,會發送一個確認報文段ACK,以服 務器的 seq+1作為ack的值 ,表明自己已經收到來自服務器的同步報文段SYN,客 戶端進入ESTABLISHED狀態,服務器確認報文段ACK之后,也會進入 ESTABLISHED狀態,
確認報文段中,ACK = 1,確認序列號 ack = n+1,序列號 seq = m+1,
雙方已經建立起連接,可以正常的發送資料,
能把三次握手改為兩次握手嗎?
肯定不行!!!第三次握手是為了防止失效的請求連接到達服務器,讓服務器錯誤的打開連接,
舉個列子:
TCP的三次握手和打電話非常的類似
電話撥通后,發送方不知道自己的發送能力是否正常,
于是“歪?歪?”兩聲看看對方能不能聽到,
接收方聽到發送方的聲音后,此時接受方就可以得出發送方的發送能力和自己的接收能力是正常的,但此時發送方還不知道自己的發送能力是否正常,于是接收方對發送方回復: "歪 你找我干啥",

發送方收到來自接收方的回復后,就知道 自己的發送能力和接收能力是正常的,接受方的發送能力和接收能力也是正常的,但此時接收方并不知道自己的發送能力和發送方的接收能力是否正常,

發送方為了讓接收方知道自己已經收到回復,就向接收發發送了"你是豬",接收方收到后,接收方就知道自己的發送能力和發送方的接收能力也是正常的,
這下子雙方可以進行愉快的交流啦!
總的來說,經過三次握手讓客戶端和服務器互相知道了自己的發送、接收和對方發送、接收都是正常的,
改為兩次握手會出現什么后果?
假如客戶端發出了連接請求,但因為網路波動導致服務器并沒有收到來自客戶端的請求連接,于是客戶端又重發了一次連接請求,客戶端和服務器經過兩次握手就建立好連接,雙方開始傳輸資料,資料傳輸完成以后,雙方斷開連接,過一段時間后,原本在網路傳輸中擱置的連接請求到達了服務器,服務器以為是客戶端又發出來一次新的連接請求,于是就向客戶端發送確認報文段,同意建立連接(兩次握手只需要服務器發出確認報文段,就建立好連接),此時服務器一直在等待客戶端發送的資料,一直浪費著系統資源,
改為四次握手行不行?
行!!!TCP三次握手原本應該是"四次握手",但是中間的同步報文段SYN和應答報文ACK是可以合在一起的,這兩個操作在時間上是同時發送的,
當客戶端的到達同步報文段SYN到達服務器的時候,服務器的內核就會第一時間進行應答報文段ACK, 同時也會第一時間發起同步報文段SYN,這兩件事情同時觸發,于是就沒必要分成兩次傳輸,直接一步到位,分成兩次反而會更浪費系統資源(需要進行兩次的封裝和分用),
TCP第三次握手失敗了怎么辦?
服務器發送了SYN+ACK報文后就會啟動一個定時器,等待客戶端回傳的ACK報文,如果服務器在定時器的范圍內沒有收到來自客戶端的ACK報文,服務器會再次重發SYN+ACK報文,重傳的次數可以根據/proc/sys/net/ipv4/tcp_synack_retries來指定,默認為5次,
達到重傳的指定次數后仍然沒有收到ACK應答,那么一段時間后,服務器自動關閉這個連接,但是client認為這個連接已經建立好了,
如果客戶端向服務器發送資料,服務器將以RST包(重置連接)回應,
初始序列號ISN(Initial Sequence Number)是固定的嗎?
序列號是按順序給發送資料的每一個位元組(8位位元組)都標上號碼的編號,
當一端為建立連接而發送它的SYN時,它會為連接選擇一個初始的序列號ISN(客戶端和服務器會分別選擇一個初始序列號ISN),初始序列號ISN并非為0,而是由亂數生成,而后面的計算則是對每一位元組加一,

三次握手的其中一個重要功能是客戶端和服務端交換初始序列號ISN,以便讓對方知道接下來接收資料的時候如何按序列號組裝資料,如果 初始序列號 ISN 是固定的,攻擊者很容易猜出后續的確認號,從而打斷正常的TCP連接,因此 ISN 是動態生成的,
三次握手是否可以攜帶資料?
第一次、第二次不可以,第三次可以,
如果第一次握手可以攜帶資料的話,那么將會使服務器更容易遭受攻擊,如果第一次握手攜帶就大量的資料,那么服務器需要花老長的時間才能對此決議,如果進行重復的發送,那么服務器就會因為系統資源殆盡而崩潰,
第三次握手可以攜帶資料,第三次握手時客戶端處于ESTABLISH狀態,對于客戶端來說,它已經建立好了連接,并且它已經知道服務器的接收能力和自己的發送能力是正常的,所以可以進行正常的發送資料,
SYN泛洪攻擊
SYN泛洪攻擊利用的是TCP的三次握手機制,攻擊端利用偽造的IP地址向服務器發出請求,而被服務器發出的回應回應將永遠發送不到目的地,那么就會觸發服務器的超時重傳機制等待客戶端的回應(客戶端的IP地址不存在,根本不會進行回應),那么被服務器在等待關閉這個連接的程序中消耗了資源,如果有成千上萬的這種連接,主機資源將被耗盡,從而達到攻擊的目的,
措施:
降低SYN timeout時間
采用SYN cookie設定
增加半連接數
合理地采用防火墻等外部網路安全設施
總結
三次握手不是TCP本身的要求, 而是為了滿足"在不可靠信道上可靠地傳輸資訊"這一需求所導致的,三次握手的程序中會同步客戶端和服務器的序列號,為確認應答處理、重發控制以及重復控制等功能提供了保證,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/355293.html
標籤:其他
