web本質

知識內容: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協議中,請求有不少請求方法,其中最爲經常使用的就是GETPOST

 

HTTP默認的請求方法就是GET

注意:

  • 沒有請求體
  • 數據量有限制!
  • GET請求數據會暴露在瀏覽器的地址欄中

GET請求經常使用的操做:
       1. 在瀏覽器的地址欄中直接給出URL,那麼就必定是GET請求
       2. 點擊頁面上的超連接也必定是GET請求
       3. 提交表單時,表單默認使用GET請求,但能夠設置爲POST

 

(3)HTTP響應格式

通常狀況下,服務器接收並處理客戶端發過來的請求後會返回一個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:特定瀏覽器和服務器對URL長度有限制,例如 IE對URL長度的限制是2083字節(2K+35)。對於其餘瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操做系 統的支持。所以對於GET提交時,傳輸數據就會受到URL長度的 限制
  • POST:因爲不是經過URL傳值,理論上數據不受 限。但實際各個WEB服務器會規定對post提交數據大小進行限制,Apache、IIS6都有各自的配置

 

GET和POST的區別:

  • GET提交的數據會放在URL以後,以?分割URL和傳輸數據,參數之間以&相連,POST方法是把提交的數據放在HTTP包的Body中
  • GET提交的數據大小有限制(由於瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制
  • GET方式須要使用Request.QueryString來取得變量的值,而POST方式經過Request.Form來獲取變量的值
  • GET方式提交數據,會帶來安全問題,好比登陸頁面時經過GET方式提交數據時,用戶名和密碼將出如今URL上,若是頁面能夠被緩存或者其餘人能夠訪問這臺機器,就能夠從歷史記錄得到該用戶的帳號和密碼

 

 

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                 字符串             
相關文章
相關標籤/搜索