TCP/IP的學習總結

這篇文章是本身所學的《計算機網絡》這門課程的總結,若是有任何錯誤歡迎指正。html

TCP/IP模型

應用層:具體應用程序實現層
運輸層:讓應用程序之間實現通訊
網絡層(或網際層):主要利用IP協議轉發分包數據
網絡接口層:TCP/IP對網絡接口層未做定義

網絡層和運輸層的功能一般由操做系統提供,通常經過操做系統的Socket接口android

網絡層

網絡層中最重要的就是IP協議。以下圖,經過IP協議能夠實如今不一樣的網絡中進行通訊,而不用關係下層的網絡接口層中所使用的協議。 git

IP協議是無鏈接的、盡最大努力交付的不可靠協議面試

IP地址

IP地址是IP協議用來識別不一樣主機的地址,相似於MAC地址。算法

兩級IP 地址

net-id表明網絡號,host-id表明主機號

三級IP 地址

以A類地址爲例,一個A類地址能夠連2^24個主機,可是我只須要鏈接2^20個主機,而使用B類地址又不足,這種狀況就形成了浪費;再加上IP地址快耗盡的問題,就出現了三級IP 地址。數據庫

以下圖,經過從主機號借用若干個位做爲子網號subnet-id,而主機號 host-id也就相應減小了若干個位。經過這種方式就能夠對IP地址進行更精細地劃分,從而減小IP地址地浪費。並且劃分子網純屬一個單位內部的事情單位對外仍然表現爲沒有劃分子網的網絡,從而兼容之前的兩級IP 地址。安全

子網掩碼

經過子網掩碼來獲取IP地址中的子網部分,如圖IP地址與子網掩碼進行與運算獲得子網的網絡地址:服務器

無分類編址(CIDR)

因爲IPv4的地址即將耗盡,就採用無分類編址(CIDR)消除了傳統的 A 類、B 類和 C 類地址以及劃分子網的概念,從而使用各類長度的「網絡前綴」來代替分類地址中的網絡號和子網號。網絡

網絡層的其餘協議

ICMP協議

IP協議並非一個可靠的協議,它不保證數據被送達,那麼,天然的,保證數據送達的工做應該由其餘的模塊來完成。其中一個重要的模塊就是ICMP(網絡控制報文)協議。ICMP不是高層協議,而是IP層的協議。
當傳送IP數據包發生錯誤。好比主機不可達,路由不可達等等,ICMP協議將會把錯誤信息封包,而後傳送回給主機。給主機一個處理錯誤的機會,這 也就是爲何說創建在IP層以上的協議是可能作到安全的緣由。tcp

RAP協議

RAP協議是經過目的IP地址來獲取目的MAC地址的協議。

IP協議數據報格式

版本:IP協議的版本,佔4位
生存時間(TTL):數據報在網絡中可經過的路由器數,IP數據包每穿過一個路由器,該數據包的TTL數值就會減小1,當該數據包的TTL成爲零,它就會被自動拋棄。
協議:0x11表明UDP,0x06表明TCP

運輸層

TCP與UDP的區別

TCP UDP
可靠性 可靠 不可靠
鏈接性 面向鏈接 無鏈接
報文 面向字節流 面向報文
流量控制
堵塞控制
傳播速度
應用場景 對數據準確性要求高的場景 對數據效率要求高的,好比視頻通話等。

面向報文和麪向字節流的區別:

如圖,面向報文的傳輸方式是應用層交給UDP多長的報文,UDP發送多長的報文,即一次發送一個報文。所以,應用程序必須選擇合適大小的報文。若報文太長,則IP層須要分片,下降效率;若過短,會使IP數據報過小。
如圖,面向字節流的話,雖然應用程序和TCP的交互是一次一個數據塊(大小不等),但TCP把應用程序當作是一連串的無結構的字節流。TCP有一個緩衝,當應用程序傳送的數據塊太長,TCP就能夠把它劃分短一些再傳送。

TCP

三次握手和四次揮手

TCP是面向鏈接的運輸層協議,所以須要先創建鏈接,在進行數據傳輸。TCP創建鏈接的方式是三次握手,而切斷鏈接是經過四次揮手。

三次握手和四次揮手

爲何要三次握手?

爲了防止已失效的鏈接請求報文段忽然又傳送到了服務端,於是產生錯誤。
具體例子——「已失效的鏈接請求報文段」的產生在這樣一種狀況下:

客戶端發出的第一個鏈接請求報文段並無丟失,而是在某個網絡結點長時間的滯留了,以至延誤到鏈接釋放之後的某個時間纔到達服務器。

原本這是一個早已失效的報文段。但服務器收到此失效的鏈接請求報文段後,就誤認爲是客戶端再次發出的一個新的鏈接請求。因而就向客戶端發出確認報文段,贊成創建鏈接。

假設不採用「三次握手」,那麼只要服務器發出確認,新的鏈接就創建了。因爲如今客戶端並無發出創建鏈接的請求,所以不會理睬服務器的確認,也不會向服務器發送數據。但服務器卻覺得新的運輸鏈接已經創建,並一直等待客戶端發來數據。這樣,服務器的不少資源就白白浪費掉了。採用「三次握手」的辦法能夠防止上述現象發生。
例如剛纔那種狀況,客戶端不會向服務器的確認發出確認。服務器因爲收不到確認,就知道客戶端並無要求創建鏈接。」

爲何要四次分手?

TCP協議是一種面向鏈接的、可靠的、基於字節流的運輸層通訊協議。TCP是全雙工模式,這就意味着,當主機1發出FIN報文段時,只是表示主機1已經沒有數據要發送了,主機1告訴主機2,它的數據已經所有發送完畢了;

可是,這個時候主機1仍是能夠接受來自主機2的數據;當主機2返回ACK報文段時,表示它已經知道主機1沒有數據發送了,可是主機2仍是能夠發送數據到主機1的;當主機2也發送了FIN報文段時,這個時候就表示主機2也沒有數據要發送了,就會告訴主機1,我也沒有數據要發送了,以後彼此就會愉快的中斷此次TCP鏈接。

爲何要等待2MSL?

  • 保證TCP協議的全雙工鏈接可以可靠關閉
  • 保證此次鏈接的重複數據段從網絡中消失

MSL:報文段最大生存時間,它是任何報文段被丟棄前在網絡內的最長時間。

轉載TCP/IP · Android校招面試指南

流量控制

流量控制(flow control)就是讓發送方的發送速率不要太快,既要讓接收方來得及接收,也不要使網絡發生擁塞。 利用滑動窗口機制能夠很方便地在 TCP 鏈接上實現流量控制。

滑動窗口機制:滑動窗口機制就是發送方和接收方各自維護一個發送窗口和接受窗口。當網絡堵塞時,接收方能夠減少接受窗口的大小,同時在肯定報文中設置發送窗口的大小,當發送方接受到肯定報文時,能夠減少發送窗口的大小,從而減小發送速率。同理,當網絡通暢時,能夠提升發送速率。

TCP爲每個鏈接設有一個持續計時器(persistence timer)。當TCP鏈接中的發送方收到接收方的零窗口通知時(即rwnd=0時),發送方就啓動持續計時器。若持續計時器設置的時間到期,發送方就發送一個零窗口控測報文段(攜1字節的數據)給接收方。若是接收方能夠接收數據,就從新開始發送數據;若是接收方不能接收數據,就從新設置持續計時器。

堵塞控制

在某段時間,若對網絡中某資源的需求超過了該資源所能提供的可用部分,網絡的性能就要變壞,就產生擁塞

堵塞控制和流量控制的區別?

  • 擁塞控制是一個全局性的過程,涉及到全部的主機、全部的路由器,以及與下降網絡傳輸性能有關的全部因素。
  • 流量控制每每指在給定的發送端和接收端之間的點對點通訊量的控制。流量控制所要作的就是抑制發送端發送數據的速率,以便使接收端來得及接收。

堵塞控制的方法:

  1. 慢開始和擁塞避免
  2. 快重傳和快恢復
慢開始和擁塞避免

發送方維護一個叫作擁塞窗口的狀態變量。擁塞窗口的大小取決於網絡的擁塞程度,而且動態地在變化。 發送方控制擁塞窗口的原則是:只要網絡沒有出現擁塞,擁塞窗口就再增大一些,以便把更多的分組發送出去。但只要網絡出現擁塞,擁塞窗口就減少一些,以減小到網絡中的分組數。

如上圖,慢開始算法:

使用慢開始算法後,每通過一個傳輸輪次,擁塞窗口 cwnd 就加倍。 一個傳輸輪次所經歷的時間其實就是往返時間 RTT。傳輸輪次更增強調:把擁塞窗口 cwnd 所容許發送的報文段都連續發送出去,並收到了對已發送的最後一個字節的確認。 例如,擁塞窗口 cwnd = 4,這時的往返時間 RTT 就是發送方連續發送 4 個報文段,並收到這 4 個報文段的確認,總共經歷的時間。

擁塞避免算法

擁塞窗口 cwnd 緩慢地增大,即每通過一個往返時間 RTT 就把發送方的擁塞窗口 cwnd 加 1,而不是加倍,使擁塞窗口 cwnd 按線性規律緩慢增加。

因爲指數爆炸的性質,就必須設置慢開始的門限 ssthresh ,其用法以下:

  1. cwnd < ssthresh 時,使用慢開始算法。
  2. cwnd > ssthresh 時,中止使用慢開始算法而改用擁塞避免算法。
  3. cwnd = ssthresh 時,既可以使用慢開始算法,也可以使用擁塞避免算法。

不管在慢開始階段仍是在擁塞避免階段,只要發送方判斷網絡出現擁塞(其根據就是沒有按時收到確認),就要把慢開始門限 ssthresh 設置爲出現擁塞時的發送方窗口值的一半(但不能小於2)。 而後把擁塞窗口 cwnd 從新設置爲 1,執行慢開始算法。 這樣作的目的就是要迅速減小主機發送到網絡中的分組數,使得發生擁塞的路由器有足夠時間把隊列中積壓的分組處理完畢。以下圖:

快重傳和快恢復

快重傳算法首先要求接收方每收到一個失序的報文段後就當即發出重複確認。這樣作可讓發送方及早知道有報文段沒有到達接收方。 發送方只要一連收到三個重複確認就應當當即重傳對方還沒有收到的報文段。 不難看出,快重傳並不是取消重傳計時器,而是在某些狀況下可更早地重傳丟失的報文段。以下圖:

快恢復

  1. 當發送端收到連續三個重複的確認時,就執行「乘法減少」算法,把慢開始門限 ssthresh 減半。但接下去不執行慢開始算法。
  2. 因爲發送方如今認爲網絡極可能沒有發生擁塞,所以如今不執行慢開始算法,即擁塞窗口 cwnd 如今不設置爲 1,而是設置爲慢開始門限 ssthresh 減半後的數值,而後開始執行擁塞避免算法(「加法增大」),使擁塞窗口緩慢地線性增大。

注意發送方的發送窗口的上限值應當取爲接收方窗口 rwnd 和擁塞窗口 cwnd 這兩個變量中較小的一個
rwnd < cwnd時,是接收方的接收能力限制發送窗口的最大值。
cwnd < rwnd時,則是網絡的擁塞限制發送窗口的最大值。

應用層

DNS

DNS 是一個 域名 和 IP 相互映射的分佈式數據庫,經過DNS咱們就能夠經過域名更方便的訪問互聯網 詳細的見DNS基礎知識

HTTP

HTTP是超文本傳輸協議,用於客戶端和服務器端之間的通訊,屬於TCP/IP中的應用層。 詳細的見見《圖解HTTP》核心知識總結

參考資料:

相關文章
相關標籤/搜索