[轉]HTTP協議通信原理


本文轉自《HTTP協議通信原理》

 

了解HTTP

HTTP(HyperText Transfer Protocol)是一套計算機通過網絡進行通信的規則。計算機專家設計出HTTP,使HTTP客戶(如Web瀏覽器)能夠從HTTP服務器(Web服務器)請求信息和服務。

HTTP 是一個網絡協議,是專門用來幫你傳輸 Web 內容

HTTPS   HTTP 協議”和“SSL/TLS 協議”的組合。

HTTP使用內容類型,是指Web服務器向Web瀏覽器返回的文件都有與之相關的類型。所有這些類型都被模型化,即Web服務器告訴Web瀏覽器該文件所具有的種類,是文檔、GIF格式圖像、聲音文件還是應用程序。它們告訴瀏覽器應該如何處理Web服務器發送過來的各種內容類型。

 

HTTP 和 TCP 之間的關系

TCP 協議是 HTTP 協議的基石——HTTP 協議需要依靠 TCP 協議來傳輸數據。

在網絡分層模型中,TCP 被稱為“傳輸層協議”,而 HTTP 被稱為“應用層協議”。

TCP 被稱為“面向連接”的傳輸層協議。傳輸層主要有兩個協議,分別是 TCP 和 UDP。TCP 比 UDP 更可靠。

有很多常見的應用層協議是以 TCP 為基礎的,比如“FTP、SMTP、POP、IMAP”等。

 

HTTP 協議如何使用 TCP 連接:HTTP 對 TCP 連接的使用,分為兩種方式:俗稱“短連接”和“長連接”(“長連接”又稱“持久連接”,洋文叫做“Keep-Alive”或“Persistent Connection”)

HTTP請求信息和響應信息的格式

請求:

(1)請求行

(2)請求頭信息

(3)請求主題信息(可以沒有)

(4)頭信息結束后和主題信息之間要空一行

請求行又分3部分

請求方法   、請求路徑、所用的協議

請求 方法:GET、POST、PUT、DELETE、TRACE、OPTIONS

狀態碼,狀態文字

狀態碼是用來反服務器響應情況

最常見的如200 OK,404 NOT FOUND

狀態文字是用來描述狀態碼的,便於人觀察。

 

                          HTTP響應中的狀態嗎

狀態碼                           定義                           說明

1xx                                信息                           接收到請求,繼續處理

2xx                                成功                           操作成功的收到,理解和接收

3xx                                重定向                         為了完成請求,必須采取進一部措施

4xx                            客戶端錯誤                      請求的語法有錯誤或不能完全被滿足

5xx                             服務端錯誤                      服務器無法完成明顯有效的請求

 

常見返回值

200       ---服務器成功返回網頁

301/2 ---   永久/臨時重定向

304 Not  ----  未修改                  --取緩存

失敗的狀態碼

404   ---請求的網頁不存在

503   -- 服務器暫時不可用

500 ---服務器內部錯誤

對稱加密和非對稱加密

“對稱加密技術”,意思就是說:“加密”和“解密”使用【相同的】密鑰。

“非對稱加密技術”,意思就是說:“加密”和“解密”使用【不同的】密鑰。

)“非對稱加密”能干的事情比“對稱加密”要多。

                                                    HTTP通信過程

HTTP通信機制是在一次完整的HTTP通信過程中,Web瀏覽器與Web服務器之間將完成下列7個步驟:

1、建立TCP連接

在HTTP工作開始之前,Web瀏覽器首先要通過網絡與Web服務器建立連接,該連接是通過TCP來完成的,該協議與IP協議共同構建Internet,即著名的TCP/IP協議族,因此Internet又被稱作是TCP/IP網絡。HTTP是比TCP更高層次的應用層協議,根據規則,只有低層協議建立之后才能進行更深層協議的連接,因此,首先要建立TCP連接,一般TCP連接的端口號是80。

 

2、Web瀏覽器向Web服務器發送請求命令

一旦建立了TCP連接,Web瀏覽器就會向Web服務器發送請求命令

例如:GET/sample/hello.jsp HTTP/1.1。

 

3、 Web瀏覽器發送請求頭信息

瀏覽器發送其請求命令之后,還要以頭信息的形式向Web服務器發送一些別的信息,之后瀏覽器發送了一空白行來通知服務器,它已經結束了該頭信息的發送。

 

4、Web服務器應答

客戶機向服務器發出請求后,服務器會客戶機回送應答,

HTTP/1.1 200 OK

應答的第一部分是協議的版本號和應答狀態碼。

5、Web服務器發送應答頭信息

正如客戶端會隨同請求發送關於自身的信息一樣,服務器也會隨同應答向用戶發送關於它自己的數據及被請求的文檔。

 

6、Web服務器向瀏覽器發送數據

Web服務器向瀏覽器發送頭信息后,它會發送一個空白行來表示頭信息的發送到此為結束,接着,它就以Content-Type應答頭信息所描述的格式發送用戶所請求的實際數據。

 

7、Web服務器關閉TCP連接

一般情況下,一旦Web服務器向瀏覽器發送了請求數據,它就要關閉TCP連接,然后如果瀏覽器或者服務器在其頭信息加入了這行代碼

Connection:keep-alive

TCP連接在發送后將仍然保持打開狀態,於是,瀏覽器可以繼續通過相同的連接發送請求。保持連接節省了為每個請求建立新連接所需的時間,還節約了網絡帶寬。

                                               HTTP請求格式

當瀏覽器向Web服務器發出請求時,它向服務器傳遞了一個數據塊,也就是請求信息,HTTP請求信息由3部分組成:

  • 請求方法URI協議/版本

  • 請求頭(Request Header)

  • 空行

  • 請求正文

下面是一個HTTP請求的例子:

1GET/sample.jspHTTP/1.1
2Accept:image/gif.image/jpeg,*/* 3Accept-Language:zh-cn 4Connection:Keep-Alive 5Host:localhost 6User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0) 7Accept-Encoding:gzip,deflate 8username=jinqiao&password=1234 

請求方法URI協議/版本

請求的第一行是“方法URL議/版本”:GET/sample.jsp HTTP/1.1

以上代碼中“GET”代表請求方法,“/sample.jsp”表示URI,“HTTP/1.1代表協議和協議的版本。

URL完整地指定了要訪問的網絡資源,通常只要給出相對於服務器的根目錄的相對目錄即可,因此總是以“/”開頭,最后,協議版本聲明了通信過程中使用HTTP的版本。

 

請求頭(Request Header)

請求頭包含許多有關的客戶端環境和請求正文的有用信息。例如,請求頭可以聲明瀏覽器所用的語言,請求正文的長度等。

1Accept:image/gif.image/jpeg.*/* 2Accept-Language:zh-cn 3Connection:Keep-Alive 4Host:localhost 5User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0) 6Accept-Encoding:gzip,deflate.

 

請求正文

請求頭和請求正文之間是一個空行,這個行非常重要,它表示請求頭已經結束,接下來的是請求正文。請求正文中可以包含客戶提交的查詢字符串信息:

username=jinqiao&password=1234

在以上的例子的HTTP請求中,請求的正文只有一行內容。當然,在實際應用中,HTTP請求正文可以包含更多的內容。

                                                      HTTP請求方法

 

方法

          描述

GET

客戶端請求指定資源信息,服務器返回指定資源

HEAO

只請求響應報文中的HTTP首部

POST

將客戶端的數據提交到服務器

PUT

用從客戶端向服務器傳送的數據取代指定文檔內容

DELETE

請求服務器刪除Request-URI所表示的資源

MOVE

請求服務器將指定的頁面移至另一個網絡地址

 

這里只討論GET方法與POST方法。

GET方法

GET方法是默認的HTTP請求方法,我們日常用GET方法來提交表單數據,然而用GET方法提交的表單數據只經過了簡單的編碼,同時它將作為URL的一部分向Web服務器發送,因此,如果使用GET方法來提交表單數據就存在着安全隱患上。

 

例如:Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB

從上面的URL請求中,很容易就可以辯認出表單提交的內容。(?之后的內容)另外由於GET方法提交的數據是作為URL請求的一部分所以提交的數據量不能太大。

POST方法

POST方法是GET方法的一個替代方法,它主要是向Web服務器提交表單數據,尤其是大批量的數據。POST方法克服了GET方法的一些缺點。通過POST方法提交表單數據時,數據不是作為URL請求的一部分而是作為標准數據傳送給Web服務器,這就克服了GET方法中的信息無法保密和數據量太小的缺點。因此,出於安全的考慮以及對用戶隱私的尊重,通常表單提交時采用POST方法。

從編程的角度來講,如果用戶通過GET方法提交數據,則數據存放在QUERY_STRING環境變量中,而POST方法提交的數據則可以從標准輸入流中獲取。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM