HTTPD之五---HTTP協議與相關工具

http協議

HTTP是一個屬於應用層的面向對象的協議由於其簡捷、快速的方式,適用於分佈式超媒體信息系統。

http/0.9, http/1.0, http/1.1, http/2.0

(1)http協議:stateless 無狀態

 服務器無法持續追蹤訪問者來源

(2)解決http協議無狀態方法

 cookie 客戶端存放
 session 服務端存放

(3)http事務:一次訪問的過程

  請求:request
  響應:response

cookie分類

(1)胖cookie:記錄了用戶訪問的詳細信息,很容易泄露用戶隱私,不建議使用

(2)瘦cookie:僅僅標識用戶身份,而用戶的更詳細的瀏覽信息則保存在服務器中,比如用戶購物車中的物品信息。session機制可以實現此功能,它能記錄用戶在網站的訪問行爲,session是關聯到某個用戶cookie上的。session是保存於內存中的一小段數據,記錄了用戶的操作。當用戶帶着cookie來訪問時,服務器會查找與之對應的session信息,從而得知用戶之前的瀏覽信息。

cookie和session是用來追蹤用戶訪問行爲的重要手段,從而彌補的http無狀態的缺陷。

HTTP請求報文  

HTTP響應報文

 

http協議狀態碼分類

status(狀態碼):  

1xx:100-101 信息提示
2xx:200-206 成功
3xx:300-305 重定向
4xx:400-415 錯誤類信息,客戶端錯誤
5xx:500-505 錯誤類信息,服務器端錯誤

200: 成功,請求數據通過響應報文的entity-body部分發送;OK
301: 請求的URL指向的資源已經被刪除;但在響應報文中通過首部Location指明瞭資源現在所處的新位置;Moved Permanently  永久重定向
302: 響應報文Location指明資源臨時新位置 Moved Temporarily   臨時重定向
304: 客戶端發出了條件式請求,但服務器上的資源未曾發生改變,則通過響應此響應狀態碼通知客戶端;Not Modified
401: 需要輸入賬號和密碼認證方能訪問資源;Unauthorized
403: 請求被禁止;Forbidden
404: 服務器無法找到客戶端請求的資源;Not Found
500: 服務器內部錯誤;Internal Server Error
502: 代理服務器從後端服務器收到了一條僞響應,如無法連接到網關;Bad Gateway
503: 服務不可用,臨時服務器維護或過載,服務器無法處理請求
504: 網關超時

HTTP 首部字段

1> HTTP 首部字段包含的信息最爲豐富。首部字段同時存在於請求和響應報文內,並涵蓋 HTTP 報文相關的內容信息。使用首部字段是爲了給客服端和服務器端提供報文主體大小、所使用的語言、認證信息等內容
2> 首部字段結構HTTP 首部字段是由首部字段名和字段值構成的,中間用冒號“:”分隔
3> 字段值對應單個 HTTP 首部字段可以有多個值
4> 報文首部中出現了兩個或以上具有相同首部字段名的首部字段時,在規範內尚未明確,根據瀏覽器內部處理邏輯的不同,優先處理的順序可能不同,結果可能並不一致

首部的分類:

通用首部:請求報文和響應報文兩方都會使用的首部
請求首部:從客戶端向服務器端發送請求報文時使用的首部。補充了請求的附加內容、客戶端信息、請求內容相關優先級等信息
響應首部:從服務器端向客戶端返回響應報文時使用的首部。補充了響應的附加內容,也會要求客戶端附加額外的內容信息
實體首部:針對請求報文和響應報文的實體部分使用的首部。補充了資源內容更新時間等與實體有關的的信息
擴展首部

通用首部:

Date: 報文的創建時間
Connection:連接狀態,如keep-alive, close
Via:顯示報文經過的中間節點(代理,網關)
Cache-Control:控制緩存,如緩存時長
MIME-Version:發送端使用的MIME版本
Warning:錯誤通知

請求首部:

Accept:通知服務器自己可接受的媒體類型
Accept-Charset: 客戶端可接受的字符集
Accept-Encoding:客戶端可接受編碼格式,如gzip
Accept-Language:客戶端可接受的語言
Client-IP: 請求的客戶端IP Host: 請求的服務器名稱和端口號 Referer:跳轉至當前URI的前一個URL User-Agent:客戶端代理,瀏覽器版本

條件式請求首部:

Expect:允許客戶端列出某請求所要求的服務器行爲
If-Modified-Since:自從指定的時間之後,請求的資源是否發生過修改
If-Unmodified-Since:與上面相反
If-None-Match:本地緩存中存儲的文檔的ETag標籤是否與服務器文檔的Etag不匹配
If-Match:與上面相反

安全請求首部:

Authorization:向服務器發送認證信息,如賬號和密碼
Cookie: 客戶端向服務器發送cookie

代理請求首部:

Proxy-Authorization: 向代理服務器認證

響應首部:

信息性:

Age:從最初創建開始,響應持續時長
Server:服務器程序軟件名稱和版本

協商首部:某資源有多種表示方法時使用

Accept-Ranges:服務器可接受的請求範圍類型
Vary:服務器查看的其它首部列表

安全響應首部:

Set-Cookie:向客戶端設置cookie
WWW-Authenticate:來自服務器對客戶端的質詢列表

實體首部:

Allow: 列出對此資源實體可使用的請求方法
Location:告訴客戶端真正的實體位於何處
Content-Encoding:對主體執行的編碼
Content-Language:理解主體時最適合的語言
Content-Length: 主體的長度
Content-Location: 實體真正所處位置
Content-Type:主體的對象類型,如text

緩存相關:

ETag:實體的擴展標籤
Expires:實體的過期時間
Last-Modified:最後一次修改的時間

   HTTP 是一種無狀態協議。協議自身不對請求和響應之間的通信狀態進行保存。也就是說在 HTTP 這個級別,協議對於發送過的請求或響應都不做持久化處理。這是爲了更快地處理大量事務,確保協議的可伸縮性,而特意把 HTTP 協議設計成如此簡單的。可是隨着 Web 的不斷髮展,很多業務都需要對通信狀態進行保存。於是引入了 Cookie 技術。使用 Cookie 的狀態管理Cookie 技術通過在請求和響應報文中寫入 Cookie 信息來控制客戶端的狀態。Cookie 會根據從服務器端發送的響應報文內的一個叫做 Set-Cookie 的首部字段信息,通知客戶端保存Cookie。當下次客戶端再往該服務器發送請求時,客戶端會自動在請求報文中加入 Cookie 值後發送出去。服務器端發現客戶端發送過來的 Cookie 後,會去檢查究竟是從哪一個客戶端發來的連接請求,然後對比服務器上的記錄,最後得到之前的狀態信息  

Set-Cookie首部字段

Set-cookie首部字段示例:

Set-Cookie: status=enable; expires=Fri, 24 Nov 2017 20:30:02 GMT; path=/;

含義:

NAME=VALUE 賦予 Cookie 的名稱和其值,此爲必需項
expires=DATE Cookie 的有效期,若不明確指定則默認爲瀏覽器關閉前爲止
path=PATH 將服務器上的文件目錄作爲Cookie的適用對象,若不指定則默認爲文檔所在的文件目錄
domain=域名 作爲 Cookie 適用對象的域名,若不指定則默認爲創建 Cookie的服務器的域名
Secure 僅在 HTTPS 安全通信時纔會發送 Cookie
HttpOnly 加以限制使 Cookie 不能被 JavaScript 腳本訪問

curl工具

curl是基於URL語法在命令行方式下工作的文件傳輸工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等協議。curl支持HTTPS認證,並且支持HTTP的POST、PUT等方法, FTP上傳, kerberos認證,HTTP上傳,代理服務器,cookies,用戶名/密碼認證, 下載文件斷點續傳,上載文件斷點續傳, http代理服務器管道( proxy tunneling),還支持IPv6,socks5代理服務器,通過http代理服務器上傳文件到FTP服務器等,功能十分強大

curl [options] [URL...]

-A/--user-agent <string> 設置用戶代理髮送給服務器
-e/--referer <URL> 來源網址
--cacert <file> CA證書 (SSL)
-k/--insecure 允許忽略證書進行 SSL 連接
--compressed 要求返回是壓縮的格式
-H/--header <line>自定義首部信息傳遞給服務器
-i 顯示頁面內容,包括報文首部信息
-I/--head 只顯示響應報文首部信息
-D/--dump-header <file>將url的header信息存放在指定文件中
--basic 使用HTTP基本認證
-u/--user <user[:password]>設置服務器的用戶和密碼
-L 如果有3xx響應碼,重新發請求到新位置
-O 使用URL中默認的文件名保存文件到本地
-o <file> 將網絡文件保存爲指定的文件中
--limit-rate <rate> 設置傳輸速度
-0/--http1.0 數字0,使用HTTP 1.0
-v/--verbose 更詳細
-C 選項可對文件使用斷點續傳功能
-c/--cookie-jar <file name> 將url中cookie存放在指定文件中
-x/--proxy <proxyhost[:port]> 指定代理服務器地址
-X/--request <command> 向服務器發送指定請求方法
-U/--proxy-user <user:password> 代理服務器用戶和密碼
-T 選項可將指定的本地文件上傳到FTP服務器上
--data/-d 方式指定使用POST方式傳遞數據
-b name=data 從服務器響應set-cookie得到值,返回給服務器

示例一:訪問192.168.34.100主機下/var/www/html/目錄下的文件信息

[[email protected]]#curl 192.168.34.100
welcome to shanghai

示例二:設置用戶代理髮給服務器    -A 用法

[[email protected]]#curl -A 'IE20' http://192.168.34.100
welcome to shanghai

示例三:網址來源,通過baidu網址跳轉   -e選項用法

[[email protected]]#curl -A  'IE20' -e 'www.baidu.com' http://192.168.34.100
welcome to shanghai

A主機上跟蹤,可以看到是通過baidu模仿

示例四:-i 選項:顯示頁面內容,包括報文首部信息

[[email protected]]#curl -i http://192.168.34.100
HTTP/1.1 200 OK
Date: Fri, 29 Nov 2019 04:00:51 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/5.4.16
Last-Modified: Thu, 28 Nov 2019 13:43:21 GMT
ETag: "14-598684bf4e1c0"
Accept-Ranges: bytes
Content-Length: 20
Content-Type: text/html; charset=UTF-8

welcome to shanghai

示例五:將url中cookie存放在指定文件中  -c選項用法:

[root@centos7html]#curl -c /data/cookie.txt http://192.168.34.101/setcookie.php   將網頁上的cookie.php存放在data目錄下

elinks工具:

elinks [OPTION]... [URL]...

-dump: 非交互式模式,將URL的內容輸出至標準輸出
-source:打印源碼

演示:

[root@centos7html]#elinks -dump 192.168.34.100
   welcome to shanghai
[root@centos7html]#elinks -source  192.168.34.100
welcome to shanghai

httpd自帶的工具程序

htpasswd:basic認證基於文件實現時,用到的賬號密碼文件生成工具
apachectl:httpd自帶的服務控制腳本,支持start和stop
rotatelogs:日誌滾動工具
access.log -->
            access.log, access.1.log -->
                             access.log, acccess.1.log, access.2.log

httpd的壓力測試工具

ab, webbench, http_load, seige
Jmeter 開源
Loadrunner 商業,有相關認證
tcpcopy:網易,複製生產環境中的真實請求,並將之保存

ab [OPTIONS] URL
來自httpd-tools包

-n:總請求數
-c:模擬的並行數
-k:以持久連接模式測試

ulimit –n # 調整能打開的文件數

示例:

在A主機導入一個log日誌文件,存放在/var/www/html目錄下,起名叫m.txt

[[email protected]]#cp /var/log/messages  /var/www/html/m.txt
[[email protected]]#cd /var/www/html
[root@centos7html]#ls
index.html  m.txt

在B主機進行壓力測試,使用ab命令,執行2000個請求,模擬100個並行數 

[root@centos7html]#ab -c 100 -n 2000 http://192.168.34.100/m.txt  2000個請求數,模擬100個並行數
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.34.100 (be patient)
Completed 200 requests
Completed 400 requests
Completed 600 requests
Completed 800 requests
Completed 1000 requests
Completed 1200 requests
Completed 1400 requests
Completed 1600 requests
Completed 1800 requests
Completed 2000 requests
Finished 2000 requests


Server Software:        Apache/2.4.6
Server Hostname:        192.168.34.100
Server Port:            80

Document Path:          /m.txt
Document Length:        207 bytes

Concurrency Level:      100
Time taken for tests:   0.943 seconds
Complete requests:      2000
Failed requests:        0
Write errors:           0
Non-2xx responses:      2000
Total transferred:      834000 bytes
HTML transferred:       414000 bytes
Requests per second:    2120.15 [#/sec] (mean)    每秒訪問多少個文件
Time per request:       47.167 [ms] (mean)
Time per request:       0.472 [ms] (mean, across all concurrent requests)
Transfer rate:          863.38 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   3.4      1      23
Processing:     9   43   6.6     43      60
Waiting:        5   43   6.7     43      60
Total:         29   45   6.5     45      67

Percentage of the requests served within a certain time (ms)
  50%     45
  66%     48
  75%     49
  80%     51
  90%     54
  95%     57
  98%     59
  99%     61
 100%     67 (longest request)

 ulimit -n示例:調整文件大小,可以使ab的文件併發更多

[root@centos7html]#ulimit  -n 10240
[root@centos7html]#ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 5782
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 10240
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 5782
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

此時訪問文件大小已經改爲10240,就可以更大的並行訪問文件

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章