HTTP协议基础
HTTP概述
HTTP工作原理
- 工作原理
- 客户端连接到web服务器
- HTTP 客户端与web服务器建立一个 TCP 连接
- 客户端向服务器发起 HTTP 请求
- 通过已建立的TCP 连接,客户端向服务器发送一个请求报文
- 服务器接收 HTTP 请求并返回 HTTP 响应
- 服务器解析请求,定位请求资源,服务器将资源副本写到 TCP 连接,由客户端读取
- 释放 TCP 连接
- 若connection 模式为close,则服务器主动关闭TCP 连接,客户端被动关闭连接,释放TCP 连接
- 若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求
- 客户端浏览器解析HTML内容
HTTP场景模拟
- 浏览器地址栏键入URL,场景模拟
- 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址
- 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立 TCP 连接;
- 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求
- 服务器对浏览器请求作出响应
- 释放 TCP 连接
- 浏览器将该 html 文本并显示内容
HTTP请求
HTTP请求行
- HTTP请求行
- 方法字段
GET
- 发送的数据都在地址栏中,不安全
- 发送的数据对数据大小有限制
- 没有请求体
- 请求头相对较少,性能稍微要高些
POST
- 发送的数据在请求体当中,相对安全
- 对请求的数据大大小没有限制
- 有一个特殊的请求头
Content-Type:application/x-www-form-urlencoded
- URL字段
- HTTP协议版本字段
GET /index.php HTTP/1.1
HTTP请求消息头
- HTTP请求消息头
Host
请求的主机名,允许多个域名同处一个IP 地址,即虚拟主机
Accept
客户端可识别的响应内容类型列表
- 星号
*
用于按范围将类型分组
- 用
*/*
指示可接受全部类型
- 用
type/*
指示可接受 type 类型的所有子类型
Referer
客户端浏览器是从哪个页面去访问服务器的
Accept-Language
客户端可接受的自然语言
Accept-Encoding
客户端可接受的编码压缩格式
Accept-Charset
可接受的应答的字符集
Content-Type
POST方法特殊请求头
User-Agent
产生请求的浏览器类型,包括使用的操作系统,浏览器版本等
connection
请求完成后,连接方式(close 或 keepalive)
Cookie
存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie
Cache-Control
缓存控制
Host: localhost:8080
Accept: image/gif, image/x-xbitmap, *
Referer: http://localhost:8080/index/
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type:application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible;MSIE 7.0;windows NT 5.1; GTB6.5; CIBA)
Connection: Keep-Alive
Cache-Control: no-cache
HTTP请求空行
HTTP请求体
- 请求体
- 请求包体不在 GET 方法中使用,而是在POST 方法中使用
- POST 方法适用于需要客户填写表单的场合
- 与请求包体相关的最常使用的是包体类型 Content-Type 和包体长度 Content-Length
<?php
foreach(getallheaders() as $name=>$value){
echo "$name: $value"."<br>";
}
?>
HTTP响应
HTTP响应状态行
- HTTP响应状态行
- HTTP 协议版本字段
- 状态码
1xx
表示服务器已接收了客户端请求,客户端可继续发送请求
2xx
表示服务器已成功接收到请求并进行处理
3xx
表示服务器要求客户端重定向
4xx
表示客户端的请求有非法内容
5xx
表示服务器未能正常处理客户端的请求而出现意外错误
- 状态码描述信息
200 OK
表示客户端请求成功
302 Found
表示请求的资源临时从不同的URL响应请求,但请求者应继续使用原有位置来进行以后的请求
404 Not Found
请求的资源不存在,例如,输入了错误的URL
500 Internal Server Error
表示服务器发生不可预期的错误,导致无法完成客户端的请求
HTTP/1.1 200 OK
HTTP响应消息头
- HTTP响应消息头
Location
控制浏览器显示哪个页面
Server
服务器的类型
Content-Encoding
服务器发送的压缩编码方式
Content-Length
服务器发送显示的字节码长度
Content-Language
服务器发送内容的语言和国家名
Content-Type
服务器发送内容的类型和编码类型
Last-Modified
服务器最后一次修改的时间戳
Refresh
控制浏览器1秒后转发URL所指向的页面
Accept-Ranges
服务器是否支持断点续传,bytes表示支持,none表示不支持
Content-Disposition
服务器控制浏览器以下载方式打开文件
Transfer-Encoding
服务器分块传递数据到客户端
Set-Cookie
服务器发送Cookie相关的信息
Expires
本次发送的HTTP响应中的实体内容的过期时间
Cache-Control
发送的HTTP响应消息在浏览器中的缓冲时间
Pragma
服务器控制浏览器不要缓存网页
Connection
HTTP请求的版本的特点,连接方式(close 或 keepalive)
Date
响应网站的时间戳
nginx-hit
负载均衡
CloudServiceDiscount
云服务器加速
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 05 Nov 2020 01:00:57 GMT
Content-Type: text/html
Last-Modified: Thu, 07 Nov 2019 04:08:10 GMT
Vary: Accept-Encoding
Expires: Thu, 05 Nov 2020 01:00:57 GMT
Cache-Control: max-age=60
X-Powered-By: schi_v1.02
Age: 1
Content-Length: 539457
X-Cache: HIT from ja108-181.sina.com.cn
Connection: close
HTTP响应空行
- 响应空行
- 最后一个响应头部之后是一个空行,发送回车符和换行符
- 通知服务器以下不再有响应头部
HTTP响应体
获取消息头函数
$http_response_header
函数
- 获取消息头
file_get_contents()
将整个文件的内容读入一个字符串
get_headers()
获取消息头
<?php
$url= "http://www.sina.com.cn";
$html= file_get_contents($url);
foreach($http_response_header as $name=>$value){
echo "$value"."<br>";
}
?>
HTTPS
- 基础配置
- 公钥
- 私钥
- 签名
- 证书
- 确保当前发送数据单位可信
- 表示数据发送者的身份
- CA证书颁发机构,代表某个域名,并且包含加密的钥匙
- 保证服务器的真实性