前端工程師系列,TCP複習及濃縮總結(全乾貨,支援面試)

GetFullStack發表於2019-03-04

最近公司專案不多,閒著也來寫寫文章,複習一下基礎知識。
之前也寫了好幾片文章,苦於自己不太會玩標題黨,結構內容也不生動,沒什麼點選量,希望慢慢總結的寫,提高水平,給大家帶來好的內容,廢話不多說。下面進入正題。

說道TCP/IP、HTTP兩個詞,我估計各位應該沒有人不知道,多多少少聽到一些,如果您是網路專業的專家或熟知這些內容,就請您輕拍、路過。

TCP/IP 名詞解釋

  • IP(Internet Protocol)協議的英文名直譯就是:因特網協議,它可以根據網路情況,將要傳輸的資料,分為不同大小的包、固定的格式,在源地址和目的地址之間傳送。就好比現實生活中,我們有一批貨物要從北京傳送到廣州,運輸時我們把貨物包裝成一個個的包裝箱後,然後進行運輸,在這裡IP協議就好比規定了包裝箱的尺寸和包裝方法。
ip報文
  • IP的頭部只有16位首部校驗和,只能對ip頭資訊進行資料校驗,但對資料本身是沒有校驗的。

  • TCP (Transmission Control Protocol)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。IP協議也有一些缺陷(傳輸不可靠也就是不提供點到點的傳輸確認、對資料沒有完整性校驗、不能重發和流量控制)。繼續用傳輸貨物的比喻,IP協議就好比貨是打包發走了,但廣州方面收沒收到貨物不管,貨物是否完好無損不管。TCP協議在IP協議的基礎上提供了可靠地物件導向的資料流傳輸服務的規則和約定。簡單說,就是傳送一個資料包,我就要確認對方有效,完整的收到。

  • TCP的頭部16位校驗和是對資料的完整性校驗。

TCP首部長度,有哪些欄位,總長度多少?

  • 固定長度總共有20個位元組長度,分為5行,每行4個位元組、32位。
  • 選項算入報頭首部,但不在固定20個位元組內。
tcp報文

TCP首部中有6個標誌位元位

可以設成1 or 0,用來應答,它們分別表示的含義如下:

  • URG: 緊急指標
  • ACK: 確認序號有效
  • PSH: 儘可能快地將資料送往接收程式
  • RST: 重建連線
  • SYN: 同步序號用來發起一個連線
  • FIN: 發端完成傳送任務

TCP/IP四層模型與OSI七層模型的對應關係

前端工程師系列,TCP複習及濃縮總結(全乾貨,支援面試)
  • TCP/IP與OSI最大的不同在於OSI是一個理論上的網路通訊模型,而TCP/IP則是實際執行的網路協議。
  • IP協議在網路層。TCP和UDP協議在傳輸入層。
  • TCP: FTP、HTTP、Telnet、SMTP、POP3、HTTPS
  • UDP:DNS、SNMP、NFS

TCP和UDP的區別

  • TCP是有連線的,兩臺主機在進行資料互動之前必須先通過三次握手建立連線;而UDP是無連線的,沒有建立連線這個過程。
  • TCP是可靠的傳輸,TCP協議通過確認和重傳機制來保證資料傳輸的可靠性;而UDP是不可靠的傳輸。
  • TCP還提供了擁塞控制、滑動視窗等機制來保證傳輸的質量,而UDP都沒有。
  • TCP是基於位元組流的,將資料看做無結構的位元組流進行傳輸,當應用程式交給TCP的資料長度太長,超過MSS時,TCP就會對資料進行分段,因此TCP的資料是無邊界的;而UDP是面向報文的,無論應用程式交給UDP層多長的報文,UDP都不會對資料包進行任何拆分等處理,因此UDP保留了應用層資料的邊界。

TCP 三次握手四次揮手

三次握手四次揮手

三次握手

  • 第一次握手(綠區箭頭1):客戶端想與伺服器建立連線傳送資料,客戶端呼叫向伺服器傳送TCP報文請求,SYN = 1, Sequence Number = x; 然後,客戶端進入SYN_SEND狀態,等待伺服器的確認。
  • 第二次握手(綠區箭頭2):正在處於LISTEN狀態的伺服器端接受到客戶端發來的SYN報文後,表示我收到了你的請求,我可以與你建立連線收發資料,伺服器會傳送返回確認資訊,這個資訊是Acknowledgment Number = x + 1(Sequence Number + 1);同時包含伺服器端的SYN請求資訊:SYN = 1, Sequence Number = y; 一併傳送給客戶端,此時伺服器進入SYN_RECV狀態。
  • 第三次據手(綠區箭頭3):處於SYN_SEND狀態的客戶端,接收到伺服器發來的SYN+ACK標識位的報文後,將Acknowledgment Number = y + 1,的確認報文回發給伺服器,表示我知道伺服器端你已經收到我傳送的第一次握手請求。然後進入ESTABLISHED狀態。
  • 伺服器端收到第三次握手後,進入ESTABLISHED狀態。到此完成TCP三次握手,可以接下來收發資料。

四次揮手

  • 第一次揮手(橙區箭頭一):客戶說資料傳完啦,我想和你斷開連線,然後傳送TCP報文,內容為:FIN = 1, Sequence Number = x + 2, ACK = Y + 1; 然後客戶端進入FIN_WAIT_1狀態;
  • 第二次揮手(橙區箭頭二):伺服器收到第一次揮手的請求後,說我收到了,回覆:ACK = x +3; 然後伺服器進入CLOSE_WAIT狀態;
  • 客戶端收到以後狀態改為FIN_WAIT_2。
  • 第三次揮手(橙區箭頭三):伺服器向客戶端傳送:FIN = 1, Sequence Number = y + 1; 然後伺服器進入LAST_ACK狀態;
  • 第四次揮手(橙區箭頭四):客戶端收到伺服器傳送的FIN報文,然後向伺服器傳送:ACK = Y + 2; 然後然後客戶端就進入TIME_WATI狀態,伺服器收到以後就關閉連線,此時,客戶端還會等待2MSL後,依然沒有收到伺服器端任何回覆,就表示伺服器端正常關閉,那客戶端也就關閉了。

為什麼需要三次握手,四次握手呢?

  • 因為每個方向都需要一個FIN和ACK,當一端傳送了FIN包之後,處於半關閉狀態,此時仍然可以接收資料包。
  • 在建立連線時,伺服器可以把SYN和ACK放在一個包中傳送。
  • 但是在斷開連線時,如果一端收到FIN包,但此時仍有資料未傳送完,此時就需要先向對端回覆FIN包的ACK。等到將剩下的資料都傳送完之後,再向對端傳送FIN,斷開這個方向的連線。
  • 因此很多時候FIN和ACK需要在兩個資料包中傳送,因此需要四次握手
      

客戶端最後TIME_WAIT狀態持續時間及原因

  • 持續時間未2MSL,一個資料包在網路中的最長生存時間為MSL。
  • 假設最後客戶端回覆的ACK(第四次揮手)丟失,伺服器端會在超時時間到來時,重傳最後一個FIN包(重新傳送第三次揮手請求)。
  • ACK和FIN在網路中的最長生存時間就為2MSL,這樣就可以可靠的斷開TCP的雙向連線。

三次握手過程中有哪些不安全性呢?

  • 偽裝的IP向伺服器傳送一個SYN請求建立連線,然後伺服器向該IP回覆SYN和ACK,但是找不到該IP對應的主機,當超時時伺服器收不到ACK會重複傳送。當大量的攻擊者請求建立連線時,伺服器就會存在大量未完成三次握手的連線,伺服器主機backlog被耗盡而不能響應其它連線。即SYN泛洪攻擊。
  • 防範措施:
    1. 降低SYN timeout時間,使得主機儘快釋放半連線的佔用。
    2. 採用SYN cookie設定,如果短時間內連續收到某個IP的重複SYN請求,則認為受到了該IP的攻擊,丟棄來自該IP的後續請求報文。
    3. 在閘道器處設定過濾,拒絕將一個源IP地址不屬於其來源子網的包進行更遠的路由。
    4. 當一個主機向伺服器傳送SYN請求連線,伺服器回覆ACK和SYN後,攻擊者截獲ACK和SYN。然後偽裝成原始主機繼續與伺服器進行通訊。
        

下一篇計劃《HTTP協議幹活面試》。

相關文章