物理層
在物理層上所傳送的數據單位是比特。
物理層( layer)的作用是實現相鄰計算機節點之間比特流的透明傳送,盡可能屏蔽掉具體傳輸介質和物理設備的差異,使其上面的數據鏈路層不必考慮網絡的具體傳輸介質是什么?!巴该鱾魉捅忍亓鳌北硎窘泴嶋H電路傳送后的比特流沒有發生變化網絡協議是計算機網絡中服務器,對傳送的比特流來說,這個電路好像是看不見的。
數據鏈路層
數據鏈路層(data link layer)通常簡稱為鏈路層。兩臺主機之間的數據傳輸,總是在一段一段的鏈路上傳送的,這就需要使用專門的鏈路層的協議。在兩個相鄰節點之間傳送數據時,數據鏈路層將網絡層交下來的 IP 數據報組裝成幀,在兩個相鄰節點間的鏈路上傳送幀。每一幀包括數據和必要的控制信息(如同步信息,地址信息,差錯控制等)。
在接收數據時,控制信息使接收端能夠知道一個幀從哪個比特開始和到哪個比特結束。這樣,數據鏈路層在收到一個幀后,就可從中提出數據部分,上交給網絡層??刂菩畔⑦€使接收端能夠檢測到所收到的幀中有無差錯。如果發現差錯,數據鏈路層就簡單地丟棄這個出了差錯的幀,以避免繼續在網絡中傳送下去白白浪費網絡資源。如果需要改正數據在鏈路層傳輸時出現差錯(這就是說,數據鏈路層不僅要檢錯,而且還要糾錯),那么就要采用可靠性傳輸協議來糾正出現的差錯。這種方法會使鏈路層的協議復雜些。
我一直的一個疑惑: 為什么有了 MAC 地址又需要 IP 地址, 或者說為什么有了 IP 地址還要有MAC 地址 ,困擾了我很長時間
1. MAC地址是數據鏈路層的概念, IP 是網絡層的概念, MAC地址只能實現在同一局域網下廣播找到對應機器, 在當不在同一局域網的時候, 就需要路由轉發等事情, 就需要 IP 來進行.
2. 最開始, 網絡層也不光是 IP協議一家獨大的, 還存在別的協議, 那么下層數據鏈路層需要提供服務就得用一個不受上層協議影響的一個東西來兼容. 也就是 MAC 地址,
3. IP 設計初衷是一人一個的,不是說永久, 就是動態唯一, 但是隨著 IPV4 的使用,并不夠用, 私網公網地址轉換的技術,這就讓一個IP地址可以對應很多臺終端,這樣其實 通過 IP 就無法找到一個唯一的終端 .
4. 不同設備(手機 電腦 平板等)的 MAC 地址的格式規格都不一樣, 無法統一標準 .
網絡層
努力盡最大可能交付
思考:
數據鏈路層未解決的問題:
數據鏈路層沒辦法保證可靠傳輸 (不重復 不丟失 不失序)
同一網絡下 可以通過共享總線的方式 廣播 找到MAC地址 . 不同網絡下, 如何交換數據 ?
網絡層是否可以完成 ?
網絡層無法保證可靠傳輸 網絡層負責將數據包傳輸 不保證重復 丟失 連續 這個問題向上傳遞
不同網絡下, 通過中間設備 路由器 來進行分組轉發, 找到對應的 IP MAC地址
網絡層提供的兩種服務
虛電路 是一種邏輯電路 , 猶如電話線 ,兩端可直接對接.
1、由網絡管理員提前配置好一條線路,以后當數據從H1到H2時,都會走這條線路。
2、虛電路服務是邏輯線路
數據報更像是 寫信 ,寫完之后不管怎么走,不管走哪條路最后爭取送到另一端
1、網絡層向上只提供簡單靈活的、無連接的、盡最大努力交付的數據報服務。
2、網絡在發送分組時不需要建立連接,每個IP數據報都是獨立的。
3、網絡層不提供服務質量的承諾。即所傳送的分組可能出錯、丟失、重復和失序(不按序到達終點),當然也不保證分組傳送的時限。
兩者對比
網絡協議 IP
網絡協議 IP 是 TCP/IP 體系中兩個最主要的協議之一 .
與 IP 協議配套使用的還有三個協議
將網絡互相連接起來需要使用一些中間設備,中間設備又稱為 中間系統 或中繼設備.
有一下五種中間設備:
路由器屏蔽不同網絡之間的不同,組成一個虛擬互聯網絡
虛擬互聯網絡也就是邏輯互聯網絡, 他的意思就是互聯起來的各種物理網絡的異構性本來是客觀存在的, 但是我們利用 IP 協議就可以使這些性能各異的網絡從用戶看起來好像是一個統一的網絡.
IP 地址就是給每個連接在互聯網上的主機(或路由器) 分配一個在全世界唯一的 32 位的標識符
分類 IP 地址:
IP 地址的結構 : 網絡號 + 主機號32位
用戶使用 A B C 三類 , 三類根據 地址中 網絡號跟主機號位數不一樣來分類
二進制 0開頭 A類 10開頭 B類 110開頭 C類
地址解析協議 (ARP)
已經知道一個主機的 IP , 如何找到對應的硬件地址 ?
ARP協議作用: 從網絡層使用的 IP 地址, 解析出在數據鏈路層使用的硬件地址,
已知IP地址轉換為MAC地址的工作是由ARP協議來完成的
每一個主機都設置有一個ARP高速緩存, 里面有所有在局域網上的各主機和路由器的IP 地址與硬件地址的映射表
ARP是解決同一局域網上的主機或路由器的 IP 地址與物理地址的映射關系
如果要找的主機和源主機不在同一個局域網上, 那么就通過arp找到一個位于局域網上的某個路由器的硬件地址 , 然后把分組發送給這個路由器的硬件地址, 然后把分組發送給這個路由器, 讓這個路由器轉發給下一個網絡 ,剩下的工作就交給下一個網絡來做 .
鏈路層封裝幀的時候是如何知道目標mac地址的?
假設拓撲為主機A——R1——R2——主機B
主機A向主機B發送PING,完整過程如下:
1)主機A發現目標IP與自己不在同一網段,需要經過路由器轉發
2)查路由表獲得R1的IP地址及出接口(從哪個網卡發出),查ARP表無對應條目
3)發起ARP請求,目的IP為R1,目的MAC為廣播MAC(FF:FF:FF:FF:FF:FF),源IP和源MAC為主機A網卡的IP和MAC
4)R1收到ARP請求,將主機A的IP和MAC加入自己的ARP緩存表,用自身IP和MAC響應主機A的ARP請求。
5)主機A收到ARP響應,將R1的IP和MAC加入自己的ARP緩存表,用自身IP和MAC為源,主機B的IP和R1的MAC為目的,封裝數據幀,并將其轉發給R1(此時數據幀源IP為主機A,目的IP為主機B,源MAC為主機A,目的MAC為R1)
6)R1收到數據幀,根據目的IP查路由表,發現需要R2轉發,查ARP表,無對應條目。以自身IP和MAC為源,目的IP為R2,目的MAC為廣播發送ARP請求,并將來自主機A的數據幀丟棄。
7)R2收到ARP請求,將R1的IP和MAC加入自己的ARP緩存表,用自身IP和MAC響應主機R2的ARP請求。
8)R1收到ARP響應,將R2的IP和MAC加入自己的ARP緩存表
9)主機A發現超時,重發數據幀
10)R1收到數據幀,查路由表,須經R2轉發,查ARP表,獲得R2的MAC地址。將數據幀的源MAC修改為自身,目的MAC修改為R2,并將數據幀轉發給R2。(此時數據幀源IP為主機A,目的IP為主機B,源MAC為R1,目的MAC為R2)
11)R2收到數據幀,查路由表,發現主機B與自己直連,查ARP表,無對應條目。發起ARP請求,并將來自主機A的數據包丟棄。
12)主機B收到ARP請求,將R2加入ARP緩存,并響應。
13)R2收到響應,將主機B加入ARP緩存
14)主機A發現超時,重發數據幀(此時源IP為A,目的IP為B,源MAC為A,目的MAC為R1)
15)R1收到數據幀,查路由表arp表,修改源目MAC后轉發給R2(此時源IP為A,目的IP為B,源MAC為R1,目的MAC為R2)
16)R2收到數據幀,查路由表arp表,修改修改源目MAC后轉發給主機B(此時源IP為A,目的IP為B,源MAC為R2,目的MAC為B)
17)主機B收到數據幀,并響應主機A的PING請求,將響應報文的源IP設為主機B,目的IP為A,源MAC為B,目的MAC為R2,并將數據幀轉發給R2(此時源IP為B,目的IP為A,源MAC為B,目的MAC為R2)
18)R2收到數據幀,查路由表arp表,修改修改源目MAC后轉發給R1(此時源IP為B,目的IP為A,源MAC為R2,目的MAC為R1)
19)R1收到數據幀,查路由表arp表,修改修改源目MAC后轉發給主機A(此時源IP為B,目的IP為A,源MAC為R1,目的MAC為A)
20)主機A收到主機B的響應。每經過一臺路由器,數據幀的源目IP不會改變,但源目MAC都會變化,所有設備都只知道與自己直連設備的MAC地址。
為什么不直接用硬件地址來進行通信 ?
因為全世界存在各式各樣的網絡, 他們使用不同的硬件地址 . 要使這些異構網絡能夠互相通信就必須進行非常復雜的硬件地址轉換工作, 因此幾乎是不可能的事.
IP 數據報的格式
劃分子網和構建超網
子網掩碼
為什么需要子網掩碼 ?
從一個 IP 數據報的 首部 并無法判斷源主機或目的主機所連接的網絡是否進行了子網劃分
使用子網掩碼可以找出 IP地址的子網部分
ICMP協議
ICMP 報文的種類分為兩種 :
ICMP詢問報文
虛擬專用網 VPN
傳輸層傳輸層協議概述
如果把可靠傳輸交給網絡層 : 那么主機與主機之間就需要固定的線路, 而別的主機就沒辦法使用這個線路.
復用與分用
個人總結理解: 復用與分用 , 兩臺主機同時通信多個不同的應用程序, 傳到傳輸層的時候只有兩種協議 , tcp 和 udp , tcp udp 就會根據不同的進程所需的傳輸層協議進行復用, 傳輸層傳到 網絡層 又會進行 IP 復用, 復用(個人理解為 共用一種協議) 就可以和在一塊發送, 接收方在根據協議進行 分用
傳輸層提供應用進程間的邏輯通信
網絡層與傳輸層的區別 :
網絡層是為主機間提供邏輯通信
傳輸層是為應用進程之間提供端到端的邏輯通信
傳輸層的兩個主要協議 :
用戶數據報協議 UDP
UDP 首部 組成 源端口 目的端口 長度 校驗和 各占 2 字節
校驗和校驗的是 偽首部中 IP 與 端口 才能確定一個唯一的值 .
傳輸控制協議 TCP 概述
TCP 連接是一條虛連接而不是一條真正的物理連接.
TCP 根據對方給出的窗口值和擁塞程度來決定一個報文段包含多少個字節
TCP連接的端點不是主機, 不是主機的 IP 地址 , 不是應用進程, 也不是運輸層協議的端口 .
TCP 連接的端點叫做套接字
TCP協議如何保證可靠傳輸(必看)9
套接字 = IP + 端口號
可靠傳輸的工作原理
停止等待協議
“停止等待” 就是每發送完一個分組就停止發送, 等待對方確認. 在收到確認后再發送下一個分組 .
可能有三種差錯情況 :
M1 丟失
B 回復 ACK 丟失 , A并沒有收到不知道發送成功與否
都沒有丟失,但是饒了遠路
累計確認:在流水線傳輸時,不用每個分組都給確認,確認收到連續最大的分組就可,表示前面的分組全部收到。
TCP連接的每一端都必須設有兩個窗口 發送窗口 和 接受窗口, 這四個窗口處于動態變化中 .
TCP 的可靠傳輸是基于 字節的序號 進行控制, TCP 所有的確認都是基于序號而不是基于報文段 .
TCP 報文段的首部格式
雖然 TCP 是基于 報文段傳輸的, 但是報文段中 是基于 數據流傳輸的 , 相當于報文段是一個總概括, 我這次要給你的字節流是多少, 收到多少 , 這些字節流的序號 , 報文段是一個載體,概括.
序號 : 我這次給你發送的數據起始點 . 我上次給你發到了 5 收到了, 這次發送是 6 開始. 4 字節
確認號 : 上次發到我收到了 幾號 字節的序號, 下次給我發就從這個發起 . 假如我已經收到 5 , 那么我下次期望開始的是 6 這個數就是 6 . 4 字節
A 發給 B 序號是 x 從 X 發送 到 Y 確認號就是你上次給我發的我收到了 這次我想要 n 開始的序號
B 收到 A 的報文段 給A 回復 中 序號就是 行 你想要 n 開始 那我就從 n 開始 , 確認號 你上次發給我到 y 的字節序號我也收到了 你下次給我發 從 y + 1 的位置發
URG 緊急指針 配合緊急指針 緊急指針有緊急數據的位置
ACK 當第一次連接的時候 其實是沒有數據的 為 0
PSH 當為 1 時 就全部推給應用進程, 如果是 0 就等緩存填滿 在 推 而不是來一位推一位
RST 當RST 為 1 時, 表明 TCP 連接送出現差錯, 必須釋放連接 , 然后重新建立連接
SYN 當 SYN為1 表示這是一個連接請求 正在進行連接
FIN 釋放連接
窗口 發送方的接收窗口 你根據我的接收窗口大小 修改你的 發送窗口的大小 2字節
校驗和 2 字節
這的窗口是接收窗口
TCP 的滑動窗口 是以字節為單位
加權平均往返時間 (RTT)
TCP 的流量控制
利用滑動窗口實現流量控制
流量控制就是讓發送方的發送速率不要太快, 既要讓接收方來得及接收, 也不要使網絡擁塞 .
當滑動窗口的 大小為 0 時 , 那么發送端沒法發送數據 , 如何知道接收端的窗口的大小 ?
TCP 的擁塞控制
在某段時間, 若對網絡中某些資源的需求超過了該資源所能提供的可用部分 ,網絡的性能就要變壞. 這種現象稱為擁塞.
出現擁塞的原因 : 對資源需求 > 可用資源
擁塞控制就是防止過多的數據注入到網絡中, 是網絡中的路由器和鏈路不至過載
當前網絡朝著高速化的方向發展, 這很容易出現緩存不夠大而造成分組丟失. 但分組丟失是網絡發生擁塞的征兆而不是原因,
因為發生分組丟失的情況有很多.
TCP采用基于窗口的方式進行擁塞控制, TCP 發送方維持一個擁塞窗口
收到三個相同的確認 :
A 給 B 發送數據 1 B收到了 , 回了確認 我要 2 然后 A 發送 2 , 3 , 4 , 5 這個時候如果 B一直沒有收到2網絡協議是計算機網絡中服務器,但是收到了了3 ,4 , 5 ,
他每收到一個就會給A 回 我2 沒有收到 這樣 這三個回復就是相同的 就預示著可能會出現擁塞控制 ,采取措施.
TCP 擁塞控制算法:
慢開始門限下 每個輪次 慢開始 擁塞窗口加倍 , 加到慢開始門限值時, 就擁塞避免了, 每個輪次 擁塞窗口 +1 一直加到 超時的時候, 那這個時候 直接來個狠得, 把擁塞窗口 變為最小值 1 , 然后慢開始門限值 變為剛才超時時候的擁塞窗口值的一半, 然后接著慢開始 ,到慢開始門限, 就 +1 增長, 擁塞避免, 然后等到出現 收到三次重復確認的時候, 有擁塞的征兆的時候, 就把擁塞窗口值變為 剛才的一半 門限值也為原來的一半, 接著擁塞避免 +1 的走 . 為的就是在更多的輪次中發送更多的分組, 讓擁塞控制來的更晚一些.
最后擁塞窗口為什么不變為 1 ?
因為這個時候還能收到分組數據, 證明還沒那么嚴重, 沒必要把擁塞窗口設置為 1 .這樣在每個輪次中發送的分組更多.
TCP 的運輸連接管理
過程
A —- > B SYN 請求建立連接 然后 seq 序號 x
B —- > A 好的 我接收到你給我發的數據了 ACK = 1 ack = x + 1 確認號 剛發的 x + 1 之前的我都收到了, 全雙工通信 , 我也對你請求建立連接 SYN = 1 , seq = y
A —- > B 好的 我收到你的請求 ACK = 1 , 你剛給我發的 y + 1之前的數據我也收到了 , 這次給你發的數據 是從 x+1 發的
如果最后第四個 A -> B 的數據報丟了怎么辦 . A 怎么知道 B 收沒收到我的收到信號 .
A 會在發送第四次數據報之后等 2MSL (報文最大生存時間)的時間 狀態, 這個時候假如丟了, 那么 B 一直沒有收到消息, 就會超時重傳 , 只要我沒有收到B 傳回來的報文段證明剛才那個就發送成功了 可以斷開連接.
TCP粘包,拆包及解決方法
當客戶端發送一連串的消息到服務端, 而服務端只接受到一半或者兩個連續的消息. 服務端收到消息, 但無法解析
為什么會發生TCP粘包、拆包?
發生TCP粘包、拆包主要是由于下面一些原因:
1.應用程序寫入的數據大于套接字緩沖區大小,這將會發生拆包。
2.應用程序寫入數據小于套接字緩沖區大小,網卡將應用多次寫入的數據發送到網絡上,這將會發生粘包。
3.進行MSS(最大報文長度)大小的TCP分段,當TCP報文長度-TCP頭部長度>MSS的時候將發生拆包。
4.接收方法不及時讀取套接字緩沖區數據,這將發生粘包。
粘包、拆包解決辦法
TCP本身是面向流的,作為網絡服務器,如何從這源源不斷涌來的數據流中拆分出或者合并出有意義的信息呢?通常會有以下一些常用的方法:
1、發送端給每個數據包添加包首部,首部中應該至少包含數據包的長度,這樣接收端在接收到數據后,通過讀取包首部的長度字段,便知道每一個數據包的實際長度了。
2、發送端將每個數據包封裝為固定長度(不夠的可以通過補0填充),這樣接收端每次從接收緩沖區中讀取固定長度的數據就自然而然的把每個數據包拆分開來。
3、可以在數據包之間設置邊界,如添加特殊符號,這樣,接收端通過這個邊界就可以將不同的數據包拆分開。
應用層 ( 面試高頻問點 )
應用層的總結知識都是面試常問的知識 .
DNS 過程
進行DNS(Domain Name System,域名系統)查詢,它的作用是將域名轉化為具體的ip地址。
先談一下DNS的結構:
(1)根域名服務器,全球只有13個不同ip地址的服務器,注意不是服務器只有13臺,只是他們所代表的地址只有13個,也就是存在鏡像服務器,一個地址可以對應多個鏡像服務器。
(2)根域名服務器之下的頂級域名服務器,如com、net、cn、gov等。
(3)頂級域名服務器之下的權威服務器,比如baidu、facebook等。
(4)權威服務器之下的資源記錄,比如www、ftp、mail等。
查詢的過程如下:
(1)首先會在瀏覽器緩存中去查詢,之前每瀏覽一個網站,瀏覽器都會在緩存中存有域名與ip地址的映射關系。不過緩存失效的時間不由瀏覽器決定,而由操作系統決定。
(2)瀏覽器緩存中查詢不到后,之后會在系統緩存中查詢,由瀏覽器發起一個系統調用,查詢系統緩存中的數據。
(3)系統緩存中也查詢不到后,將會去路由器緩存中查找。
(4)路由器緩存中也找不到的話,將會從本地DNS服務器的緩存中查找,本地服務器即用戶自己配置的DNS服務器。
(5)如果本地的DNS服務器也找不到的話,本地DNS將會發送請求至根域名服務器,根域名服務器中沒有相關緩存數據的時候,就會返回com頂級域名服務器的地址。然后本地DNS服務器再發送請求至com頂級域名服務器,com頂級域名服務器中查詢不到的話,就會返回baidu權威服務器的地址,然后本地DNS服務器再發送請求至baidu權威服務器,baidu權威服務器就會返回www主機地址。(這是一種迭代的過程,還有一種遞歸的過程。即local至根域名,根域名不直接返回com地址,而是發送請求至com,com發送請求至baidu,baidu發送請求至www,www再返回給baidu,baidu返回給com,com再返回給local)至此,整個DNS查詢步驟結束,現在瀏覽器拿到了域名對應的ip地址。