1. 程式人生 > >網路程式設計-HTTP協議-請求

網路程式設計-HTTP協議-請求

HTTP協議是Hyper Text Transfer Protocol(超文字傳輸協議)的縮寫,是用於從全球資訊網(WWW:World Wide Web )伺服器傳輸超文字到本地瀏覽器的傳送協議。 HTTP是一個基於TCP/IP通訊協議來傳遞資料(HTML 檔案, 圖片檔案, 查詢結果等)。 HTTP是一個屬於應用層的面向物件的協議,由於其簡捷、快速的方式,適用於分散式超媒體資訊系統。它於1990年提出,經過幾年的使用與發展,得到不斷地完善和擴充套件。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規範化工作正在進行之中,而且HTTP-NG(Next Generation of HTTP)的建議已經提出。
HTTP協議工作於客戶端-服務端架構為上。瀏覽器作為HTTP客戶端通過URL向HTTP服務端即WEB伺服器傳送所有請求。Web伺服器根據接收到的請求後,向客戶端傳送響應資訊。 http請求-響應模型.jpg

HTTP使用統一資源識別符號(Uniform Resource Identifiers, URI)來傳輸資料和建立連線。URL是一種特殊型別的URI,包含了用於查詢某個資源的足夠的資訊 URL,全稱是UniformResourceLocator, 中文叫統一資源定位符,是網際網路上用來標識某一處資源的地址。以下面這個URL為例,介紹下普通URL的各部分組成:
從上面的URL可以看出,一個完整的URL包括以下幾部分:1.協議部分:該URL的協議部分為“http:”,這代表網頁使用的是HTTP協議。在Internet中可以使用多種協議,如HTTP,FTP等等本例中使用的是HTTP協議。在"HTTP"後面的“//”為分隔符 2.域名部分:該URL的域名部分為“www.aspxfans.com”。一個URL中,也可以使用IP地址作為域名使用 3.埠部分:跟在域名後面的是埠,域名和埠之間使用“:”作為分隔符。埠不是一個URL必須的部分,如果省略埠部分,將採用預設埠 4.虛擬目錄部分:從域名後的第一個“/”開始到最後一個“/”為止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。本例中的虛擬目錄是“/news/”
5.檔名部分:從域名後的最後一個“/”開始到“?”為止,是檔名部分,如果沒有“?”,則是從域名後的最後一個“/”開始到“#”為止,是檔案部分,如果沒有“?”和“#”,那麼從域名後的最後一個“/”開始到結束,都是檔名部分。本例中的檔名是“index.asp”。檔名部分也不是一個URL必須的部分,如果省略該部分,則使用預設的檔名 6.錨部分:從“#”開始到最後,都是錨部分。本例中的錨部分是“name”。錨部分也不是一個URL必須的部分 7.引數部分:從“?”開始到“#”為止之間的部分為引數部分,又稱搜尋部分、查詢部分。本例中的引數部分為“boardID=5&ID=24618&page=1”。引數可以允許有多個引數,引數與引數之間用“&”作為分隔符。 一般情況下,伺服器接收並處理客戶端發過來的請求後會返回一個HTTP的響應訊息。 第一行為狀態行,(HTTP/1.1)表明HTTP版本為1.1版本,狀態碼為200,狀態訊息為(ok) 第二行和第三行為訊息報頭,Date:生成響應的日期和時間;Content-Type:指定了MIME型別的HTML(text/html),編碼型別是UTF-8 空行後面的html部分為響應正文。 狀態程式碼有三位數字組成,第一個數字定義了響應的類別,共分五種類別: 常見狀態碼: 更多狀態碼http://www.runoob.com/http/http-status-codes.html 根據HTTP標準,HTTP請求可以使用多種請求方法。HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。 HTTP協議定義Web客戶端如何從Web伺服器請求Web頁面,以及伺服器如何把Web頁面傳送給客戶端。HTTP協議採用了請求/響應模型。客戶端向伺服器傳送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求資料。伺服器以一個狀態行作為響應,響應的內容包括協議的版本、成功或者錯誤程式碼、伺服器資訊、響應頭部和響應資料。 以下是 HTTP 請求/響應的步驟: 一個HTTP客戶端,通常是瀏覽器,與Web伺服器的HTTP埠(預設為80)建立一個TCP套接字連線。例如,http://www.oakcms.cn。 通過TCP套接字,客戶端向Web伺服器傳送一個文字的請求報文,一個請求報文由請求行、請求頭部、空行和請求資料4部分組成。 Web伺服器解析請求,定位請求資源。伺服器將資源複本寫到TCP套接字,由客戶端讀取。一個響應由狀態行、響應頭部、空行和響應資料4部分組成。 若connection 模式為close,則伺服器主動關閉TCP連線,客戶端被動關閉連線,釋放TCP連線;若connection 模式為keepalive,則該連線會保持一段時間,在該時間內可以繼續接收請求; 客戶端瀏覽器首先解析狀態行,查看錶明請求是否成功的狀態程式碼。然後解析每一個響應頭,響應頭告知以下為若干位元組的HTML文件和文件的字符集。客戶端瀏覽器讀取響應資料HTML,根據HTML的語法對其進行格式化,並在瀏覽器視窗中顯示。 例如:在瀏覽器位址列鍵入URL,按下回車之後會經歷以下流程: 1、瀏覽器向 DNS 伺服器請求解析該 URL 中的域名所對應的 IP 地址; 2、解析出 IP 地址後,根據該 IP 地址和預設埠 80,和伺服器建立TCP連線; 3、瀏覽器發出讀取檔案(URL 中域名後面部分對應的檔案)的HTTP 請求,該請求報文作為 TCP 三次握手的第三個報文的資料傳送給伺服器; 4、伺服器對瀏覽器請求作出響應,並把對應的 html 文字傳送給瀏覽器; 5、釋放 TCP連線; 6、瀏覽器將該 html 文字並顯示內容; 注意最後一行是空行 1、GET提交,請求的資料會附在URL之後(就是把資料放置在HTTP協議頭中),以?分割URL和傳輸資料,多個引數用&連線;例 如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果資料是英文字母/數字,原樣傳送,如果是空格,轉換為+,如果是中文/其他字元,則直接把字串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號以16進製表示的ASCII。 POST提交:把提交的資料放置在是HTTP包的包體中。上文示例中紅色字型標明的就是實際的傳輸資料 2、傳輸資料的大小:首先宣告:HTTP協議沒有對傳輸的資料大小進行限制,HTTP協議規範也沒有對URL長度進行限制。 而在實際開發中存在的限制主要有: GET:特定瀏覽器和伺服器對URL長度有限制,例如 IE對URL長度的限制是2083位元組(2K+35)。對於其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操作系 統的支援。 因此對於GET提交時,傳輸資料就會受到URL長度的 限制。 POST:由於不是通過URL傳值,理論上資料不受 限。但實際各個WEB伺服器會規定對post提交資料大小進行限制,Apache、IIS6都有各自的配置。 3、安全性