網絡之間數據如何傳輸的

計算機網絡是什麼

計算機網絡(簡稱網絡)是由若干結點和鏈接這些結點的鏈路組成。結點能夠是計算機,集線器,交換機或路由器。html

(這圖些許有些草率了)各個主機之間經過交換機鏈接,而路由器負責鏈接多個不一樣的網絡 image.pngweb

網絡分類

  • 局域網能夠實現文件管理、應用軟件共享、打印機共享等功能,是一個可鏈接住宅,學校,實驗室,大學校園或辦公大樓等有限區域內計算機的計算機網絡。以太網和Wi-Fi(無線網絡鏈接)是現今局域網中最經常使用的兩項技術。
  • 廣域網,又稱廣域網外網公網。是鏈接不一樣地區局域網城域網計算機通訊的遠程網。在一個區域範圍裏超過集線器所鏈接的距離時,必需要經過路由器來鏈接,這種網上類型稱爲廣域網。廣域網的發送介質主要是利用電話線或光纖,由ISP將企業間作連線,這些線是ISP業者預先埋在馬路下的線路
  • 無線局域網利用射頻( RF)的技術,使用電磁波,取代舊式的雙絞銅線所構成的局域網絡,須要無線網卡,無線路由器

中間設備

交換機

交換機工做於數據鏈路層。交換機內部的CPU會在每一個端口成功鏈接時,經過將MAC地址和端口對應,造成一張MAC表。在從此的通信中,發往該MAC地址的數據包將僅送往其對應的端口,而不是全部的端口。所以,交換機可用於劃分數據鏈路層廣播,即衝突域;但它不能劃分網絡層廣播,即廣播域。算法

簡略的歸納一下交換機的基本功能:數據庫

1. 像集線器同樣,交換機提供了大量可供線纜鏈接的端口,這樣能夠採用星型拓撲佈線。瀏覽器

2. 像中繼器集線器網橋那樣,當它轉發幀時,交換機會從新產生一個不失真的方形電信號。緩存

3. 像網橋那樣,交換機在每一個端口上都使用相同的轉發或過濾邏輯。服務器

4. 像網橋那樣,交換機將局域網分爲多個衝突域,每一個衝突域都是有獨立的寬帶,所以大大提升了局域網的帶寬。微信

5. 除了具備網橋集線器中繼器的功能之外,交換機還提供了更先進的功能,如虛擬局域網(VLAN)和更高的性能。markdown

老式的交換機只支持兩層(到MAC數據鏈路層),因此須要路由器去解析IP,而如今不少交換機已經支持了三層(到IP層)網絡

路由器

路由器一般位於OSI模型的網絡層,是鏈接兩個或多個網絡的硬件設備,在網絡間起網關的做用。它可以理解不一樣的協議,例如某個局域網使用的以太網協議,因特網使用的TCP/IP協議。能夠分析各類不一樣類型網絡傳來的數據包的目的地址,把非TCP/IP網絡的地址轉換成TCP/IP地址,或者反之;再根據選定的路由算法把各數據包按最佳路線傳送到指定位置。因此路由器能夠把非TCP/ IP網絡鏈接到因特網上。

原理

網絡中的設備相互通訊主要是用它們的IP地址,路由器只能根據具體的IP地址來轉發數據。計算機之間的通訊只能在具備相同網絡地址的IP地址之間進行,若是想要與其餘網段的計算機進行通訊,則必須通過路由器轉發出去。不一樣網絡地址的IP地址是不能直接通訊的,即使它們距離很是近,也不能進行通訊。路由器的多個端口能夠鏈接多個網段,每一個端口的IP地址的網絡地址都必須與所鏈接的網段的網絡地址一致。不一樣的端口它的網絡地址是不一樣的,所對應的網段也是不一樣的,這樣才能使各個網段中的主機經過本身網段的IP地址把數據發送到路由器上。

網關(Gateway)

又稱協議轉換器,在網絡層以上實現網絡互聯

網關實質上是一個網絡通向其餘網絡的IP地址(網關的IP地址是具備路由功能的設備的IP地址)。

地址

在各個設備之間的傳輸是須要MAC地址的。

硬件地址

又稱物理地址,MAC地址,是數據鏈路層和物理層使用的地址。實際上就是適配器地址或適配器標識符EUI-48,當這塊適配器插入某臺計算機後,適配器上的標識符就成爲了這臺機器的MAC地址了。

若是鏈接在局域網上的主機或路由器安裝有多個適配器,那麼這樣的主機或路由器就有多個MAC地址。當路由器經過適配器鏈接到局域網時,適配器的硬件地址就用來標誌路由器的某個接口,路由器若是須要同時鏈接到兩個網絡上,那麼他就須要兩個適配器和兩個硬件地址。

IP地址

IP地址就是給每一臺主機(或路由器)的每個接口分配一個在全世界範圍內惟一的32位的標識符。IP地址是網絡層及以上各層使用的地址,是一種邏輯地址。

image.png A/B/C類地址都由兩個固定的字段組成,其中第一個字段是網絡號(net-id),它標誌主機(或路由器)所鏈接到的網絡,一個網絡號在整個互聯網範圍內是惟一的。第二個字段是主機號(host-id),標誌該主機(路由器)。一臺主機號在它前面的網絡號所指明的網絡範圍內必須是惟一的。因而可知,一個IP地址在整個互聯網範圍內是惟一的。這三類地址都是單播地址,是最經常使用的。

子網

IP地址 = 網絡號 + 子網號 + 主機號

子網掩碼是一個網絡或一個子網的重要屬性,路由器交換信息時,必須將本身所在網絡的子網掩碼告訴相鄰路由器

A類地址的默認子網掩碼是255.0.0.0

B類地址的默認子網掩碼是255.255.0.0

C類地址的默認子網掩碼是255.255.255.0

常見的IP書寫方式如 192.168.100.1/24,24對應的實際上是子網掩碼

image.png

  • 在IP層抽象的互聯網上只能看到IP數據報,雖然中間通過許多路由器的轉發,可是首部的源地址和目的地址是不變的。
  • 雖然IP數據報首部由源站IP地址,但路由器只根據目的IP地址的網絡號進行路由選擇
  • 在局域網的鏈路層,只能看見MAC幀。IP數據報被封裝在MAC幀中,在進行不一樣的網絡上傳送時,MAC幀首部的源地址和目的地址是會改變的:到達新的路由器後,會將原來的源地址和目的地址丟棄,在轉發的時候網絡接口軟件用ARP將下一跳路由器的IP地址轉換成MAC地址,封裝到數據鏈路層的首部。

數據包傳輸過程

咱們常說的計算機的網絡模型,在各個協議層之間數據傳輸的時候經歷的過程是什麼

  • 發出方應用層發出信息M,叫作message
  • 應用層將message發給傳輸層,加上一層傳輸層的header,生成segment:數據段
  • 將數據段在傳給網絡層,加上一層網絡層header,生成datagram:數據報
  • 將數據報傳輸到數據鏈路層,加上一層數據鏈路層的首部和尾部,生成frame:數據幀
  • 將這個數據包的每個bit經過物理層傳輸到與他緊密相連的下一個設備上,也就是轉換器(switch)
  • 經過switch送到相應的路由器上
  • 路由器的數據鏈路層先接收到數據幀,將數據鏈路層的header去掉,傳輸給網絡層
  • 路由器的網絡層對網絡層的header進行分析知道在router上的哪一個出口,將相應的數據報放到對應的出口上,在出口再進行數據鏈路層的包裝,將新生成的數據幀傳輸到下一站
  • 接收方數據鏈路層會將數據鏈路層的header去掉,送到網絡層
  • 網絡層將網絡層的header去掉,送到傳輸層
  • 傳輸層將傳輸層的header去掉,送到應用層
  • 應用層能夠拿到本來的信息M

各個層的首部

應用層— HTTP

支持網絡應用協議和程序的運行,相似於微信/雲服務等

經常使用協議HTTP(超文本傳輸協議)、FTP(文件傳輸協議),SNMP ,SMTP(郵件),DNS,DHCP

DHCP動態主機配置協議,使用UDP協議工做, 給內部網絡自動分配IP地址。DHCP服務器先廣播一次,若無響應廣播四次,無響應則DHCP失敗

HTTP 協議主要由三大部分組成:

  • 起始行(start line):描述請求或響應的基本信息;
  • 頭部字段(header):使用 key-value 形式更詳細地說明報文;
  • 消息正文(entity):實際傳輸的數據,它不必定是純文本,能夠是圖片、視頻等二進制數據。

其中起始行和頭部字段併成爲 請求頭 或者 響應頭,統稱爲 Header;消息正文也叫作實體,稱爲 body。HTTP 協議規定每次發送的報文必需要有 Header,可是能夠沒有 body,也就是說頭信息是必須的,實體信息能夠沒有。並且在 header 和 body 之間必需要有一個空行(CRLF)

image.png 相似於

GET /home.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/testpage.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT
If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"
Cache-Control: max-age=0 
複製代碼

首部分爲請求首部和響應首部,而且部分首部兩種通用

通用字段 做用
Cache-Control 控制緩存的行爲
Connection 瀏覽器想要優先使用的鏈接類型,好比 keep-alive
Date 建立報文時間
Pragma 報文指令
Via 代理服務器相關信息
Transfer-Encoding 傳輸編碼方式
Upgrade 要求客戶端升級協議
Warning 在內容中可能存在錯誤

請求首部

請求首部 做用
Accept 能正確接收的媒體類型
Accept-Charset 能正確接收的字符集
Accept-Encoding 能正確接收的編碼格式列表
Accept-Language 能正確接收的語言列表
Expect 期待服務端的指定行爲
From 請求方郵箱地址
Host 服務器的域名
If-Match 兩端資源標記比較
If-Modified-Since 本地資源未修改返回 304(比較時間)
If-None-Match 本地資源未修改返回 304(比較標記)
User-Agent 客戶端信息
Max-Forwards 限制可被代理及網關轉發的次數
Proxy-Authorization 向代理服務器發送驗證信息
Range 請求某個內容的一部分
Referer 表示瀏覽器所訪問的前一個頁面
TE 傳輸編碼方式

響應首部

響應首部 做用
Accept-Ranges 是否支持某些種類的範圍
Age 資源在代理緩存中存在的時間
ETag 資源標識
Location 客戶端重定向到某個 URL
Proxy-Authenticate 向代理服務器發送驗證信息
Server 服務器名字
WWW-Authenticate 獲取資源須要的驗證信息

傳輸層-TCP

管理收發雙方數據分包傳輸的協議,對收到的報文進行差錯檢測

網絡層是爲主機之間提供邏輯通訊,而傳輸層爲應用進程之間提供端到端的邏輯通訊

TCP的傳輸單元是報文段,分爲首部和數據兩部分

應用層協議和傳輸層協議的對應關係: image.png 爲了使不一樣操做系統的計算機的應用進程能夠互相通訊,傳輸層使用協議端口號,簡稱爲端口,雖然通訊的終點是應用進程,但只要把報文交到目的主機的目的端口,最後的交付目的進程由TCP或UDP完成。

常見端口

  • 21端口:FTP 文件傳輸服務
  • 22端口:SSH 遠程鏈接服務
  • 23端口:TELNET 終端仿真服務
  • 25端口:SMTP 簡單郵件傳輸服務
  • 53端口:DNS 域名解析服務
  • 80端口:HTTP 超文本傳輸服務
  • 443端口:HTTPS 加密的超文本傳輸服務
  • 3306端口:MYSQL數據庫端口
  • 5432端口:PostgreSQL數據庫端口
  • 6379端口:Redis數據庫端口
  • 8080端口:TCP服務端默認端口
  • 8888端口:Nginx服務器的端口
  • 27017端口:mongoDB數據庫默認端口

TCP報文首部的前20個字節是固定的,後面有4n字節是根據須要增長的選項。 image.png

  • 源端口和目的端口:各佔兩字節,源端口:本機IP的隨機端口,目的端口:IP後的端口
  • 序號Sequence number(4字節),這個序號保證了 TCP 傳輸的報文都是有序的,對端能夠經過序號順序的拼接報文
  • 確認號Acknowledgement Number(4字節),這個序號表示數據接收端指望接收的下一個字節的編號是多少,同時也表示上一個序號的數據已經收到
  • 數據偏移
  • 保留(6位):爲從此使用,目前應置爲0
  • 標識符
    • URG=1(緊急):1表示本數據報的數據部分包含緊急信息,是一個高優先級數據報文。緊急數據必定位於當前數據包數據部分的最前面
    • ACK=1(確認):1表示確認號字段有效,0無效。TCP 規定在鏈接創建後傳送的全部報文段都必須把 ACK 置爲1。
    • PSH=1(傳送):1表示接收端應該當即將數據 push 給應用層,而不是等到緩衝區滿後再提交。
    • RST=1(重置):1表示當前 TCP 鏈接出現嚴重問題,可能須要從新創建 TCP 鏈接,也能夠用於拒絕非法的報文段和拒絕鏈接請求。
    • SYN=1(創建聯機):當SYN=1,ACK=0時,表示當前報文段是一個鏈接請求報文。當SYN=1,ACK=1時,表示當前報文段是一個贊成創建鏈接的應答報文。
    • FIN=1(結束):該字段爲一表示此報文段是一個釋放鏈接的請求報文。
  • 窗口Window Size(2字節),窗口大小,表示還能接收多少字節的數據,用於流量控制
  • 檢驗和(2字節):檢驗首部和數據是否變化
  • 緊急指針(2字節):僅在URG = 1時有效,指出緊急數據的字節數,緊急指針標明瞭緊急數據的尾部。注意:即便窗口爲0也能夠發送緊急數據
  • 選項:可變,最大40字節
    • 最大報文段長度MSS:數據字段的最大長度
    • 時間戳:用於計算往返時間RTT

網絡層-IP

對網絡數據包進行存儲轉發,路由器經過路由算法算出數據包從哪一個出口出去就是粗略的存儲轉發

網絡層向上只提供簡單靈活的,無鏈接的,盡最大努力交付的數據報服務,網絡層不提供服務質量的承諾,可能會出錯,丟失,重複,失序等問題,若是主機中的通訊須要可靠的,則由傳輸層負責(包括差錯處理,流量控制等)

主要的協議是IP,與IP協議配套使用的還有三個協議:

  • 地址解析協議(ARP)
  • 網際控制報文協議(ICMP)
  • 網際組管理協議(IGMP)

image.png

  • 版本(4位):協議版本,通訊雙方的IP協議版本必須一致,有IPv4呵IPv6
  • 首部長度(4位):可表示的最大十進制值爲15,一個單位表示32位字長(4字節);IP首部的固定長度是20字節,因此最小值爲5
  • 區分服務(8位):通常不用
  • 總長度(16位):首部和數據之和的長度,單位爲字節,數據報的最大長度爲2的16次方 - 1 = 65535字節。可是IP層下的每一種數據鏈路層協議都規定了一個數據幀中的數據字段的最大長度,稱爲最大傳送單元(MTU) ,當數據報被封裝成數據幀的時候,數據報的長度不能超過鏈路層協議規定的MTU值,若是超過就要進行分片處理。
  • 長的數據報傳輸效率更高(由於首部佔比小),短的路由器轉發速度快
  • 標識(16位):每產生一個數據報,此值+1,用於分片後的數據報片能夠重裝成原來的數據報
  • 標誌(3位):目前只有2位有意義
    • 標誌字段最低位記MF。MF = 1標識後面還有分片。MF = 0 表示是若干數據報片中的最後一個
    • 標誌字段中間的一位記爲DF,意思是不能分片,只有當DF = 0 時才容許分片
  • 片偏移(13位):某片在原分組中的相對位置
  • 生存時間(8位):TTL表示數據報在網絡中的壽命。每通過一個路由器TTL減1,若TTL減爲0時,就丟棄這個數據報,最大數值爲255
  • 協議(8位):目的主機的IP層知道將數據部分交給哪一個協議處理

image.png

  • 首部檢驗和(16位):只檢驗數據報的首部,但不包括數據部分,每通過一個路由器會從新計算首部檢驗和,值爲0說明未發生變化,不然就認爲出現差錯,丟棄數據報
  • 源地址(32位)
  • 目的地址(32位)

IP轉發

IP首部記錄的是源IP地址和目的IP地址,不會記錄通過的路由器的IP地址。

因此當路由器接收到一個待轉發的數據報,從路由表得出下一跳路由器的IP地址後,送交數據鏈路層的網絡接口軟件,網絡接口軟件用ARP將下一跳路由器的IP地址轉換成MAC地址,放在鏈路層的MAC幀的首部,而後根據這個硬件地址找到下一跳路由器。

路由表:每一行對應一個網絡,每一條路由記錄(目的網絡地址,子網掩碼,0下一跳地址)
複製代碼

數據鏈路層-MAC幀

管理數據包點對點(終端,路由器,switch轉換器等兩個物理機器)之間的發出與接收,wifi就是在數據鏈路層

數據鏈路層的協議數據單元——

image.png

  • 目的地址和源地址(6字節):記錄路由器的MAC地址,在傳輸過程當中是可變的
  • 類型(2字節):標誌上一層使用什麼協議
  • 數據字段(46-1500字節之間)
  • 幀檢驗序列FCS(使用CRC檢驗)

APR協議

根據IP地址解析出MAC地址,能夠劃分在網絡層,也能夠劃分在數據鏈路層。

還有一箇舊的逆地址解析協議RARP,根據硬件地址找IP地址,如今由DHCP替代。

每一臺主機都有一個ARP高速緩存,裏面有本局域網上的各主機和路由器的IP地址到硬件地址的映射表,這個映射表會常常更新(新增或超時刪除:網絡中的主機是變更的,而更換網絡適配器物理地址也是變更的)

物理層

管理每個數據的每個比特在物理媒體(電纜,光纖,無線電波等)上是如何傳輸的

輸入域名到頁面呈現都經歷了什麼

鏈接上網

新鏈接的筆記本鏈接上網須要一個IP地址,本地路由器地址,DNS服務器地址。解析獲取這些數據使用的是DHCP協議(應用層),而支持DHCP的傳輸層協議是UDP

  • DHCP查詢信息被封裝在UDP數據段中,以後被封裝在IP數據報中,再被封裝在802.1 Ethernet數據幀中
  • Ethernet數據幀被廣播(broadcast)到整個LAN(局域網),從而被正在運行DHCP server的網絡設備收到
  • 在DHCP server設備中,Ethernet數據幀被解封成IP數據報,被解封到UDP網絡數據段,被解封到DHCP信息,而後運行DHCP的這個router解讀信息,發現是來了一個新設備,他須要一個ip地址。
  • DHCP服務器就生成DHCP ACK信息,其中包含用戶的IP地址本地路由器IP地址DNS服務器的名字和IP地址
  • 在DHCP服務器進行層層封裝後,數據幀經過LAN被推送到用戶端,在此過程當中途徑的switch對IP地址對應的端口號進行記錄,以後數據幀在用戶端層層解封
  • DHCP用戶收到DHCP ACK 信息包,拿到了本身的IP地址,知道了DNS的名字和地址,以及本地路由器IP地址,就能夠經過DNS的地址來找到相應域名的IP地址,經過本地路由器的地址進行進一步的數據轉發

去DNS獲取域名對應的IP

要將域名轉換成IP是由於計算機只認識數字(IP),而不認識域名。固然若是你輸入的直接是IP地址或者是有了DNS緩存,則不需這一步

DNS緩存指DNS返回了正確的IP以後,系統就會將這個結果(域名與IP的映射)臨時儲存起來。而且它會爲緩存設定一個失效時間
(例如N小時),在這N小時以內,當你再次訪問這個網站時,系統就會直接從你電腦本地的DNS緩存(瀏覽器,操做系統,路由等)中
把結果交還給你,而沒必要再去詢問DNS服務器,變相「加速」了網址的解析。固然,在超過N小時以後,系統會自動再次去詢問DNS服務
器得到新的結果。
因此,當你修改了 DNS 服務器,而且不但願電腦繼續使用以前的DNS緩存時,就須要手動去清除本地的緩存了
複製代碼

DNS查詢信息被建立封裝到UDP網絡段,IP數據報和Ethernet數據幀。爲了使數據幀能夠被髮送到路由器上,須要用ARP查出本地路由器MAC地址。(雖然上步知道了路由器的IP地址,但仍是須要路由器的MAC地址,才能把信息傳輸給路由器,固然若是DNS服務器是同一網段的,也能夠不經過路由器)

  • ARP在LAN中廣播,本地路由器收到後返回ARP reply,其中包含路由器相應端口的MAC地址
  • 含有DNS query的IP數據報經過LAN switch從用戶端發送到本地路由器
  • 此IP數據報從本地網絡發送到本地ISP網絡上,從而被路由轉發到相應的DNS server,這裏可能涉及多個根域名服務器,因此可使用CDN優化。
  • IP數據報在DNS server上被解封,返回域名對應的IP地址

IP地址會被封裝在網絡層的IP首部

  • 源地址:本身的IP
  • 目的地址:域名對應的IP

HTTP傳輸

爲了使不一樣操做系統的計算機的應用進程能夠互相通訊,運輸層使用協議端口號,簡稱爲端口,雖然通訊的終點是應用進程,但只要把報文交到目的主機的目的端口,最後的交付目的進程由TCP或UDP完成。

這種協議棧層間的抽象的協議端口是軟件端口(應用層的各類協議進程與運輸實體進行層間交互的一種地址),和路由器或交換機上的硬件端口(硬件設備交互的接口)是不一樣的概念。而端口會被封裝在TCP的首部

而後從這開始就是老生長談的了,創建TCP鏈接

  • 用戶端首先建立一個跟web server之間的TCP socket
  • TCP SYN segment(三步握手的第一條信息)被傳送到web server上
  • web server返回一個TCP SYNACK 信息(三步握手第二步)
  • 客戶端發出成功響應,TCP鏈接建立成功
  • 客戶端將HTTP request推入TCP socket中,將IP數據報傳送到google的web server,數據在進入服務端以前,可能還會先通過負責負載均衡的服務器,它的做用就是將請求合理的分發到多臺服務器上
  • web server返回HTTP reply(包含所需主頁內容)給客戶端

瀏覽器渲染

  • 瀏覽器拿到數據會判斷狀態碼是什麼,若是是 200 那就繼續解析,若是 400500 的話就會報錯,若是 300 的話會進行重定向,這裏會有個重定向計數器,避免過屢次的重定向,超過次數也會報錯。瀏覽器開始解析文件,若是是 gzip 格式的話會先解壓一下,而後經過文件的編碼格式知道該如何去解碼文件。

  • 瀏覽器準備渲染進程,默認狀況下,Chrome 會爲每一個頁面分配一個渲染進程,也就是說,每打開一個新頁面就會配套建立一個新的渲染進程。

  • 文件解碼成功後會正式開始渲染流程,先會根據 HTML 構建 DOM 樹,有CSS的話會去構建 CSSOM 樹。 CSSOM 樹和 DOM 樹構建完成後會開始生成 Render 樹,Layout計算頁面元素的佈局、樣式等等諸多方面的東西。Painting開始繪圖,而後將頁面展現出來,當前這一塊也涉及迴流重繪方面的優化。

相關文章
相關標籤/搜索