欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

网络基础-->http协议

程序员文章站 2022-07-10 18:14:46
...

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、对某些内容指定屏蔽