這篇文章是本身所學的《計算機網絡》這門課程的總結,若是有任何錯誤歡迎指正。html
網絡層和運輸層的功能一般由操做系統提供,通常經過操做系統的
Socket
接口android
網絡層中最重要的就是IP協議
。以下圖,經過IP協議能夠實如今不一樣的網絡中進行通訊,而不用關係下層的網絡接口層中所使用的協議。 git
IP協議是無鏈接的、盡最大努力交付的不可靠協議面試
IP地址是IP協議用來識別不一樣主機的地址,相似於MAC地址。算法
以A類地址爲例,一個A類地址能夠連2^24
個主機,可是我只須要鏈接2^20
個主機,而使用B類地址又不足,這種狀況就形成了浪費;再加上IP地址快耗盡的問題,就出現了三級IP 地址。數據庫
以下圖,經過從主機號借用若干個位做爲子網號subnet-id
,而主機號 host-id
也就相應減小了若干個位。經過這種方式就能夠對IP地址進行更精細地劃分,從而減小IP地址地浪費。並且劃分子網純屬一個單位內部的事情單位對外仍然表現爲沒有劃分子網的網絡,從而兼容之前的兩級IP 地址。安全
經過子網掩碼來獲取IP地址中的子網部分,如圖IP地址與子網掩碼進行與運算獲得子網的網絡地址:服務器
因爲IPv4的地址即將耗盡,就採用無分類編址(CIDR)消除了傳統的 A 類、B 類和 C 類地址以及劃分子網的概念,從而使用各類長度的「網絡前綴」來代替分類地址中的網絡號和子網號。網絡
IP協議並非一個可靠的協議,它不保證數據被送達,那麼,天然的,保證數據送達的工做應該由其餘的模塊來完成。其中一個重要的模塊就是ICMP(網絡控制報文)協議。ICMP不是高層協議,而是IP層的協議。
當傳送IP數據包發生錯誤。好比主機不可達,路由不可達等等,ICMP協議將會把錯誤信息封包,而後傳送回給主機。給主機一個處理錯誤的機會,這 也就是爲何說創建在IP層以上的協議是可能作到安全的緣由。tcp
RAP協議是經過目的IP地址來獲取目的MAC地址的協議。
版本:IP協議的版本,佔4位
生存時間(TTL):數據報在網絡中可經過的路由器數,IP數據包每穿過一個路由器,該數據包的TTL數值就會減小1,當該數據包的TTL成爲零,它就會被自動拋棄。
協議:0x11表明UDP,0x06表明TCP
TCP | UDP | |
---|---|---|
可靠性 | 可靠 | 不可靠 |
鏈接性 | 面向鏈接 | 無鏈接 |
報文 | 面向字節流 | 面向報文 |
流量控制 | 有 | 無 |
堵塞控制 | 有 | 無 |
傳播速度 | 慢 | 快 |
應用場景 | 對數據準確性要求高的場景 | 對數據效率要求高的,好比視頻通話等。 |
面向報文和麪向字節流的區別:
TCP是面向鏈接的運輸層協議,所以須要先創建鏈接,在進行數據傳輸。TCP創建鏈接的方式是三次握手,而切斷鏈接是經過四次揮手。
爲何要三次握手?
爲了防止已失效的鏈接請求報文段忽然又傳送到了服務端,於是產生錯誤。
具體例子——「已失效的鏈接請求報文段」的產生在這樣一種狀況下:
客戶端發出的第一個鏈接請求報文段並無丟失,而是在某個網絡結點長時間的滯留了,以至延誤到鏈接釋放之後的某個時間纔到達服務器。
原本這是一個早已失效的報文段。但服務器收到此失效的鏈接請求報文段後,就誤認爲是客戶端再次發出的一個新的鏈接請求。因而就向客戶端發出確認報文段,贊成創建鏈接。
假設不採用「三次握手」,那麼只要服務器發出確認,新的鏈接就創建了。因爲如今客戶端並無發出創建鏈接的請求,所以不會理睬服務器的確認,也不會向服務器發送數據。但服務器卻覺得新的運輸鏈接已經創建,並一直等待客戶端發來數據。這樣,服務器的不少資源就白白浪費掉了。採用「三次握手」的辦法能夠防止上述現象發生。
例如剛纔那種狀況,客戶端不會向服務器的確認發出確認。服務器因爲收不到確認,就知道客戶端並無要求創建鏈接。」
TCP協議是一種面向鏈接的、可靠的、基於字節流的運輸層通訊協議。TCP是全雙工模式,這就意味着,當主機1發出FIN報文段時,只是表示主機1已經沒有數據要發送了,主機1告訴主機2,它的數據已經所有發送完畢了;
可是,這個時候主機1仍是能夠接受來自主機2的數據;當主機2返回ACK報文段時,表示它已經知道主機1沒有數據發送了,可是主機2仍是能夠發送數據到主機1的;當主機2也發送了FIN報文段時,這個時候就表示主機2也沒有數據要發送了,就會告訴主機1,我也沒有數據要發送了,以後彼此就會愉快的中斷此次TCP鏈接。
爲何要等待2MSL?
MSL:報文段最大生存時間,它是任何報文段被丟棄前在網絡內的最長時間。
流量控制(flow control)就是讓發送方的發送速率不要太快,既要讓接收方來得及接收,也不要使網絡發生擁塞。 利用滑動窗口機制能夠很方便地在 TCP 鏈接上實現流量控制。
滑動窗口機制:滑動窗口機制就是發送方和接收方各自維護一個發送窗口和接受窗口。當網絡堵塞時,接收方能夠減少接受窗口的大小,同時在肯定報文中設置發送窗口的大小,當發送方接受到肯定報文時,能夠減少發送窗口的大小,從而減小發送速率。同理,當網絡通暢時,能夠提升發送速率。
在某段時間,若對網絡中某資源的需求超過了該資源所能提供的可用部分,網絡的性能就要變壞,就產生擁塞
堵塞控制和流量控制的區別?
- 擁塞控制是一個全局性的過程,涉及到全部的主機、全部的路由器,以及與下降網絡傳輸性能有關的全部因素。
- 流量控制每每指在給定的發送端和接收端之間的點對點通訊量的控制。流量控制所要作的就是抑制發送端發送數據的速率,以便使接收端來得及接收。
堵塞控制的方法:
發送方維護一個叫作擁塞窗口的狀態變量。擁塞窗口的大小取決於網絡的擁塞程度,而且動態地在變化。 發送方控制擁塞窗口的原則是:只要網絡沒有出現擁塞,擁塞窗口就再增大一些,以便把更多的分組發送出去。但只要網絡出現擁塞,擁塞窗口就減少一些,以減小到網絡中的分組數。
如上圖,慢開始算法:
使用慢開始算法後,每通過一個傳輸輪次,擁塞窗口 cwnd 就加倍。 一個傳輸輪次所經歷的時間其實就是往返時間 RTT
。傳輸輪次更增強調:把擁塞窗口 cwnd 所容許發送的報文段都連續發送出去,並收到了對已發送的最後一個字節的確認。 例如,擁塞窗口 cwnd
= 4,這時的往返時間 RTT
就是發送方連續發送 4 個報文段,並收到這 4 個報文段的確認,總共經歷的時間。
擁塞避免算法
擁塞窗口 cwnd 緩慢地增大,即每通過一個往返時間 RTT
就把發送方的擁塞窗口 cwnd
加 1,而不是加倍,使擁塞窗口 cwnd
按線性規律緩慢增加。
因爲指數爆炸的性質,就必須設置慢開始的門限 ssthresh
,其用法以下:
cwnd
< ssthresh
時,使用慢開始算法。cwnd
> ssthresh
時,中止使用慢開始算法而改用擁塞避免算法。cwnd
= ssthresh
時,既可以使用慢開始算法,也可以使用擁塞避免算法。不管在慢開始階段仍是在擁塞避免階段,只要發送方判斷網絡出現擁塞(其根據就是沒有按時收到確認),就要把慢開始門限 ssthresh
設置爲出現擁塞時的發送方窗口值的一半(但不能小於2)。 而後把擁塞窗口 cwnd 從新設置爲 1,執行慢開始算法。 這樣作的目的就是要迅速減小主機發送到網絡中的分組數,使得發生擁塞的路由器有足夠時間把隊列中積壓的分組處理完畢。以下圖:
快重傳算法首先要求接收方每收到一個失序的報文段後就當即發出重複確認。這樣作可讓發送方及早知道有報文段沒有到達接收方。 發送方只要一連收到三個重複確認就應當當即重傳對方還沒有收到的報文段。 不難看出,快重傳並不是取消重傳計時器,而是在某些狀況下可更早地重傳丟失的報文段。以下圖:
快恢復
注意發送方的發送窗口的上限值應當取爲接收方窗口
rwnd
和擁塞窗口cwnd
這兩個變量中較小的一個
當rwnd < cwnd
時,是接收方的接收能力限制發送窗口的最大值。
當cwnd < rwnd
時,則是網絡的擁塞限制發送窗口的最大值。
DNS 是一個 域名 和 IP 相互映射的分佈式數據庫,經過DNS咱們就能夠經過域名更方便的訪問互聯網 詳細的見DNS基礎知識
HTTP是超文本傳輸協議,用於客戶端和服務器端之間的通訊,屬於TCP/IP中的應用層。 詳細的見見《圖解HTTP》核心知識總結
參考資料: