TCP/IP五層模型-傳輸層-TCP協議

罌粟不及你的美發表於2021-01-16

​1.定義:TCP是一種面向連線、可靠的、基於位元組流的傳輸控制協議。

2.應用場景:TCP為可靠傳輸,適合對資料完整性要求高,對延時不敏感的場景,比如郵件。

3.TCP報文:①TCP報文格式:

②TCP首部欄位資訊:

源埠號:源埠和IP地址的作用是標識報文的返回地址。
目的埠號:埠指明接收方計算機上的應用程式介面。
(作用:TCP報頭中的源埠號和目的埠號同IP資料包中的源IP與目的IP唯一確定一條TCP連線。)
序號:序號是本報文段傳送的資料組的第一個位元組的序號,序號確保了TCP傳輸的有序性。
確認號:確認號,即ACK,指明下一個期待收到的位元組序號,表明該序號之前的所有資料已經正確無誤的收到。確認號只有當ACK標誌為1時才有效。
資料偏移/首部長度:指出TCP報文段的起始處到TCP報文段的資料起始處的距離,佔4bit。保留:為將來定義新的用途保留,現在一般置0。
控制位:URG:緊急指標標誌。當傳送方URG=1時,表明緊急指標欄位有效,它告訴系統此報文段中有緊急資料,應儘快傳送,傳送的資料不用進入緩衝區而直接交付給上一層。
【注意】URG標誌位:URG(緊急位)是表示緊急指標是否有效,當URG為1的時候就表示緊急指標是有效的。緊急指標通常情況下是無效的,當設定為有效的時候就表示資料要優先處理。緊急指標是一個正的偏移量,和序號欄位中的值相加表示緊急資料最後一個位元組的序號。TCP的緊急方式是傳送端向另一端傳送緊急資料的一種方式,緊急指標指向的是包內資料段的某個位元組(資料從第一位元組到指標所指位元組就是緊急資料),緊急資料是不進入緩衝區的直接交給上層程式的(一般情況下TCP是要等到整個快取都滿了再向上交付的)。
PSH標誌位:PSH標誌是為了提示接收端的應用程式應該立即從TCP的接收緩衝區中拿走資料,為了接收後續的資料來騰出空間(如果應用程式不將接收到的資料拿走的話,它們就會一直都留在TCP的接收緩衝區中)。PSH(急迫位)當PSH為1的時候,客戶端發給伺服器的報文段立即被伺服器TCP交付給應用程式來處理,而不用等整個快取都填滿再向上交付。一般情況下,TCP是等緩衝區寫滿再向上交付的,當PSH為1的時候資料還是要進入快取區向上提交的,只不過不用等緩衝區滿後才提交。這裡所說的資料包括與此PUSH包一起傳輸的資料以及之前就為該程式傳輸過來的資料(滯留在快取中的資料)。
URG與PSH的區別:傳送方URG有效的時候,傳送的資料不用進入緩衝區而直接交付給上一層;傳送方PSH有效的時候,接收方收到後,傳送的資料要進入緩衝區但不用等緩衝區滿就交給上一層。URG是針對傳送方傳送緊急資料的,PSH是針對接收方,接收方儘快將資料向上層交付。
ACK:確認序號標誌,為1時表示確認號有效,為0表示確認號無效。
PSH:push標誌,為1表示是帶有push標誌的資料,指示接收方在接收到該報文段以後,應儘快將這個報文段交給應用程式,傳送的資料要進入緩衝區但不用等緩衝區滿就交給上一層。
RST:重置位。當RST=1時,表明在TCP連線中出現嚴重差錯,必須釋放當前連線,然後再重新建立傳輸連線。RST置1用來拒絕一個非法的報文段或拒絕開啟一個連線。
SYN:在建立連線時用來同步序號。當SYN=1而ACK=0時,表明這是一個連線請求報文段。對方若同意建立連線,則應在響應的報文段中使SYN=1和ACK=1。SYN置1表示連線請求或接收連線。
FIN:finish標誌,用於釋放連線,為1時表示傳送方已經沒有資料傳送了,即關閉本方資料流。
視窗:滑動視窗大小,用來告知傳送端接受端的快取大小,以此控制傳送端傳送資料的速率,從而達到流量控制。
校驗和:檢驗首部和資料兩部分,檢驗時需要在TCP報文段的前面加上12位元組的偽首部。
緊急指標:只有當 URG 標誌置 1 時緊急指標才有效,TCP 的緊急方式是傳送端向另一端傳送緊急資料的一種方式。
選項:TCP報文資料段中資料欄位的最大長度,又稱為MSS。MSS = MTU – TCP頭部 – IP頭部。MTU是指一種通訊協議的某一層上面所能通過的最大資料包大小(以位元組為單位),預設是1500位元組。

③資料部分:TCP 報文段中的資料部分是可選的。在一個連線建立和一個連線終止時,雙方交換的報文段僅有 TCP 首部。如果一方沒有資料要傳送,也使用沒有任何資料的首部來確認收到的資料。

4.TCP的功能/特點:①面向連線:三次握手:

  • 客戶端請求建立連線,syn=1,seq=x,客戶端進入syn_sent狀態。

  • 伺服器收到客戶端傳送的syn包,同意建立連線,ack=1,ack。number=x+1;伺服器請求建立連線,syn=1,seq=y,伺服器進入syn_rcvd狀態。

  • 客戶端收到伺服器傳送的syn+ack包,同意建立連線,ack=1,ack number=y+1,客戶端和伺服器進入established狀態。

四次揮手:

  • 客戶端傳送完成,請求斷開連線, fin=1, seq=u。

  • 伺服器同意斷開連線, ack=1 ,ack number = u+1。

  • 伺服器傳送完成,請求斷開連線,fin=1 , seq=i。

  • 客戶端同意斷開連線,ack=1, ack number = i+1。

為什麼TCP建立連線要三次握手?

三次握手的目的是同步連線雙方的序列號和確認號並交換 TCP 視窗大小資訊。為什麼兩次握手不行?因為兩次握手可能丟包而出現死鎖,假設在兩次握手場景中,C向S傳送請求,S收到併傳送確認請求給C,這時候S認為連線已經建立,並開始傳送資料給C,但是那個確認請求丟包了,C不認為請求建立了,C當然會拒絕接受S傳送來的資料,並且再去請求連線。這樣,一個資源就死鎖了。最後,握手當然可以四次五次一直握下去,但三次已經夠了,就沒有必要了。總結下來一句話,主要目的防止在網路發生延遲或者丟包的情況下浪費資源。

為什麼斷開連線要四次揮手而不是三次?

伺服器收到客戶端傳送的fin包,就回客戶端一個ack包。但是這個時候伺服器可能還在傳送資料,不能馬上關閉資料連線通道。所以伺服器給客戶端回的ack和fin不是同時傳送的,伺服器把資料包傳送完後,才會傳送fin包給客戶端。而在建立連線時,伺服器把ack和syn這兩個包合併成了一個包傳送給客戶端。

②可靠性:

超時重傳:PC用TCP協議傳送一個報文段,會立即啟動一個重傳計時器,等待目的埠確認收到這個資料段,否則將超時重傳。
確認機制:每個報文都有序列號,傳送完成後,收到對方回覆的ack置位的確認包(ack的值為序列號+1)才認為成功傳送,否則重傳。
滑動視窗:根據接受端快取區大小,靈活調整發包速率,保證資料傳輸的穩定性。
首部校驗:TCP資料包文段中有首部和資料的校驗和。目的是檢測資料在傳輸過程中的任何變化,如果收到段的檢驗和有差錯,如果出錯的話,則接收端不會傳送確認,從而觸發傳送方的確認重傳。
重複丟棄:IP資料包可能會出現重複,TCP的接收端必須丟棄重複的資料。
有序性(Seq):TCP將每個位元組的資料都進行了編號,這就是序列號。TCP報文段作為IP資料包來傳輸,而IP資料包的到達可能會失序,因此TCP報文段的到達也可能會失序。如果必要,TCP將對收到的資料進行重新排序,將收到的資料以正確的順序交給應用層。(對失序資料進行重新排序,然後才交給應用層)。

③為什麼說TCP是基於位元組流?

④擴充:

2MSL:TIMEWAIT狀態也稱為2MSL等待狀態。每個具體TCP實現必須選擇一個報文段最大生存時間MSL(Maximum Segment Lifetime)。它是任何報文段被丟棄前在網路內的最長時間。我們知道這個時間是有限的,因為TCP報文段以IP資料包在網路內傳輸,而IP資料包則有限制其生存時間的TTL欄位。對一個具體實現所給定的MSL值,處理的原則是:當TCP執行一個主動關閉,併發回最後一個ACK,該連線必須在TIMEWAIT狀態停留的時間為2倍的MSL。這樣可讓TCP再次傳送最後的ACK以防這個ACK丟失(另一端超時並重發最後的FIN)。這種2MSL等待的另一個結果是這個TCP連線在2MSL等待期間,定義這個連線的插口(客戶的IP地址和埠號,伺服器的IP地址和埠號)不能再被使用。這個連線只能在2MSL結束後才能再被使用。

設定TIMEWAIT的原因:

大量 TIME_WAIT 產生的原因及解決辦法:

出現RST包的原因:

  • 客戶端來連線時,伺服器埠未開啟

  • 在一個已關閉的SOCKET上收到資料

  • 請求超時

  • 提前關閉

大量CLOSE_WAIT產生的原因及解決辦法:

半開、半閉連線:半開連線:從協議定義的角度來說,TCP的半開連線是指TCP連線的一端異常崩潰,或者在未通知對端的情況下關閉連線,這種情況下不可以正常收發資料,否則會產生RST。比如TCP連線的一端異常斷電或是受到了syn攻擊,就會導致TCP的半開連線。如果沒有資料傳輸,對端就不會知道本端的異常而一直處於ESTABLISHED狀態。

半閉連線: TCP的半閉連線是指TCP連線只有一方傳送了FIN,另一方沒有發出FIN包,仍然可以在一個方向上正常傳送資料。這種場景並不常見,一般來說Berkeley sockets API呼叫shutdown()介面時候就會進入半關閉狀態(呼叫常規的close()一般是期待完整的雙向關閉這個TCP連線),shutdown()介面相當指示程式,本端已經沒有資料待傳送,所以我傳送一個FIN到對端,但是我仍然想要從對端接收資料,直到對端傳送一個FIN指示關閉連線為止。

syn flood攻擊:定義:在三次握手過程中,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攻擊。攻擊方式:

  • Direct Attack 攻擊方使用固定的源地址發起攻擊,這種方法對攻擊方的消耗最小。

  • Spoofing Attack 攻擊方使用變化的源地址發起攻擊,這種方法需要攻擊方不停地修改源地址,實際上消耗也不大。

  • Distributed Direct Attack 這種攻擊主要是使用殭屍網路進行固定源地址的攻擊。

防禦方法:

5.用TCP傳輸資料的應用層協議:伺服器同步資料的dns、ftp、smtp/pop3、http、telnet、ssh等。

相關文章