前端工程师系列,TCP复习及浓缩总结(全干货,支持面试)
生活随笔
收集整理的這篇文章主要介紹了
前端工程师系列,TCP复习及浓缩总结(全干货,支持面试)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近公司項目不多,閑著也來寫寫文章,復習一下基礎知識。 之前也寫了好幾片文章,苦于自己不太會玩標題黨,結構內容也不生動,沒什么點擊量,希望慢慢總結的寫,提高水平,給大家帶來好的內容,廢話不多說。下面進入正題。
說道TCP/IP、HTTP兩個詞,我估計各位應該沒有人不知道,多多少少聽到一些,如果您是網絡專業的專家或熟知這些內容,就請您輕拍、路過。
TCP/IP 名詞解釋
- IP(Internet Protocol)協議的英文名直譯就是:因特網協議,它可以根據網絡情況,將要傳輸的數據,分為不同大小的包、固定的格式,在源地址和目的地址之間傳送。就好比現實生活中,我們有一批貨物要從北京發送到廣州,運輸時我們把貨物包裝成一個個的包裝箱后,然后進行運輸,在這里IP協議就好比規定了包裝箱的尺寸和包裝方法。
-
IP的頭部只有16位首部校驗和,只能對ip頭信息進行數據校驗,但對數據本身是沒有校驗的。
-
TCP (Transmission Control Protocol)是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。IP協議也有一些缺陷(傳輸不可靠也就是不提供點到點的傳輸確認、對數據沒有完整性校驗、不能重發和流量控制)。繼續用傳輸貨物的比喻,IP協議就好比貨是打包發走了,但廣州方面收沒收到貨物不管,貨物是否完好無損不管。TCP協議在IP協議的基礎上提供了可靠地面向對象的數據流傳輸服務的規則和約定。簡單說,就是發送一個數據包,我就要確認對方有效,完整的收到。
-
TCP的頭部16位校驗和是對數據的完整性校驗。
TCP首部長度,有哪些字段,總長度多少?
- 固定長度總共有20個字節長度,分為5行,每行4個字節、32位。
- 選項算入報頭首部,但不在固定20個字節內。
TCP首部中有6個標志比特位
可以設成1 or 0,用來應答,它們分別表示的含義如下:
- URG: 緊急指針
- ACK: 確認序號有效
- PSH: 盡可能快地將數據送往接收進程
- RST: 重建連接
- SYN: 同步序號用來發起一個連接
- FIN: 發端完成發送任務
TCP/IP四層模型與OSI七層模型的對應關系
- 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泛洪攻擊。
- 防范措施:
- 降低SYN timeout時間,使得主機盡快釋放半連接的占用。
- 采用SYN cookie設置,如果短時間內連續收到某個IP的重復SYN請求,則認為受到了該IP的攻擊,丟棄來自該IP的后續請求報文。
- 在網關處設置過濾,拒絕將一個源IP地址不屬于其來源子網的包進行更遠的路由。
- 當一個主機向服務器發送SYN請求連接,服務器回復ACK和SYN后,攻擊者截獲ACK和SYN。然后偽裝成原始主機繼續與服務器進行通信。 ??
下一篇計劃《HTTP協議干活面試》。
總結
以上是生活随笔為你收集整理的前端工程师系列,TCP复习及浓缩总结(全干货,支持面试)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Latex: 设置 threepartt
- 下一篇: 20172304 结对编程--四则运算