TCP

三次握手過程

用"三次握手"建立TCP連接
  • 第一步:客戶機的TCP首先向服務器的 TCP 發送一個連接請求報文段。這個特殊的報文段中不含應用層數據,其首部中的 SYN 標志位被置為1.另外,客戶機會隨機選擇一個起始序號 seq=x (連接請求報文不攜帶數據,但要消耗掉一個序號)。然后客戶端進入 SYN-SENT 狀態,等待服務器的確認
  • 第二步:服務器的 TCP 收到連接請求報文后,如同意建立連接,就向客戶機發回確認,并為該 TCP 連接分配 TCP 緩存和變量。在確認報文段中,SYN 和 ACK 位都被置為 1 ,確認號字段的值為 x+1,并且服務器隨機產生起始序號 seq=y (確認報文不攜帶數據,但也要消耗掉一個序號)。確認報文段同樣不包含應用層數據。
  • 第三步:當客戶機收到確認報文段后,還要向服務器給出確認,并且也要給該連接分配緩存和變量。這個報文段的 ACK 標志為被置 1,序號字段為 x+1,確認號字段 ack=y+1。該報文段可以攜帶數據,如果不攜帶數據則不消耗序號
為什么 "三次握手" 而不是 "兩次握手" 建立連接:
TCP 三次握手缺陷
  • 服務器端的資源是在完成第二次握手時分配的,而客戶端的資源是在完成第三次握手時分配的。這就使得服務器易受到 SYN 洪泛攻擊
  • SYN 洪泛攻擊: 通過向網絡服務所在端口發送大量的偽造源地址的攻擊報文,就可能造成目標服務器中的半開連接隊列被占滿,從而阻止其他合法用戶進行訪問。
  • 防范:
    1、降低SYN timeout時間,使得主機盡快釋放半連接的占用
    2、采用SYN cookie設置,如果短時間內連續收到某個IP的重復SYN請求,則認為受到了該IP的攻擊,丟棄來自該IP的后續請求報文。
    3、此外合理地采用防火墻等外部網絡安全設施也可緩解SYN泛洪攻擊。

四次揮手過程

用 "四次握手" 釋放TCP連接
  • 第一步:客戶端打算關閉連接,就向其 TCP 發送一個連接釋放報文段,并停止再發送數據,主動關閉 TCP 連接,該報文的 FIN 標志位被置為 1,seq=x,它等于前面已傳送過的數據的最夠一個字節的序號加 1 (FIN 報文段即使不攜帶數據,也要消耗掉一個序號)。TCP 是全雙工的,即可以想象成是一條 TCP 連接上的兩條數據通路。當發送 FIN 報文時,發送 FIN 的一端就不能再發送數據,也就是關閉了其中一條數據通路,但對方還可以發送數據
  • 第二步:服務器收到連接釋放報文段后即發出確認,確認號是 ack=u+1,而這個報文段自己的序號是 v,等于它前面已傳送過的數據的最后一個字節的序號加 1。此時,從客戶機到服務器這個方向的連接就釋放了,TCP 連接處于半關閉狀態。但服務器若發送數據,客戶機仍要接收,即從服務器到客戶機這個方向的連接并未關閉
  • 第三步:若服務器已經沒有要向客戶機發送的數據,就通知 TCP 釋放連接,此時其發出 FIN=1 的連接釋放報文段
  • 第四步:客戶機收到連接釋放報文段后,必須發出確認。在確認報文段中,ACK 字段被置為 1,確認號 ack=w+1,序號 seq=u+1。此時 TCP 連接還沒有釋放掉,必須等待時間計時器設置的時間 2MSL 后,A 才進入到連接關閉狀態
time-wait 狀態,最后一次握手報文后要等待 2MSL(最長報文段壽命) 的時間呢? 參考
  • 第一、為了保證 A 發送的最后一個確認報文段能夠到達 B 。如果 A 不等待 2MSL,若 A 返回的最后確認報文段丟失,則 B 不能進入正常關閉狀態,而 A 此時已經關閉,也不可能再重傳。
  • 第二、A 在發送完最后一個確認報文段后,再經過 2MSL 可保證本連接持續的時間內所產生的所有報文段從網絡中消失。假設沒有time-wait 限制,因某些原因我們先關閉這條TCP連接,然后很快又以相同的<源ip,源port,目的ip,目的port> 建立一個新的TCP連接,然后發送數據,設想此時前一個連接在網絡中滯留的數據報現在到達接收方,會被當做正常數據接收并上傳到應用層,而這些舊數據不應該被接收。從而引起數據錯亂而導致各種無法預知詭異錯誤
time-wait 狀態如何避免
  • 首先服務器可以設置 SO_REUSEADDR 套接字選項來通知內核,如果端口忙,但TCP連接位于TIME_WAIT狀態時可以重用端口。在一個非常有用的場景就是,如果你的服務器程序停止后想立即重啟,而新的套接字依舊希望使用同一端口,此時SO_REUSEADDR選項就可以避免TIME_WAIT狀態。

TCP 知識框架圖

  • 特點:有連接、一對一、提供可靠交付、全雙工通信、面向字節流
  • 首部:20B,源端口、目的端口、序號、確認號等控制信息
  • 連接管理:三次握手建立、四次握手釋放
  • 可靠傳輸機制
    1、 序號:用來保證數據能有序提交給應用層
    2、 確認:確認號為期待收到的下一個報文段第一個字節的序號
    3、 重傳:1、超時:計時器到期還沒收到確認則重傳對應報文。2、冗余確認:當收到失序報文時向發送端發送冗余 ACK。例如發送方A發送了序號1、2、3、4、5的TCP報文段,其中2號報文丟失,3、4、5對于B來說就是失序報文,當3、4、5到達B就發送3個對1號報文段的冗余ACK,表明自己期望得到2號報文段,這時A收到三個冗余ACK,立即對2號報文重傳
  • 流量控制:在確認報文中設置接收窗口 rwnd(接收窗口) 的值來限制發送速率
    在通信過程中,接收方根據自己接收緩存的大小,動態地調整發送方的發送窗口大小,這就是接收窗口 rwnd
    流量控制是為了控制發送方發送速率,保證接收方來得及接收。
    接收方發送的確認報文中的窗口字段可以用來控制發送方窗口大小,從而影響發送方的發送速率。將窗口字段設置為 0,則發送方不能發送數據。
    流量控制是為了讓接收方能來得及接收,而擁塞控制是為了降低整個網絡的擁塞程度。
  • 擁塞控制
    • 原理:發送方根據自己估算的網絡擁塞程度設置 cwnd(擁塞窗口) 的值來限制發送速率
    • 方法:
      1、慢開始:當 cwnd < ssthresh 時,每收到一個報文段的確認 cwnd 加1
      2、擁塞避免:當 cwnd > ssthresh 時,每經過一個往返時延 cwnd 加 1
      3、快重傳:當收到連續的三個重復的 ACK,直接重傳對方期待的報文
      4、快恢復: 當收到連續的三個冗余 ACK,令 ssthresh = cwnd = cwnd/2
    • 擁塞處理:ssthresh 置為原 cwnd 的一半,cwnd 置 1
  • 開環控制 就是在設計網絡時事先將有關擁塞發生的所有因素考慮周到,一旦系統運行起來就不能在中途改正。
  • 閉環控制 是基于反饋環路的概念,包括如下措施:
    1)監測網路系統以便檢測擁塞在何時何地發生
    2)把擁塞發生的信息傳送到可采取行動的地方
    3)調整網絡系統的行動以解決出現的問題。

參考

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容