知識內容:html
1.網絡協議複習web
2.模擬web瀏覽器
3.web本質總結緩存
參考:安全
http://www.cnblogs.com/wupeiqi/articles/5237672.html服務器
http://www.cnblogs.com/haiyan123/p/7695133.html網絡
http://www.cnblogs.com/wyb666/p/9014857.html架構
1、網絡協議複習app
1.HTTP協議框架
(1)HTTP特色
1 HTTP協議屬於應用層,並工做於客戶端-服務端架構上 2 3 HTTP協議是用於從服務器傳輸超文本到本地瀏覽器的傳送協議 4 5 HTTP是一個基於TCP/IP通訊協議來傳遞數據的協議 6 7 瀏覽器做爲HTTP客戶端經過URL向HTTP服務端即WEB服務器發送全部請求。Web服務器根據接收到的請求後,向客戶端發送響應 8 9 簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑;因爲HTTP協議簡單,使得HTTP服務器的程序規模小,於是通訊速度快 10 11 靈活:HTTP容許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記 12 13 無鏈接:無鏈接的含義是限制每次鏈接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開鏈接。採用這種方式能夠節省傳輸時間 14 15 無狀態:無狀態是指協議對於事務處理沒有記憶能力。缺乏狀態意味着若是後續處理須要前面的信息,則它必須重傳,這樣可能致使每次鏈接傳送的數據量增大。另外一方面,在服務器不須要先前信息時它的應答就較快
HTTP協議流程以下圖:
(2)HTTP請求格式
請求首行; // 請求方式 請求路徑 協議和版本,例如:GET /index.html HTTP/1.1 請求頭信息; // 請求頭名稱:請求頭內容,即爲key:value格式,例如:Host:localhost 空行; // 用來與請求體分隔開 請求體。 // GET沒有請求體,只有POST有請求體。
瀏覽器發送給服務器的內容就這個格式的,若是不是這個格式服務器將沒法解讀!在HTTP協議中,請求有不少請求方法,其中最爲經常使用的就是GET和POST
HTTP默認的請求方法就是GET
注意:
GET請求經常使用的操做:
1. 在瀏覽器的地址欄中直接給出URL,那麼就必定是GET請求
2. 點擊頁面上的超連接也必定是GET請求
3. 提交表單時,表單默認使用GET請求,但能夠設置爲POST
(3)HTTP響應格式
通常狀況下,服務器接收並處理客戶端發過來的請求後會返回一個HTTP的響應消息。
HTTP響應也由四個部分組成,分別是:狀態行、消息報頭、空行和響應正文。
關於響應狀態碼:
狀態代碼有三位數字組成,第一個數字定義了響應的類別,共分五種類別: 1xx:指示信息--表示請求已接收,繼續處理 2xx:成功--表示請求已被成功接收、理解、接受 3xx:重定向--要完成請求必須進行更進一步的操做 4xx:客戶端錯誤--請求有語法錯誤或請求沒法實現 5xx:服務器端錯誤--服務器未能實現合法的請求 常見狀態碼: 200 OK //客戶端請求成功 400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解 401 Unauthorized //請求未經受權,這個狀態代碼必須和WWW-Authenticate報頭域一塊兒使用 403 Forbidden //服務器收到請求,可是拒絕提供服務 404 Not Found //請求資源不存在,eg:輸入了錯誤的URL 500 Internal Server Error //服務器發生不可預期的錯誤 503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常
(4)GET和POST請求的區別
GET請求 GET /books/?sex=man&name=Professional HTTP/1.1 Host: www.wrox.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Connection: Keep-Alive 注意最後一行是空行 POST請求 POST / HTTP/1.1 Host: www.wrox.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Content-Type: application/x-www-form-urlencoded Content-Length: 40 Connection: Keep-Alive name=Professional%20Ajax&publisher=Wiley
GET提交,請求的數據會附在URL以後(就是把數據放置在HTTP協議頭中)
POST提交:把提交的數據放置在是HTTP包的包體中。上文示例中紅色字體標明的就是實際的傳輸數據
所以,GET提交的數據會在地址欄中顯示出來,而POST提交,地址欄不會改變
傳輸數據的大小:首先聲明:HTTP協議沒有對傳輸的數據大小進行限制,HTTP協議規範也沒有對URL長度進行限制。
而在實際開發中存在的限制主要有:
GET和POST的區別:
2.TCP協議和UDP協議
(1)TCP
TCP是一種面向鏈接的、可靠的、基於字節流的傳輸層通訊協議
TCP的特性: 有序性、真確性、可靠性、可控性,TCP使用面向鏈接的方式收發數據,在收發數據以前需創建鏈接,在數據傳輸以後釋放鏈接,創建鏈接時採用3次握手的方式來保證發送的可靠性、可控性
在雙方成功握手以後將在兩個應用程序之間創建一個全雙工的通訊,這個全雙工通訊將佔用兩個計算機之間的通訊線路,直到它被一方關閉或雙方關閉爲止
全雙工:雙方能夠收發消息,接受消息
應用:web瀏覽器、電子郵件、文件傳輸
(2)UDP
UDP是一種無鏈接的傳輸層協議,提供面向對象的簡單的不可靠信息傳送服務,雖然UDP不可靠,可是因爲UDP的開銷小通常UDP適用於吞吐量大(輕量級控制)、能夠承受信息丟失(傳輸不可靠)的應用場景。並且在網絡情況良好的狀況下,UDP的丟包率在實際狀況下也很是少,因此有不少經典的協議採用UDP進行傳輸,好比SNMP、NFS、DNS等
應用:域名系統(DNS)、視頻流
(3)TCP與UDP
TCP---傳輸控制協議,提供的是面向鏈接、可靠的字節流服務。當客戶和服務器彼此交換數據前,必須先在雙方之間創建一個TCP鏈接,以後才能傳輸數據。TCP提供超時重發,丟棄重複數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另外一端。
UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,可是並不能保證它們能到達目的地。因爲UDP在傳輸數據報前不用在客戶和服務器之間創建一個鏈接,且沒有超時重發等機制,故而傳輸速度很快
2、模擬web
1.WEB應用(網站)
Http協議:
發送:
POST /index HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36
HTTPS: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie: csrftoken=hNmu2JOtntGMN0hSRSPmMQk2newEb3o8zb6pXW5Cc3m54IaA5VlTkUvqWsFezpni
p=123
響應:
200 OK
Cache-Control:public, max-age=15
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html; charset=utf-8
Date:Wed, 14 Jun 2017 01:21:17 GMT
Expires:Wed, 14 Jun 2017 01:21:33 GMT
Last-Modified:Wed, 14 Jun 2017 01:21:03 GMT
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Frame-Options:SAMEORIGIN
X-UA-Compatible:IE=10
瀏覽器解析響應而後用戶在頁面看到內容(字符串)
2.以博客園爲例
瀏覽器(socket客戶端)
2. www.cnblogs.com(42.121.252.58,80)
sk.socket()
sk.connect((42.121.252.58,80))
sk.send('我想要xx')
5. 接收
6. 鏈接斷開
博客園(socket服務端)
1. 監聽ip和端口(42.121.252.58,80)
while True:
用戶 = 等待用戶鏈接
3. 收到'我想要xx'
4. 響應:「好」
用戶已斷開
3.模擬web
模擬訪問網頁:運行下列代碼,在瀏覽器中輸入http://localhost:8000/並回車將看到Hello, Seven
1 import socket 2 3 4 # 處理請求: 5 def handle_request(client): 6 buf = client.recv(1024) 7 client.send(b"HTTP/1.1 200 OK\r\n\r\n") 8 client.send(b"Hello, Seven") 9 10 11 def main(): 12 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 13 # 監聽網絡 14 sock.bind(('localhost', 8000)) 15 sock.listen(5) 16 17 while True: 18 # 等待鏈接 19 connection, address = sock.accept() 20 handle_request(connection) 21 connection.close() 22 23 24 if __name__ == '__main__': 25 main()
3、web本質總結
web框架的本質說簡單點就是socket服務端與瀏覽器之間的通訊
1 1. Http,無狀態,短鏈接 2 3 2. 客戶端與服務端 4 瀏覽器至關於socket客戶端 5 網站至關於socket服務端 6 7 3. 寫網站,主要是寫3部分: 8 a. socket服務端 9 b. 根據URL不一樣返回不一樣的內容 10 路由系統:URL -> 函數 11 c. 字符串返回給用戶 12 模板引擎渲染: 13 HTML充當模板(特殊字符) 14 本身創造任意數據 15 字符串