網站首頁 編程語言 正文
我們日常生活中經常會使用瀏覽器訪問Web站點這個過程中到底發生了什么嗎?為什么我們在瀏覽器地址欄上面輸入要訪問的URL后就可以訪問到Web頁面呢?這幾乎是面試過程中的高頻問題。
簡單來說,當我們在瀏覽器地址欄上輸入要訪問的URL后,瀏覽器會分析出URL上面的域名,然后通過DNS服務器查詢出域名映射的IP地址,瀏覽器根據查詢到的IP地址與Web服務器進行通信,而通信的協議就是HTTP協議,以下就給大家詳細介紹HTTP協議。
一、HTTP簡介
1、簡介
HTTP超文本傳輸協議(HyperText Transfer Protocol)是一種用于分布式、協作式和超媒體信息系統的應用層協議。HTTP是萬維網的數據通信的基礎。是一個屬于應用層的面向對象的協議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統。它于1990年提出,經過幾年的使用與發展,得到不斷地完善和擴展,目前在WWW中使用的是HTTP/1.0的第六版。
2、HTTP協議特點
HTTP協議的主要特點可概括如下:
- 1.支持客戶/服務器模式。
- 2.簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定 了客戶與服務器聯系的類型不同。由于HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
- 3.靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
- 4.無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。
- 5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對于事務處理沒有記憶能力。缺少狀態意味著如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
3、作用
我們可以把這個HTTP通信過程類比成一個電話對話。當我們要打電話給某個人,首先要知道對方的電話號碼,然后進行撥號。打通電話后我們會進行對話,當然要對話肯定需要共同的語言,如果一個人說國語,而另一個人說英語,那肯定不能進行溝通。電話號碼相當于上面的IP地址,而共同語言相當于HTTP協議。
4、工作原理
(1) 客戶端連接到Web服務器
一個HTTP客戶端,通常是瀏覽器,與Web服務器的HTTP端口(默認為80)建立一個TCP套接字連接。例如,http://www.oakcms.cn。?
(2) 發送HTTP請求
通過TCP套接字,客戶端向Web服務器發送一個文本的請求報文,一個請求報文由請求行、請求頭部、空行和請求數據4部分組成。
(3) 服務器接受請求并返回HTTP響應
Web服務器解析請求,定位請求資源。服務器將資源復本寫到TCP套接字,由客戶端讀取。一個響應由狀態行、響應頭部、空行和響應數據4部分組成。
(4) 釋放連接TCP連接
若connection 模式為close,則服務器主動關閉TCP連接,客戶端被動關閉連接,釋放TCP連接;若connection 模式為keepalive,則該連接會保持一段時間,在該時間內可以繼續接收請求;
(5) 客戶端瀏覽器解析HTML內容
客戶端瀏覽器首先解析狀態行,查看表明請求是否成功的狀態代碼。然后解析每一個響應頭,響應頭告知以下為若干字節的HTML文檔和文檔的字符集。客戶端瀏覽器讀取響應數據HTML,根據HTML的語法對其進行格式化,并在瀏覽器窗口中顯示。
二、HTTP協議介紹
1、HTTP協議之URI
HTTP使用統一資源標識符
(Uniform Resource Identifiers, URI)來傳輸數據和建立連接。URL是一種特殊類型的URI,包含了用于查找某個資源的足夠的信息
URL,全稱是Uniform Resource Locator, 中文叫統一資源定位符
,是互聯網上用來標識某一處資源的地址。以下面這個URL為例,介紹下普通URL的各部分組成:
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
從上面的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”。參數可以允許有多個參數,參數與參數之間用“&”作為分隔符。
2、HTTP協議之請求
組成:
1.請求行
2.若干“頭部行”
3.實體主體(通常不用)
第一部分:請求行
GET /js/an.js HTTP/1.1? ? ? ? ? ? ? ?
GET說明請求類型為GET,[js/an.js]為要訪問的資源,該行的最后一部分說明使用的是HTTP1.1版本。
第二部分:請求頭部
Accept:?*/*????????????????????????????????????#可接受的媒體類型???? Accept-Encoding:?gzip,?deflate????#可接受的編碼???? Accept-Language:?zh-cn??????????????#接受的語言???? Connection:?Keep-Alive???????????????#持久連接???? Host:?cache.soso.com?????????????????#Host???? Referer:?http://help.soso.com/?????#引用頁面???? User-Agent:?Mozilla/4.0?(compatible;?MSIE?6.0;?Windows?NT?5.1;?SV1;?.NET?CLR?2.0.50727;?InfoPath.2)??????????#用戶代理
注意:實體主體沒有,也必須要有空行。
3、HTTP協議之響應
(1)響應報文結構
在接收和解釋請求消息后,服務器返回一個HTTP響應消息。
響應報文的開始行是狀態行:狀態行包括三項內容,即 HTTP 的版本,狀態碼,以及解釋狀態碼的簡單短語。
HTTP響應也是由三個部分組成,分別是:狀態行、頭部行、響應正文。
(2)狀態碼? ??
狀態代碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值:?
1xx :表示通知信息的,如請求收到了或正在進行處理。
2xx:表示成功,如接受或知道了。
3xx :表示重定向,表示要完成請求還必須采取進一步的行動。
4xx :表示客戶端的差錯,如請求中有錯誤的語法或不能完成。
5xx :表示服務器的差錯,如服務器失效無法完成請求。
(3)常見狀態碼? ? ??
200?OK??//客戶端請求成功 400?Bad?Request??//客戶端請求有語法錯誤,不能被服務器所理解 401?Unauthorized?//請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用 403?Forbidden?//服務器收到請求,但是拒絕提供服務 404 Not Found //請求資源不存在,eg:輸入了錯誤的URL 500?Internal?Server?Error??//服務器發生不可預期的錯誤 503?Server?Unavailable??//服務器當前不能處理客戶端的請求,一段時間后可能恢復正常
三、HTTP連接類型
1、連接類型
HTTP既可以使用非持久連接(nonpersistent connection),也可以使用持久連接(persistent connection)。HTTP/1.0使用非持久連接,HTTP/1.1默認使用持久連接。? ? ?
持久連接情況下,服務器在發出響應后讓TCP連接繼續打開著。同一對客戶/服務器之間的后續請求和響應可以通過這個連接發送。
持久連接分為不帶流水線(without pipelining)和帶流水線(with pipelining)兩個版本。如果是不帶流水線的版本,那么客戶只在收到前一個請求的響應后才發出新的請求。
2、區別
流水線方式和非流水線方式的區別:
流水線方式指沒有收到上一個請求的對象就發送新的對象的請求
非流水線方式指必須要等到上一個請求的對象到達之后再發送新的對象的請求
原文鏈接:https://www.cnblogs.com/chenyablog/p/15191847.html
相關推薦
- 2023-06-21 Python中sorted()用法案例代碼_python
- 2022-04-09 Mybatis-Plus中dao層、service封裝的方法
- 2023-07-04 LinkedBlockingQueue與ArrayBlockingQueue對比
- 2022-02-18 微信小程序----------父組件調用子組件的方法
- 2023-04-26 Numpy對于NaN值的判斷方法_python
- 2022-05-12 小程序滾動穿透解決方案
- 2023-10-27 np.array()函數的使用方法_python
- 2023-04-12 Python批量刪除txt文本指定行的思路與代碼_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支