B/S 結(jié)構(gòu)定義
瀏覽器-服務(wù)器(Browser/Server)結(jié)構(gòu)昨寞,簡稱B/S結(jié)構(gòu),與C/S結(jié)構(gòu)不同儡首,其客戶端不需要安裝專門的軟件毕莱,只需要瀏覽器即可器贩,瀏覽器通過Web服務(wù)器與數(shù)據(jù)庫進行交互,可以方便的在不同平臺下工作朋截;服務(wù)器端可采用高性能計算機蛹稍,并安裝Oracle、Sybase部服、Informix等大型數(shù)據(jù)庫唆姐。B/S結(jié)構(gòu)簡化了客戶端的工作,它是隨著Internet技術(shù)興起而產(chǎn)生的廓八,對C/S技術(shù)的改進奉芦,但該結(jié)構(gòu)下服務(wù)器端的工作較重,對服務(wù)器的性能要求更高剧蹂∩Γ—— 維基百科
URI (統(tǒng)一資源標(biāo)志符)
在電腦術(shù)語中,統(tǒng)一資源標(biāo)識符(英語:Uniform Resource Identifier宠叼,或URI)是一個用于標(biāo)識某一互聯(lián)網(wǎng)資源名稱的字符串先巴。 該種標(biāo)識允許用戶對網(wǎng)絡(luò)中(一般指萬維網(wǎng))的資源通過特定的協(xié)議進行交互操作。URI的最常見的形式是統(tǒng)一資源定位符(URL)车吹,經(jīng)常指定為非正式的網(wǎng)址筹裕。更罕見的用法是統(tǒng)一資源名稱(URN)醋闭,其目的是通過提供一種途徑窄驹。用于在特定的命名空間資源的標(biāo)識,以補充網(wǎng)址证逻±植海—— 維基百科
URI 文法
URI文法由URI協(xié)議名(例如“
http
”,“ftp
”,“mailto
”或“file
”)丈咐,一個冒號瑞眼,和協(xié)議對應(yīng)的內(nèi)容所構(gòu)成。特定的協(xié)議定義了協(xié)議內(nèi)容的語法和語義棵逊,而所有的協(xié)議都必須遵循一定的URI文法通用規(guī)則伤疙,亦即為某些專門目的保留部分特殊字符×居埃—— 維基百科
下面展示了 URI 例子及它們的組成部分:
權(quán)限 路徑
┌───────────────┴───────────────┐┌───┴────┐
abc://username:password@example.com:123/path/data?key=value&key2=value2#fragid1
└┬┘ └───────┬───────┘ └────┬────┘ └┬┘ └─────────┬─────────┘ └──┬──┘
協(xié)議 用戶信息 主機名 端口 查詢參數(shù) 片段
MIME
MIME(Multipurpose Internet Mail Extensions)多用途互聯(lián)網(wǎng)郵件擴展類型徒像。是設(shè)定某種擴展名的文件用一種應(yīng)用程序來打開的方式類型,當(dāng)該擴展名文件被訪問的時候蛙讥,瀏覽器會自動使用指定應(yīng)用程序來打開锯蛀。多用于指定一些客戶端自定義的文件名,以及一些媒體文件打開方式次慢。 —— 百度百科
文件格式
每個 MIME 類型由兩部分組成旁涤,前面是數(shù)據(jù)的大類別,例如聲音audio迫像、圖象image等劈愚,后面定義具體的種類。
常見的 MIME 類型有:
資源名稱 | 后綴 | 類型 |
---|---|---|
超文本標(biāo)記語言文本 | .html | text/html |
xml文檔 | .xml | text/xml |
普通文本 | .txt | text/plain |
PNG圖像 | .png | image/png |
PDF文檔 | application/pdf |
了解更多的 MIME 類型 - 互聯(lián)網(wǎng)媒體類型
HTTP 協(xié)議
超文本傳輸協(xié)議(英文:HyperText Transfer Protocol闻妓,縮寫:HTTP)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議造虎。設(shè)計HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁面的方法。通過HTTP或者HTTPS協(xié)議請求的資源由統(tǒng)一資源標(biāo)識符(Uniform Resource Identifiers纷闺,URI)來標(biāo)識算凿。—— 維基百科
HTTP 協(xié)議是基于請求與響應(yīng)犁功,具體如下圖所示:
HTTP 協(xié)議主要特點
- 簡單快速:當(dāng)客戶端向服務(wù)器端發(fā)送請求時氓轰,只是簡單的填寫請求路徑和請求方法即可,然后就可以通過瀏覽器或其他方式將該請求發(fā)送就行了
- 靈活:HTTP 協(xié)議允許客戶端和服務(wù)器端傳輸任意類型任意格式的數(shù)據(jù)對象
- 無連接:無連接的含義是限制每次連接只處理一個請求浸卦。服務(wù)器處理完客戶的請求署鸡,并收到客戶的應(yīng)答后,即斷開連接限嫌,采用這種方式可以節(jié)省傳輸時間靴庆。(當(dāng)今多數(shù)服務(wù)器支持Keep-Alive功能怒医,使用服務(wù)器支持長連接焰薄,解決無連接的問題)
- 無狀態(tài):無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力,服務(wù)器不知道客戶端是什么狀態(tài)。即客戶端發(fā)送HTTP請求后,服務(wù)器根據(jù)請求啡省,會給我們發(fā)送數(shù)據(jù),發(fā)送完后,不會記錄信息。(使用 cookie 機制可以保持 session劲赠,解決無狀態(tài)的問題)
HTTP 請求報文
HTTP 請求報文由請求行、請求頭、空行 和 請求體(請求數(shù)據(jù)) 4 個部分組成轧叽,如下圖所示:
請求報文示例
GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,id;q=0.4
Cookie: PSTM=1490844191; BIDUPSID=2145FF54639208435F60E1E165379255; BAIDUID=CFA344942EE2E0EE081D8B13B5C847F9:FG=1;
請求行
請求行由請求方法待逞、URL 和 HTTP 協(xié)議版本組成识樱,它們之間用空格分開垢村。
GET / HTTP/1.1
請求頭
請求頭由 key-value
對組成,每行一對,key (鍵) 和 value (值)用英文冒號 :
分隔抚芦。請求頭通知服務(wù)器有關(guān)于客戶端請求的信息烙常,典型的請求頭有:
- User-Agent:用戶代理信息 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 ...
- Accept:客戶端可識別的內(nèi)容類型列表 - text/html,application/xhtml+xml,application/xml
- Accept-Language:客戶端可接受的自然語言 - zh-CN,zh;q=0.8,en;q=0.6,id;q=0.4
- Accept-Encoding:客戶端可接受的編碼壓縮格式 - gzip, deflate, sdch, br
- Host:請求的主機名挣棕,允許多個域名同處一個IP地址亲桥,即虛擬主機 -
www.baidu.com
- connection:連接方式
- close:告訴WEB服務(wù)器或代理服務(wù)器厅目,在完成本次請求的響應(yīng)后番枚,斷開連接
- keep-alive:告訴WEB服務(wù)器或代理服務(wù)器。在完成本次請求的響應(yīng)后损敷,保持連接葫笼,以等待后續(xù)請求
- Cookie:存儲于客戶端擴展字段,向同一域名的服務(wù)端發(fā)送屬于該域的cookie - PSTM=1490844191; BIDUPSID=2145FF54639208435F60E1E165379255;
空行
最后一個請求頭之后是一個空行拗馒,發(fā)送回車符和換行符路星,通知服務(wù)器以下不再有請求頭。
請求體
請求數(shù)據(jù)不在 GET 方法中使用诱桂,而是在 POST 方法中使用洋丐。與請求數(shù)據(jù)相關(guān)的最常使用的請求頭是 Content-Type和 Content-Length辆雾。
HTTP 響應(yīng)報文
HTTP響應(yīng)報文由狀態(tài)行保檐、響應(yīng)頭、空行和響應(yīng)體4 個部分組成诈悍,如下圖所示:
響應(yīng)報文示例
HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Thu, 30 Mar 2017 12:28:00 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Cache-Control: private
Expires: Thu, 30 Mar 2017 12:27:43 GMT
Set-Cookie: BDSVRTM=0; path=/
狀態(tài)行
狀態(tài)行格式: HTTP-Version Status-Code Reason-Phrase CRLF
- HTTP-Version - HTTP 協(xié)議版本
- Status-Code - 狀態(tài)碼
- Reason-Phrase - 狀態(tài)碼描述
- CRLF - 回車/換行符
響應(yīng)頭
響應(yīng)頭由 key-value
對組成触菜,每行一對九榔,key (鍵) 和 value (值)用英文冒號 :
分隔。響應(yīng)頭域允許服務(wù)器傳遞不能放在狀態(tài)行的附加信息涡相,這些域主要描述服務(wù)器的信息和Request-URI進一步的信息哲泊,典型的響應(yīng)頭有:
- Server:包含處理請求的原始服務(wù)器的軟件信息
- Date:服務(wù)器日期
- Content-Type:返回的資源類型 (MIME)
- Connection:連接方式
- close:連接已經(jīng)關(guān)閉
- keep-alive:連接已保持,在等待本次連接的后續(xù)請求
- Cache-Control:緩存控制
- Expires:設(shè)置過期時間
- Set-Cookie:設(shè)置 Cookie 信息
空行
最后一個響應(yīng)頭之后是一個空行催蝗,發(fā)送回車符和換行符切威,通知瀏覽器以下不再有響應(yīng)頭。
響應(yīng)體
服務(wù)器返回給瀏覽器的響應(yīng)信息丙号,下面是百度首頁的響應(yīng)體片段:
<!DOCTYPE html>
<!--STATUS OK-->
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<link rel="icon" sizes="any" mask >
<title>百度一下先朦,你就知道</title>
</head>
<body>
...
</body>
</html>
HTTP Methods
HTTP 協(xié)議的請求方法有:GET、POST犬缨、HEAD喳魏、PUT、DELETE怀薛、OPTIONS刺彩、TRACE、CONNECT、PATCH创倔、HEAD
HTTP 常用的請求方法:
- GET - 獲取資源嗡害,使用 URL 方式傳遞參數(shù),大小為 2KB
-
http://www.example.com/users
- 獲取所有用戶
-
- POST - 傳輸資源畦攘,HTTP Body, 大小默認8M
-
http://www.example.com/users/a-unique-id
- 新增用戶
-
- PUT - 資源更新
-
http://www.example.com/users/a-unique-id
- 更新用戶
-
- DELETE - 刪除資源
-
http://www.example.com/users/a-unique-id
- 刪除用戶
-
HTTP Status Code
狀態(tài)代碼由三位數(shù)字組成霸妹,第一個數(shù)字定義了響應(yīng)的類別,且有五種可能取值:
- 1xx:指示信息 – 表示請求已接收念搬,繼續(xù)處理
- 2xx:成功 – 表示請求已被成功接收
- 3xx:重定向 – 要完成請求必須進行更進一步的操作
- 4xx:客戶端錯誤 – 請求有語法錯誤或請求無法實現(xiàn)
- 5xx:服務(wù)器錯誤 – 服務(wù)器未能實現(xiàn)合法的請求
常見狀態(tài)代碼抑堡、狀態(tài)描述的說明如下:
- 200 OK:客戶端請求成功
- 204 No Content:沒有新文檔摆出,瀏覽器應(yīng)該繼續(xù)顯示原來的文檔
- 206 Partial Content:客戶發(fā)送了一個帶有Range頭的GET請求朗徊,服務(wù)器完成了它
- 301 Moved Permanently:所請求的頁面已經(jīng)轉(zhuǎn)移至新的url
- 302 Found:所請求的頁面已經(jīng)臨時轉(zhuǎn)移至新的url
- 304 Not Modified:客戶端有緩沖的文檔并發(fā)出了一個條件性的請求,服務(wù)器告訴客戶偎漫,原來緩沖的文檔還可以繼續(xù)使用爷恳。
- 400 Bad Request:客戶端請求有語法錯誤,不能被服務(wù)器所理解
- 401 Unauthorized:請求未經(jīng)授權(quán)象踊,這個狀態(tài)代碼必須和WWW-Authenticate報頭域一起使用
- 403 Forbidden:對被請求頁面的訪問被禁止
- 404 Not Found:請求資源不存在
- 500 Internal Server Error:服務(wù)器發(fā)生不可預(yù)期的錯誤
- 503 Server Unavailable:請求未完成温亲,服務(wù)器臨時過載或當(dāng)機,一段時間后可能恢復(fù)正常
HTTP Cookie & Session
- 簡書 - 全面解讀 HTTP Cookie
- 簡書 - Cookie 機制
- 阮一峰 - JavaScript 標(biāo)準(zhǔn)參考教程 - Cookie
- segmentfault - 聊一聊 Cookie
- 知乎 - COOKIE和SESSION有什么區(qū)別杯矩?
HTTP Cache(緩存)
- 在前端性能優(yōu)化中應(yīng)用HTTP緩存的三部曲
- 徹底弄懂 Http 緩存機制 - 基于緩存策略三要素分解法
- 胡子大哈 - 掌握 HTTP 緩存——從請求到響應(yīng)過程的一切(上)
- 胡子大哈 - 掌握 HTTP 緩存——從請求到響應(yīng)過程的一切(下)
HTTP CORS (跨域資源共享)
HTTPS
- 扒一扒HTTPS網(wǎng)站的內(nèi)幕
- 簡書 - 九個問題從入門到熟悉HTTPS
- 理解HTTPS為什么安全前,先看看這些東西
- HTTPS為什么安全 &分析 HTTPS 連接建立全過程
- HTTPS 免費證書申請教程
- 掘金 - 升級 Https 的那些事
- 簡書 - Android 使用 HTTPS
- 知乎專欄 - iOS開發(fā)中的HTTPS
- 簡書 - iOS開發(fā)HTTPS實現(xiàn)之信任SSL證書和自簽名證書
HTTP/2
- segmentfault - HTTP/2 新特性淺析
- 簡書 - 未來已到——HTTP/2
- 掘金 - HTTP 2.0 的那些事
- HTTP/2 發(fā)展歷程
- 掘金 - Web 開發(fā)者的 HTTP/2 性能優(yōu)化指南
- 前端開發(fā)與 HTTP/2 的羈絆——安利篇
- 簡書 - 讓你的網(wǎng)站升級到HTTP/2
- 簡書 - HTTP/2 流量調(diào)試
- GitBook - http2 講解
HTTP 安全
HTTP 面試
HTTP 爬蟲文章
Resources
Node.js
Java
- java-spring-mybatis整合實現(xiàn)爬蟲之《今日頭條》搞笑動態(tài)圖片爬取
- 掘金 - 重構(gòu):抓取一個視頻網(wǎng)站上 2016 年所有電影的下載鏈接
- 開源中國 - SpringBoot+SpringMVC+MybatisPlus框架整合練習(xí)之美女圖片爬蟲---圖文詳細流程
PHP
Python
- 伯樂在線 - Python 爬蟲的工具列表
- 簡書 - Python爬蟲庫-Beautiful Soup的使用
- 漫談Pyspider網(wǎng)絡(luò)爬蟲的實踐
- 簡書 - 500 行 Python 代碼構(gòu)建一個輕量級爬蟲框架
- Python爬蟲一步步抓取房產(chǎn)信息
- Python爬蟲之模擬知乎登錄
- 怎樣借助Python爬蟲給寶寶起個好名字
- 簡書 - Python爬蟲-用Scrapy框架實現(xiàn)漫畫的爬取
- 簡書 - 使用python抓取美女福利圖片
- 簡書 - Python 福利小爬蟲泌射,爬取今日頭條街拍美女圖
- 掘金 - Python 爬蟲:把廖雪峰的教程轉(zhuǎn)換成 PDF 電子書
HTTP 資源
文章
- 阮一峰 - HTTP 協(xié)議入門
- HTTP 協(xié)議詳解
- 扒一扒HTTP的構(gòu)成
- 跟著 Github 學(xué)習(xí) Restful HTTP API 設(shè)計
- imweb前端社區(qū) - HTTP1.1與前端性能
- 關(guān)于 Web 安全粘姜,99% 的網(wǎng)站都忽略了這些
- Jerry Qu - HTTP系列歸檔文章 (感謝天之驕子推薦)
視頻
HTTP 抓包工具及教程
工具
- Browser Develop Tools - 瀏覽器開發(fā)者工具
- Fiddler for Windows - Fiddler是一個 HTTP 協(xié)議調(diào)試代理工具
- Charles for Mac Mac下HTTP 協(xié)議調(diào)試代理工具
- Fiddler-AddOns - Fiddler 插件地址
- Wireshark - 是一個網(wǎng)絡(luò)封包分析軟件,網(wǎng)絡(luò)封包分析軟件的功能是擷取網(wǎng)絡(luò)封包熔酷,并盡可能顯示出最為詳細的網(wǎng)絡(luò)封包資料
- mitmproxy - 一款可交互式的命令行抓包工具
教程
- Fiddler CertMaker for iOS and Android - HTTPS 證書生成插件
- 簡書 - HTTPS以及Fiddler抓取HTTPS協(xié)議 - APP HTTPS 抓包
- 簡書 - 抓包工具 Fiddler 相關(guān)知識總結(jié)
- 簡書 - Fiddler 教程
- 簡書 - 抓包工具Wireshark基本介紹和學(xué)習(xí)TCP三次握手
- TMQ - 從wireshark抓包開始學(xué)習(xí)https
- 掘金 - 一步一步教你 HTTPS 抓包 (mitmproxy)
Chrome HTTP 插件
- Proxy SwitchyOmega - 輕松快捷地管理和切換多個代理設(shè)置
- CORS Toggle - 允許跨域請求
- Postman - 功能超級強大 HTTP Client
HTTP 平臺資源庫
Browser
Node.js
- request - Request is designed to be the simplest way possible to make http calls
- axios- Promise based HTTP client for the browser and node.js
- http-proxy - It is an HTTP programmable proxying library that supports websockets
- superagent - SuperAgent is a small progressive client-side HTTP request library
- morgan - HTTP request logger middleware for node.js
Java
Android
Python
若只使用python3.X, 下面可以不看了, 記住有個urllib的庫就行了
python2.X 有這些庫名可用: urllib, urllib2, urllib3, httplib, httplib2, requests
python3.X 有這些庫名可用: urllib, urllib3, httplib2, requests
兩者都有的urllib3和requests, 它們不是標(biāo)準(zhǔn)庫. urllib3 提供線程安全連接池和文件post支持,與urllib及urllib2的關(guān)系不大. requests 自稱HTTP for Humans, 使用更簡潔方便孤紧。
詳細信息請參考 - 開源中國 - python中 urllib, urllib2, httplib, httplib2 幾個庫的區(qū)別
HTTP 壓力測試
工具
- LoadRunner
- SoapUI
- Jmeter
- http_load
- webbench
- ab
- siege
教程
- 博客園 - Jmeter教程 簡單的壓力測試
- 慕課網(wǎng) - 接口測試基礎(chǔ)入門篇
- 慕課網(wǎng) - JMeter之HTTP協(xié)議接口性能測試
- 介紹幾款Web服務(wù)器性能壓力測試工具
HTTP 代理服務(wù)器
產(chǎn)品
- Nginx
- Squid
- Privoxy
- Varnish
- Polipo
- Tinyproxy
- HAProxy
- ATS
文章
- 五大開源 Web 代理服務(wù)器橫評
- 簡書 - 反向代理服務(wù)器比較(Nginx号显,ATS,Squid等)
- 簡書 - Apache vs Nginx:基于實踐經(jīng)驗的比較
- 簡書 - 主機躺酒、服務(wù)器押蚤,代理服務(wù)器,反向代理服務(wù)器理解(自用)
- 簡書- 大型網(wǎng)站架構(gòu)系列:負載均衡詳解
- 使用squid搭建代理服務(wù)器
- 簡書 - 實戰(zhàn)Nginx筆記
- 簡書 - Nginx Proxy Cache原理和最佳實踐