一. http协议即HyperText Transfer Protocol超文本传输协议,特点:
- 灵活:允许传输任意类型的数据对象。
- 无连接:每次连接只处理一个请求。客户端请求request->服务器响应response->连接断开。
- 无状态:同一个客户端的这次请求和上次请求是没有对应关系。
- 处于应用层,基于IP(互联网层)/TCP(传输层)的连接(TCP三次握手建立客户端和服务端的连接)。
http明文传输不安全,使用安全版本https(SSL/TLS加密)
- CA(Certificate Authority)证书颁发机构,负责签发证书、认证证书、管理已颁发证书的机关。比较知名的国际品牌:Symantec,GeoTrust,GlobalSign,可以在阿里云等平台购买服务。
- 证书是(CA)采用PKI(Public Key Infrastructure)公开密钥基础架构技术,
签发的对用户的公钥的认证,包括电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等。
二. TCP的三次握手
- 第一次握手:建立连接时,客户端发送SYN包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
- 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
- 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
三. 客服端发送请求
1. 请求行
请求方法URI协议/版本
1). GET 请求获取Request-URI所标识的资源
2). POST 在Request-URI所标识的资源后附加新的数据
3). HEAD 请求获取由Request-URI所标识的资源的响应消息报头
4). PUT 请求服务器存储一个资源,并用Request-URI作为其标识
5). DELETE 请求服务器删除Request-URI所标识的资源
6). TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
7). CONNECT 保留将来使用
8). OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
POST /index.php HTTP/1.1
2. 请求头信息
Transport 头域
- Connection 表示是否需要持久连接
Connection: keep-alive - Request后TCP连接不会关闭,被后续请求继续使用
Connection: close - Request后TCP连接关闭 - Host 指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。80端口可缺省
Client 头域
- Accept: 浏览器可以接受的媒体类型(MIME类型)
Accept: text/html
Accept: / 代表浏览器可以处理所有类型(经常使用 - Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)
- Accept-Language:浏览器申明接收的语言
Accept-Language:zh-cn:中文。如缺省,则服务器认为服务器对各种语言都接受 - User-Agent:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36
- Accept-Charset:浏览器申明自己接收的字符集
Accept-Charset:iso-8859-1,gb2312 如缺省,则接受任何字符集
Cookie/Login 头域
- Cookie: 最重要的header, 将cookie的值发送给HTTP 服务器
Entity头域
- Content-Length:发送给HTTP服务器数据的长度,即请求消息正文的长度
Content-Length: 38 - Content-Type:定义网络文件的类型和网页的编码,浏览器将以什么形式、什么编码读取这个文件
Content-Type: application/x-www-form-urlencoded
Miscellaneous 头域
- Referer:提供了Request的上下文信息的服务器,来自于哪个链接
Cache 头域
- If-Modified-Since:把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。
If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT。 - If-None-Match: If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag. 使用这样的机制将提高网站的性能
If-None-Match: "03f2b33c0bfcc1:0" - Pragma: 防止页面被缓存, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一样
Pragma: no-cache(只有一个用法) - Cache-Control:指定Response-Request遵循的缓存机制(非常重要)
Cache-Control:Public 可以被任何缓存所缓存
Cache-Control:Private 内容只缓存到私有缓存中
Cache-Control:no-cache 所有内容都不会被缓存
四. 服务端的响应
1. 状态行
状态行由协议版本、数字形式的状态代码,及相应的状态描述组成,各元素之间以空格分隔,结尾时回车换行符,格式:
HTTP-Version(服务器 HTTP 协议的版本) Status-Code(服务器发回的响应代码) Reason-Phrase(状态代码的文本描述) CRLF(回车换行)
如:HTTP/1.1 200 OK (CRLF)
- 状态代码
1xx:指示信息——表示请求已经接受,继续处理
2xx:成功——表示请求已经被成功接收、理解、接受
3xx:重定向——要完成请求必须进行更进一步的操作
4xx:客户端错误——客户端请求有错误或请求无法实现
5xx:服务器端错误——服务器未能实现合法的请求 - 常用编码
200 OK //客户端请求成功
303:重定向,即从原url重定向到新的url。 例如php 的hear函数header("localtion:/index.php")
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务,一般是服务器路径没有权限或者是其他权限相关问题
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误:一般来说,这个问题都会在服务器端的源代码出现错误时出现,比如出现死循环。
502 Bad Gateway//作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。比如LNMP ,php-fpm没有启动就会报502错误。
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常,比如java 容器部署war的时候,就出现503, 或者是nginx处理的文件没有权限。
504 Gateway Time-out:作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应,比如nginx和php-fpm, php设置sleep(200),就会收到504 Gateway Time-out。
注意:某些代理服务器在DNS查询超时时会返回400或者500错误
2. 响应头信息
Cache头域
- Date:生成消息的具体时间和日期,即当前的GMT时间
- Expires:浏览器会在指定过期时间内使用本地缓存,指明应该在什么时候认为文档已经过期,从而不再缓存它
- Vary:告诉代理服务器缓存两种版本的资源:压缩和非压缩
Vary: Accept-Encoding
Cookie/Login 头域
- P3P:用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题
- Set-Cookie:把cookie 发送到客户端浏览器, 每一个写入cookie都会生成一个Set-Cookie(非常重要)
Entity实体头域
- ETag:和If-None-Match 配合使用
- Last-Modified:用于指示资源的最后修改日期和时间
- Content-Type:服务器告诉浏览器自己响应的对象的类型和字符集
Content-Type: text/html; charset=utf-8
-Content-Length:实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后再发给客户端。 - Content-Encoding:文档的编码(Encode)方法。一般是压缩方式
Content-Encoding:gzip - Content-Language:告诉浏览器自己响应的语言
Miscellaneous 头域
- Server:服务器的软件信息
Apache/2.2.8 (Win32) PHP/5.2.5 - X-Powered-By:网站的开发技术
X-Powered-By: PHP/5.2.5
Transport头域
- Connection:TCP连接保持或关闭
Connection: keep-alive,有一个保持时间,可以在服务器软件(如Apache)中设定这个时间。
Connection: close
Location头域
- Location:用于重定向一个新的位置, 包含新的URL地址
3. 响应正文
服务器返回的资源的内容,响应头和正文之间也必须用空行分隔
<html>...</html>
五. 例子,在chrome浏览器访问url,点击F12->Network->网址,可查看Headers信息
1. 登录获取服务器授权(POST),获得cookie
Response Headers
Set-Cookie: key1=value1; Path=/; Max-Age=0; Expires=Mon, 11-Feb-2019 13:11:44 GMT
2. 带着cookie请求服务器数据(GET)
General
Request URL: https://***.***.com/***.shtml
Request Method: GET
Status Code: 200
Remote Address: *.*.*.*:443
Referrer Policy: no-referrer-when-downgrade
Response Headers
Connection: keep-alive
Content-Disposition: inline;filename=f.txt
Content-Type: application/json;charset=UTF-8
Date: Tue, 12 Feb 2019 13:37:24 GMT
Transfer-Encoding: chunked
Request Headers
authority: ***.com
method: GET
path: /***/***.shtml
scheme: https
accept: application/json, text/plain, */*
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9,en;q=0.8
content-type: application/x-www-form-urlencoded
cookie: key1=value1;key2=value2;
host: ***.com
referer: https://***.com/index.html
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36