之前利用工具抓取網絡請求時都是使用Charles
,而後愈來愈以爲Charles
有些卡,而且只能過濾HTTP
協議。可是Charles
過濾的網絡請求數據顯示的很是清晰。 後來就換着使用WireShark
來抓取手機上的網絡請求。html
WireShark
功能很是強大,它能過濾幾乎全部的協議,而且也不多出現卡頓的狀況,體驗起來確實比Charles
要好。在介紹使用WireShark
以前,咱們首先要了解一些常見的協議:HTTP,TCP,UDP等。git
HTTP協議,即超文本傳輸協議(Hypertext transfer protocol)。是一種詳細規定了瀏覽器和萬維網(WWW = World Wide Web)服務器之間互相通訊的規則,經過因特網傳送萬維網文檔的數據傳送協議。github
HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端服務器模型。HTTP是一個無狀態的協議。同一個客戶端的此次請求和上次請求是沒有對應關係,對http服務器來講,它並不知道這兩個請求來自同一個客戶端。 爲了解決這個問題, Web程序引入了Cookie機制來維護狀態.算法
在Internet中全部的傳輸都是經過TCP/IP進行的。HTTP協議做爲TCP/IP模型中應用層的協議也不例外。HTTP協議一般承載於TCP協議之上,有時也承載於TLS或SSL協議層之上,這個時候,就成了咱們常說的HTTPS。編程
HTTP默認的端口號爲80,HTTPS的端口號爲443。跨域
URL(Uniform Resource Locator) 地址用於描述一個網絡上的資源, 基本格式以下:瀏覽器
schema://host[:port#]/path/.../[?query-string][#anchor]
複製代碼
scheme 指定低層使用的協議(例如:http, https, ftp)緩存
host HTTP服務器的IP地址或者域名安全
port# HTTP服務器的默認端口是80,這種狀況下端口號能夠省略。若是使用了別的端口,必須指明,例如 http://www.hao2you.com:8080/bash
path 訪問資源的路徑
query-string 發送給http服務器的數據
anchor- 錨
打開一個網頁須要瀏覽器發送不少次Request:
HTTP消息分爲請求和響應消息。
在請求消息的結構中,包括三部分:請求行、請求頭、請求體。
請求行的格式爲: METHOD /path HTTP/version-number
METHOD
:表示請求方式,常見的有POST
,GET
等。path
: 表示請求的資源HTTP/version-number
: 表示HTTP協議的版本號請求頭內包含不少的鍵值對。
請求體就是咱們要往服務器發送的內容。在GET
方式下的請求體是空的。
響應消息的結構和請求消息的結構答題相同,一樣也分爲三部分:響應行、響應頭、響應體。
響應行的格式爲:HTTP/version-number status-code message
Http協議定義了不少與服務器交互的方法,最基本的有4種,分別是GET,POST,PUT,DELETE. 一個URL地址用於描述一個網絡上的資源,而HTTP中的GET, POST, PUT, DELETE就對應着對這個資源的查,改,增,刪4個操做。 咱們最多見的就是GET和POST了。GET通常用於獲取/查詢資源信息,而POST通常用於更新資源信息。
GET和POST的區別:
Response 消息中的第一行叫作狀態行,由HTTP協議版本號、狀態碼、狀態消息 ,三部分組成。狀態碼用來告訴HTTP客戶端,HTTP服務器是否產生了預期的Response.
HTTP/1.1中定義了5類狀態碼, 狀態碼由三位數字組成,第一個數字定義了響應的類別:
1XX 提示信息 - 表示請求已被成功接收,繼續處理
2XX 成功 - 表示請求已被成功接收,理解,接受
3XX 重定向 - 要完成請求必須進行更進一步的處理
4XX 客戶端錯誤 - 請求有語法錯誤或請求沒法實現
5XX 服務器端錯誤 - 服務器未能實現合法的請求
下面是一些常見的狀態碼:
request header 中的內容大體如圖:
catch中包含的內容不只僅是上圖中顯示的內容,可能還有其它類型的內容。如下是常見的catch中的內容:
If-Modified-Since : 把瀏覽器端緩存頁面的最後修改時間發送到服務器去,服務器會把這個時間與服務器上實際文件的最後修改時間進行對比。若是時間一致,那麼返回304,客戶端就直接使用本地緩存文件。若是時間不一致,就會返回200和新的文件內容。客戶端接到以後,會丟棄舊文件,把新文件緩存起來,並顯示在瀏覽器中.
If-None-Match : If-None-Match和ETag一塊兒工做,工做原理是在HTTP Response中添加ETag信息。 當用戶再次請求該資源時,將在HTTP Request 中加入If-None-Match信息(ETag的值)。若是服務器驗證資源的ETag沒有改變(該資源沒有更新),將返回一個304狀態告訴客戶端使用本地緩存文件。不然將返回200狀態和新的資源和Etag. 使用這樣的機制將提升網站的性能
Pragma : 防止頁面被緩存, 在HTTP/1.1版本中,它和Cache-Control:no-cache做用如出一轍,Pargma只有一個用法, 例如: Pragma: no-cache
注意: 在HTTP/1.0版本中,只實現了Pragema:no-cache, 沒有實現Cache-Control
複製代碼
Cache-Control:這個是很是重要的規則。 這個用來指定Response-Request遵循的緩存機制。各個指令含義以下:
Accept : 瀏覽器端能夠接受的媒體類型。
例如: Accept: text/html 表明瀏覽器能夠接受服務器回發的類型爲 text/html 也就是咱們常說的html文檔,
若是服務器沒法返回text/html類型的數據,服務器應該返回一個406錯誤(non acceptable)
通配符 * 表明任意類型
例如 Accept: */*
表明瀏覽器能夠處理全部類型,(通常瀏覽器發給服務器都是發這個)
Accept-Encoding: 瀏覽器申明本身接收的編碼方法,一般指定壓縮方法,是否支持壓縮,支持什麼壓縮方法(gzip,deflate),(注意:這不是指字符編碼);
例如: Accept-Encoding: gzip, deflate
Accept-Language : 瀏覽器申明本身接收的語言。
語言跟字符集的區別:中文是語言,中文有多種字符集,好比big5,gb2312,gbk等等;
例如: Accept-Language: en-us
User-Agent : 告訴HTTP服務器, 客戶端使用的操做系統和瀏覽器的名稱和版本.
咱們上網登錄論壇的時候,每每會看到一些歡迎信息,其中列出了你的操做系統的名稱和版本,你所使用的瀏覽器的名稱和版本,這每每讓不少人感到很神奇,實際上,服務器應用程序就是從User-Agent這個請求報頭域中獲取到這些信息User-Agent請求報頭域容許客戶端將它的操做系統、瀏覽器和其它屬性告訴服務器。
例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)
Accept-Charset : 瀏覽器申明本身接收的字符集,這就是本文前面介紹的各類字符集和字符編碼,如gb2312,utf-8(一般咱們說Charset包括了相應的字符編碼方案);
Cookie : 最重要的header, 將cookie的值發送給HTTP 服務器
Referer: 提供了Request的上下文信息的服務器,告訴服務器我是從哪一個連接過來的,好比從我主頁上連接到一個朋友那裏,他的服務器就可以從HTTP Referer中統計出天天有多少用戶點擊我主頁上的連接訪問他的網站。
例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT
Connection : Connection: keep-alive
當一個網頁打開完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接不會關閉,若是客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經創建的鏈接; Connection: close
表明一個Request完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接會關閉, 當客戶端再次發送Request,須要從新創建TCP鏈接。
Host : (發送請求時,該報頭域是必需的),請求報頭域主要用於指定被請求資源的Internet主機和端口號,它一般從HTTP URL中提取出來的。
例如: 咱們在瀏覽器中輸入:http://www.guet.edu.cn/index.html
瀏覽器發送的請求消息中,就會包含Host請求報頭域,以下:
Host:http://www.guet.edu.cn
此處使用缺省端口號80,若指定了端口號,則變成:Host:指定端口號 。
response header 中的內容大體如圖:
Date : 生成消息的具體時間和日期。
Expires : 瀏覽器會在指定過時時間內使用本地緩存。
例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT
Vary :
例如: Vary: Accept-Encoding
P3P : 用於跨域設置Cookie, 這樣能夠解決iframe跨域訪問cookie的問題
例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR
Set-Cookie : 很是重要的header, 用於把cookie 發送到客戶端瀏覽器, 每個寫入cookie都會生成一個Set-Cookie.
例如: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com
ETag : 和If-None-Match 配合使用。實例請看上節中If-None-Match的實例)
Last-Modified : 用於指示資源的最後修改日期和時間。(實例請看上節的If-Modified-Since的實例)
Content-Type : WEB服務器告訴瀏覽器本身響應的對象的類型和字符集。 例如:
Content-Type: text/html; charset=utf-8
Content-Type:text/html;charset=GB2312
Content-Type: image/jpeg
複製代碼
Content-Length : 指明實體正文的長度,以字節方式存儲的十進制數字來表示。在數據下行的過程當中,Content-Length的方式要預先在服務器中緩存全部數據,而後全部數據再一古腦兒地發給客戶端。
Content-Encoding : WEB服務器代表本身使用了什麼壓縮方法(gzip,deflate)壓縮響應中的對象。
Content-Language : WEB服務器告訴瀏覽器本身響應的對象的語言者
Server : 指明HTTP服務器的軟件信息
X-AspNet-Version: 若是網站是用ASP.NET開發的,這個header用來表示ASP.NET的版本
X-Powered-By:表示網站是用什麼技術開發的
Connection : Connection: keep-alive
當一個網頁打開完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接不會關閉,若是客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經創建的鏈接;Connection: close
表明一個Request完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接會關閉, 當客戶端再次發送Request,須要從新創建TCP鏈接。
Location : 用於重定向一個新的位置, 包含新的URL地址
無狀態是指協議對於事務處理沒有記憶能力,服務器不知道客戶端是什麼狀態。從另外一方面講,打開一個服務器上的網頁和你以前打開這個服務器上的網頁之間沒有任何聯繫
HTTP是一個無狀態的面向鏈接的協議,無狀態不表明HTTP不能保持TCP鏈接,更不能表明HTTP使用的是UDP協議(無鏈接)
從HTTP/1.1起,默認都開啓了Keep-Alive,保持鏈接特性,簡單地說,當一個網頁打開完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接不會關閉,若是客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經創建的鏈接
Keep-Alive不會永久保持鏈接,它有一個保持時間,能夠在不一樣的服務器軟件(如Apache)中設定這個時間。
手機鏈接上電腦,而後在命令行中輸入如下命令來建立一個網絡監聽接口:
rvictl -s uuid 複製代碼
eg: 建立一個rvi0監聽手機的網絡活動
qis-Mac-mini:Desktop qi$ rvictl -s 6f2eb102cd69721a1456d0bca56ad0d0a23b6e89 Starting device 6f2eb102cd69721a1456d0bca56ad0d0a23b6e89 [SUCCEEDED] with interface rvi0 複製代碼
抓取post請求方式的包:
抓取get請求方式的包:
HTTPS(全稱:Hypertext Transfer Protocol over Secure Socket Layer)安全套接字層超文本傳輸協議HTTPS,爲了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證服務器的身份,併爲瀏覽器和服務器之間的通訊加密。HTTPS所用的端口號是443 。
爲了能更好的理解HTTPS,首先須要瞭解一些概念。
加密和解密使用的祕鑰是相同的祕鑰。所以對稱加密要保證安全性的話,祕鑰要作好保密,只能讓使用的人知道,不能夠公開。
RSA是一種公鑰密碼體制,如今使用的很普遍。公鑰公開,私鑰保密,他的加密解密算法是公開的。由公鑰加密的內容能夠而且只能有私鑰解密,而且由私鑰加密的內容能夠而且只能由公鑰解密。也就是說,RSA的這一對公鑰、私鑰均可以用來加密和解密,而且一方加密的內容能夠由而且只能由對方進行解密。可用於驗證HTTPS各類祕鑰的加密。
簽名就是在信息的後面再加上一段內容,能夠證實信息沒有被修改過,怎麼樣能夠達到這個效果呢?通常是對信息作一個hash計算獲得一個hash值,注意,這個過程是不可逆的,也就是說沒法經過hash值得出原來的信息內容。在把信息發送出去時,把這個hash值加密後作爲一個簽名和信息一塊兒發出去。 接收方在收到信息後,會從新計算信息的hash值,並和信息所附帶的hash值(解密後)進行對比,若是一致,就說明信息的內容沒有被修改過,由於這裏hash計算能夠保證不一樣的內容必定會獲得不一樣的hash值,因此只要內容一被修改,根據信息內容計算的hash值就會變化。固然,不懷好意的人也能夠修改信息內容的同時也修改hash值,從而讓它們能夠相匹配,爲了防止這種狀況,hash值通常都會加密後(也就是簽名)再和信息一塊兒發送,以保證這個hash值不被修改。可是客戶端如何解密呢?這就涉及到數字證書了。
證書中包含我的基本信息,以及最重要的公鑰。
若是證書在傳輸的過程當中被篡改了呢?因此後來又出現了數字簽名。
CA就是用它的私鑰對消息摘要加密,造成簽名,並把原始信息和數據簽名進行合併,即所謂的數字證書。這樣,當別人把他的證書發過來的時候,我再用一樣的Hash算法,再次生成消息摘要。而後用CA的公鑰對數字簽名解密,獲得CA建立的消息摘要,二者一比較,就知道中間有沒有被人篡改了。
下圖是HTTPS的通訊過程:
[圖片上傳失敗...(image-a96c81-1551686316747)]