DNS域名解析:html
(用例:www.baidu.com)域名解析是網絡請求的第一步操做,DNS域名解析首先是在瀏覽器緩存中匹配歷史對應域名的IP地址,若是沒有找到就到計算機的網絡訪問緩存中匹配,若是還找不到匹配的IP地址,就會將域名發送到根權威服務器上(com),而後再根權威服務器上匹配到域名(baidu)的服務器IP地址返回發送回客服端上。web
網絡鏈接實質上是基於IP地址來創建網絡鏈接,最後實現數據傳送。好比咱們能夠經過控制檯而後使用ping命令查看到www.baidu.com的IP地址,而後能夠直接將IP地址輸入網址欄,照樣能夠獲取到百度的主頁。例如:數據庫
而後再地址欄輸入:https://119.75.217.109/照樣能夠訪問到百度首頁。編程
這裏主要就網絡訪問一些過程作一些說明,後面有對DNS有具體的解析瀏覽器
有了IP地址,至關於才能真正找到服務器,IP做爲每臺網絡計算機的惟一標識。這時候開始嘗試創建網絡通路,實現數據傳輸,也就有了三次握手和四次揮手的環節。網絡應用通訊的實際上進程,web應用是由客戶端的瀏覽器進程和web服務器的進程交換報文。緩存
套字節:即軟件接口向網絡發送報文和從網絡接收報文。套字節是同一臺主機內應用層與運輸層的接口,因爲該套字節是創建網絡應用程序的可編程接口,所以套字節也是應用程序和網絡之間的應用程序編程接口。應用程序開發者能夠控制套字節在應用層端的一切,可是對該套字節的運輸層端幾乎沒有控制權。應用程序開發者對於運輸層的控制權僅限於:1.選擇運輸層協議;2.也許能設定幾個運輸層參數,如最大緩存和最大報文段長度等。(《計算機網絡》59頁)安全
除了將報文發送到目標服務器,還必須指定運行在接受主機上的接收進程。也能夠說是端口號。一般web服務器端口號用80來標識。服務器
因特網(通常是TCP/IP網絡)爲應用提供兩層運輸協議,即UDP和TCP。下面是常見應用程序的服務要求:cookie
應用 | 數據丟失 | 帶寬 | 時間敏感 |
文件傳輸 | 不能丟失 | 彈性 | 不 |
電子郵件 | 不能丟失 | 彈性 | 不 |
Web文檔 | 不能丟失 | 彈性(幾kbps) | 不 |
因特網電話/視頻會議 | 容忍丟失 | 音頻(幾kbps~1Mbps)/視頻(10kbps~5Mbps) | 是,100ms |
存儲音頻/視頻 | 容忍丟失 | 音頻(幾kbps~1Mbps)/視頻(10kbps~5Mbps) | 是,幾秒 |
交互式遊戲 | 容忍丟失 | 幾kbps~10kbps | 是,100ms |
即時通信 | 不能丟失 | 彈性 | 是和不是 |
TCP服務:1.面向鏈接的服務:在應用層數據報文開始流動以前,TCP讓客戶和服務器相互交換運輸層控制信息。這就是握手過程,這條鏈接是雙工的,即鏈接雙方的進程能夠在此鏈接上同時進行報文收發。當應用程序結束報文發送時,必須拆除該連接,也就是揮手過程。2.可靠的數據服務,也就是數據層的可靠數據傳輸。而後,TCP協議還具備擁塞控制機制,這種服務不必定能爲通訊進程帶來直接好處,但能爲因特網帶來總體好處。當發送方和接受方之間的網絡出現擁塞時,TCP的擁塞控制機制會抑制發送進程(客戶端或服務器)。網絡
UDP服務:是一種不提供沒必要要服務的輕量級運輸協議,它僅提供最小服務。UDP是沒法鏈接,兩個進程通訊前沒有握手過程。當進程將一個報文發送進UDP套字節時,UDP協議並不保證該報文將到達接受進程,而且到達接收進程的報文也多是亂序到達。UDP沒有擁塞機制,因此UDP的發送端能夠用選定的任何速率向其下層注入數據(實際端到端吞吐量可能小於這個速率,這多是由於中間鏈路的帶寬受限或由於擁塞而形成的)。
因特網運輸協議不提供的服務:吞吐量和定時保證,但不意味着因特網電話這樣的時間敏感應用不能運行在因特網上,由於因特網上運行時間敏感應用已經有多年了(之後有機會對多媒體網絡這部分重點分析:)。
流行的因特網引用及其應用層協議和支撐的運輸協議:
應用 | 用戶層協議 | 支撐的運輸層協議 |
電子郵件 | SMTP [RFC 5321] | TCP |
遠程終端訪問 | Telnet [RFC 854] | TCP |
Web | HTTP [RFC 2616] | TCP |
文件傳輸 | FTP [RFC 959] | TCP |
流式多媒體 | HTTP(如YouTube) | TCP |
因特網電話 | SIP [RFC 3261]、RTP [RFC 3550]、或專用的(如Skype) | UDP或TCP |
Web的應用層協議是超文本傳輸協議(HyperText Transfer Protocol,HTTP),它是Web的核心,在[RFC 1945]和[RFC 2616]中進行了定義。HTTP有兩個程序實現:一個客戶端程序和一個服務器程序。客戶程序和服務器程序運行在不一樣的端系統中,經過交換HTTP報文進行會話。HTTP定義了這些報文的結構以及客戶和服務器進行報文交換的方式。由於HTTP服務器並不保存關於客戶的任何信息,假如某個特定的客戶在短短几秒鐘內兩次請求同一個對象,服務器也響應兩次,將同一個對象重複發送給客戶,因此HTTP是一個無狀態協議。
持續鏈接與非持續鏈接:
客戶和服務器在一個至關長的時間範圍內通訊,其客戶發出一系列請求而且服務器對每一個請求進行響應。這一系列的請求能夠以規則的間隔週期性地或者間斷性地一個接一個發出。當客戶與服務的交互時,每一個請求/響應是經單獨的TCP鏈接發送仍是全部請求即響應都是通過相同的一個TCP鏈接發送。每一個單獨的TCP鏈接被稱爲非持續鏈接,通過相同的一個TCP鏈接被稱爲持續鏈接,持續鏈接在必定時間內沒有發生請求HTTP服務器就會關閉鏈接。HTTP可以使用非持續鏈接也能使用持續鏈接,各有優缺點。
每個HTTP請求都須要通過三次握手創建鏈接傳輸文件,這個過程須要兩次往返時間(RTT),會產生必定的網絡延時。持續鏈接能夠在必定程度上減小這種重複的握手鍊接過程,可是多個請求採用一個TCP鏈接須要等待一個一個的傳輸,在必定程度上能夠減小網絡延時,但也產生了等待執行的時間。持續鏈接相對非持續鏈接在很大程度上減小了服務器的壓力,可是性能問題是由多種因素形成的,量化比較持續鏈接和非持續鏈接對於優化性能很是有必要(《計算機網絡》69頁)參考文獻[Heidemann 1997; Nielsen 1997]。
這就是常說的三次握手過程,這個過程咱們須要重點關注的是往返時間(RTT)和傳輸文件的時間,這也是web開發中優化的重要部分。第一次握手:客服端發起TCP鏈接;第二次握手:服務端響應鏈接;第三次握手:客服端請求文件;接下來就是服務端響應文件請求,開始文件傳輸。
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent:Mozilla/5.0
Accept-language: fr
報文使用普通的ASCII文本書寫的,上面是個請求報文內容總共就5行代碼,每行由一個回車和換行符結束,最後一行後一行後再附加一個回車換行符。第一行叫作請求行,第二行叫作首部行,Connection表示鏈接方式,User-agent用來指明代理,Accept-language表示想得到對象的語法版本。
請求行三個字段:方法字段、URL字段、HTTP版本字段。方法字段可取幾種不一樣的值,包括GET、POST、HEAD、PUT和DELETE。URL字段帶有請求對象的標識(page.html),這裏的版本字段實現的是HTTP/1.1版本。
首部行Host指明瞭對象所在的主機,首部提供的信息是Web代理高速緩存所要求的。其餘的部分再HTTP協議分析博客中具體解析。
請求報文格式:
一個HTTP請求報文由請求行(request line)、請求頭部(header)、空行和請求數據4個部分組成,上圖給出了請求報文的通常格式。能夠看到在最後一行有一個請求數據,請求數據也叫作請求的實體主體,這是請求行中使用POST方法請求才會使用該實體。但不能說POST就是惟一的提交請求數據的惟一方法,GET方法請求能夠在URL中輸入數據https://www.baidu.com/baidu?word=Connection;其中的word=Connection就是一組請求數據,固然還可使用&&鏈接多個請求數據。接着咱們再來看前面的請求示例對應的響應報文:
HTTP/1.1 200 OK Connection: close Date:tue, 09 Aug 2011 15:44:04 GMT Server:Apache/2.2.3(CentOS) Last-Modified:Tue, 09 Aug 2011 15:11:03 GMT Content-length:6821 Content-Type:text/html (data data data data data ...)
響應報文的第一行是狀態行,而後是首部(這裏首部共六行),而後是實體(響應實體)。
狀態行三個字段:協議版本字段、狀態碼字段、相應狀態信息。這裏重點提一下狀態碼和相應狀態信息,而後響應首部到HTTP協議分析博客中具體介紹。下面是一些常見的狀態碼和相關的短語:
最後介紹在window上的網絡請求命令:curl 。這篇博客介紹了curl的用法什麼是curl命令?。
前面提到HTTP服務器是無狀態的,那同時處理數千計甚至更大的訪問時怎麼識別用戶呢?固然你可使用關係型數據庫記錄的用戶標識,若是你不考慮性能的話能夠這麼作。如今HTTP協議有一種存在請求報文上的識別標識,相對來講就好多了,這就是cookie,cookie是由服務端經過HTTP協議和瀏覽器設置在客戶端的一個標識,這個標識能夠設置一些簡單的信息,還能夠設置它的生命週期。
可是cookie並非最佳選擇,由於cookie不安全並且瀏覽器能夠主動設置屏蔽cookie,因此這時候又有了服務端的session,這已經不在HTTP範疇了,後期相關博客具體介紹cookie和session的使用方法再解析。隨着技術的進步,web基於HTTP的無狀態解決方案也愈來愈多,有機會再詳細介紹。
若是本地緩存了用戶某個站點的cookie信息,在用戶每次登入該站點時HTTP報文頭部都會經過cookie頭部行傳送給服務器,服務器經過Set-cookie響應頭部行設置客戶端的cookie。
web緩存器(Web cache)也叫代理服務器(proxy server),它是可以表明初始Web服務器來知足HTTP請求的網絡實體。Web緩存器有本身的磁盤存儲空間,並在存儲空間中保存最近請求過的對象的副本,使得用戶全部HTTP請求首先指向Web緩衝器。下面具體描述客戶端經過web緩存器請求資源的所有通過:
web緩存器經過使用內容分發網絡(Content Distri-bution Network, CDN)實現,CDN公司在因特網上安裝了許多地理上分散的緩衝器,於是使大流量實現本地化。
通過上面的過程描述,web緩存器在響應客戶端請求時就是一個服務器,而在向初始服務器發送請求時就是一個客戶端。這樣的網絡響應方式確定是能夠很大程度的提升響應效率,具體能夠了解(《計算機網絡》75頁)。可是這樣的網絡響應就會存在一個問題,怎麼確保web緩存的副本是最新的最新的資源呢?何時更新web緩存器的副本?
在Web緩存器上,HTTP協議有一種機制,容許緩存器證明它的對象是最新的。這種機制就是get方法,若是請求報文使用get方法,而且請求報文中含有「If-Modified-since:」首部行,那麼這個請求報文就是一個條件get請求報文。下面是是一對Web緩存器的HTTP請求和響應報文:
GET /fruit/kiwi.gif HTTP/1.1 Host:www.exotiquecuisine.com If-Modified-since:web, 7 Sep 2011 09:23:24 //初始服務器響應 HTTP/1.1 304 Not Modified Date: Sat, 15 Oct 2011 15:39:29 Server: Apache/1.3.0 (Unix) (empty entity body)
DNS( Domain Name System)是「域名系統」的英文縮寫,是一種組織成域層次結構的計算機和網絡服務命名系統,它用於TCP/IP網絡,它所提供的服務是用來將主機名和域名轉換爲IP地址的工做。俗話說,DNS就是將網址轉化爲對外的IP地址。
這部分直接拷貝別人的了,對於DNS不是三言兩語就能解釋清楚的,前期學習也不會有太多接觸,有機會在重點解析。有興趣能夠先了解一下這篇文章,我這篇博客的DNS部分的內容也是從這裏拷貝的。一次DNS緩存引起的慘案
一個Web請求通過了HTTP請求到DNS域名解析後就到了向服務器發起正式的資源請求了,HTTP報文通過套字節向網絡發送請求報文,這時候就開始基於TCP協議來進行網絡運輸層的資源交互響應了。
運輸層協議爲運行在不一樣主機上的應用進程之間提供邏輯通訊,從應用程序的角度看,經過邏輯通訊,運行不一樣進程的主機好像直接鏈接同樣。簡單的說就是經過運輸層協議將兩個不一樣的主機和不一樣的進程經過邏輯處理,讓它們相互鏈接進行報文段交付和數據傳輸。
整個運輸層就是從發送端的進程接收報文而後轉換成報文段,而後再將報文段交給網絡層發送到目的地,而後接收端的運輸層拿到報文段交給對應的應用程序進程。這個過程裏面有一個問題值得探討,就是運輸層如何從進程拿到報文,拿到報文後轉換成報文段作了什麼。接收端的運輸層接收到報文段又是如何將報文段交給應用程序進程的。咱們知道一臺主機會有不少個應用程序進程,運輸層如何分辨,將報文段準確無誤的交給對應的應用程序進程。這就是咱們接下來要介紹的:運輸層多路複用與多路分解。
上面咱們介紹了運輸層是在端系統上進行邏輯處理來實現兩個端系統的進程鏈接,那麼就有必要來了解運輸層協議究竟是如何進行邏輯處理的。
上面的運輸層實套接字有些是目的IP地址和目的端口號組成的二元組標識,有些會多包含有源端口IP地址和源端口號的四元組標識,這其中的區別就是下面要解釋的無鏈接和有連接的多路複用和多路分解。
無鏈接的多路複用與多路分解:UDP套接字是由二元組來標識的,因此UDP是無鏈接運輸協議。
有連接的多路複用與多路分解:CTP套接字是由四元組來表示的,因此CTP是有連接運輸協議。
下面是一個TCP運輸的Web請求過程:
因爲運輸層的內部機制和實現原理篇幅很多,並且有很是重要,同時也爲了方便之後查閱,特將這部份內容分別獨立儲出去做爲兩個博客內容,下面是這兩篇博客的鏈接: