URL(Uniform Resource Locator)
基本格式
schema://host[:port]/path[;parameters][?query-string][#anchor]
schema->指明使用哪种网络传输协议(http.https.ftp,file等)
host->服务器域名或者具体的IP地址,就好比一个大局域网的主机名一样。
可以在host名前加入登陆账号和密码(格式:username:pa[email protected])
port->传输端口号,当默认为80时,可以省略。
path->要访问的主机目录或文件地址,就如同访问一个具体路径一样。(a/b/c.txt)
parameters->可选的特殊参数
query-string->传递给主机的参数,参数使用"a=1"格式,多个参数使用"&"分隔
anchor->锚,就是一个子链接,指定到访问文件的固定位置。
举个栗子:
https://zh.wikipedia.org/wiki/超文本传输协议#0.9
schema->https
host->zh.wikipedia.org
path->/wiki/超文本传输协议
anchor->0.9
通信方式
简单点说就是一个消息机制。
1、客户端发送请求。
2、服务器根据请求的类型而返回不同的数据。
3、客户端解析服务器返回数据而做出相应的显示。
注意:请求都是无状态的(服务器并不知道客户端当前处于什么状态),一次请求交互就意味着一次通信完成,客户端与服务器可以断开连接。
所以一般形成一个完善的网页显示,需要发送多次请求。
消息结构
请求消息结构
由4部分组成:
1、请求行
格式:method[空格]/path[空格]HTTP/version
2、请求头
用于表明请求的配置参数
3、换行
\r\n
4、请求体
请求具体的信息参数
响应消息结构
1、响应行(状态行)
格式:HTTP/version[空格]status code[空格]message
2、响应头
表明响应的配置参数
3、换行
\r\n
4、响应体
响应的具体信息
关于请求消息结构
请求行
method
请求的方法,有如下几种:(大写)
OPTIONS:使服务器返回当前资源所支持的所有请求方法,可以用于测试服务器是否正常。
GET:既”显示“请求,用于向服务器请求数据。
HEAD:与GET方法一样,也是请求数据,但是服务器不会回传资源的文本部分。这个可以用于仅仅获取资源的元信息。
POST:向服务器提交修改后的数据,数据包含在请求文本中,服务器将存储数据。
PUT:向服务器上传其增加的内容。
DELETE:请求服务器删除Request-URI所标识的资源。
TRACE:回显服务器所受到的请求,用于测试。
CONNECT:将连接改为管道方式,通常用于SSL加密服务器连接
path
此path即为
host[:port]/path[;parameters][?query-string][#anchor]
HTTP/version
其中”HTTP/“是固定字符,version即为http的协议版本,常用的有:HTTP/1.0,HTTP/1.1,HTTP/2
请求头
请求头由多个域组成,常见的有:
cache
If-Modified-Since:时间 (检查是否有更新的页面)
将客户端缓存页面的最后修改时间发送到服务器,服务器与对应文件修改时间相比,若时间一致则会返回304,否则返回200和新文件内容。
If-None-Match:ETag值 (检查资源是否更新)
将上次从服务器获取的ETag值发送,服务器与当前的ETag值对比,若没有改变则返回304,否则返回200和新的资源以及ETag。
说明:ETag与If-Modified-Since目的相同,都是为了检查本地缓存是否需要更新,但是ETag值更优于时间表示法。比如文件仅仅时间
改变了,但是内容没有改变。等等...ETag是实体内容所生成的值,所以更加准确。
Pragma:no-cache (防止页面被缓存)
Cache-Control:缓存机制
缓存机制有:
1、Public 可以被任何缓存所缓存(多用户共享)
2、Private 内容只缓存到私有缓存中(指定单用户使用)
3、no-cache 所有内容都不会被缓存
client
Accept:类型 (表明客户端可以接受的媒体类型)
比如:Accept:text/html
Accept-Encoding:类型 (表明可以接收的压缩编码方法)
比如:Accept-Encoding: gzip, deflate, br
说明:通过压缩可以减少网络传输的数据量,常用解码:
gzip ---->GNU zip编码
compress --->Unix的文件压缩程序
deflate --->zlib的格式压缩的
identity -->没有对实体进行编码。当没有Content-Encoding header时, 就默认为这种情况
gzip, compress, deflate -->无损压缩算法,用于减少传输报文的大小,不会导致信息损失。
Accept-Language:类型 (表明可接收的语言编码)
比如:Accept-Language: zh-CN,zh;q=0.8
User-Agent: 名称 (表明客户端使用的浏览器信息和系统信息)
比如:User-Agent: Chrome WIN 51.0.2704.103 (aa7c8d23c098e96a388ffedf6698230bda650bb3-refs/branch-heads/[email protected]{#723}) channel(stable)
entity
Content-Length:数值 (请求体的长度,十进制表示)
也就是实际发送内容长度,没有前3部分。
Content-Type:类型 (数据类型)
比如:Content-Type: text/plain;charset=UTF-8
miscellaneous
Referer:信息 (告知从哪个链接过来的)
比如:Referer: https://www.google.com.hk/
transport
Connection:类型 (表明客户端和服务器的连接方式)
比如:Connection: keep-alive
表示客户端和服务器之间的TCP连接不会关闭。
Host:主机和端口号 (指明服务器地址及端口号)
关于响应消息结构
响应行(状态行)
HTTP/version
与请求行意义一样,代表协议版本号。
status code
状态码,用于告知客户端此时服务器返回状态是否正常。有如下几类:
1xx(提示信息):请求已被服务器接收,继续处理
2xx(成功):请求已成功被服务器接收、理解、并接受。
3xx(重定向):需要后续操作才能完成这一请求。
4xx(客户端错误):请求含有词法错误或无法被执行
5xx(服务器错误):服务器在处理某个正确请求时发生错误。
message
状态消息,是对状态码更加详细的解析。常见的状态码及消息:
200 OK
代表响应成功,请求的资源发送至客户端。
302 Found
重定向,代表新的url会在响应消息的Location中返回,然后客户端会使用这个新的url再次发送请求消息,最终得到正确的网页。
比如输入"www.google.com",最终会定位到"www.google.com.hk"
304 Not Modified
代表上次的文档已经被缓存,可以继续使用。
400 Bad Request
客户端请求与语法错误,不能被服务器所理解
403 Forbidden
服务器收到请求,但是拒绝提供服务
404 Not Found
url指定资源不存在
500 Internal Server Error
服务器发生了不可预期的错误
503 Server Unavailable
服务器当前不能处理客户端的请求,一段时间后可能恢复正常
响应头
cache
Date:时间 (生成消息的时间)
比如:Date: Thu, 28 Jul 2016 03:34:31 GMT
Expires:时间 (浏览器会过期时间内使用本地缓存)
比如:Expires: Thu, 28 Jul 2016 03:34:58 GMT
Vary:变化
比如:Vary: Accept-Encoding
cookie/login
Set-Cookie: (每写入一个cookie都会生成一个set-cookie)
比如:Set-Cookie: SERVERID=9ffd301069c1081a14d128e0c97deda8|1469676872|1469672968;Path=/
说明:cookie是一小段文本,用户保存一些用户信息(没有用户密码等重要信息,一般是使用习惯等),算是对用户状态的一种维持机制。
就好比自动登陆网站一样,保存用户自动登陆设置,所以用ccleaner清除cookie后,很多网站需要设置重新登陆。
entity
ETag:数值 (与请求的If-None-Match 配合使用)
Last-Modified:时间 (最后修改的时间,可与请求的If-Modified-Since配合使用)
Content-Type:类型 (告诉客户端,对象的类型及字符集)
Content-Length:数值 (正文的长度)
不包括前3部分
Content-Encoding:方法 (压缩方法)
Content-Language:语言 (使用的语言)
miscellaneous
Server:信息 (指明服务器软件信息)
比如:Server: Tengine
transport
Connection:类型 (表明客户端和服务器的连接方式)
比如:Connection: keep-alive
表示客户端和服务器之间的TCP连接不会关闭。
代理服务器
代理服务器位于web服务器和web客户端之间的服务器,请求和响应都会通过代理服务器。
代理服务器可以对请求及响应数据进行处理,所以可以:
1、***
2、匿名访问
3、代理缓存,加快上网速度
4、对某些内容指定屏蔽