Http协议

前言

协议指计算机通信网络中两台计算机之前通信共同遵守的约定或规则。http协议就是通信协议的一种,它允许将超文本标记语言(html)文档从web服务器传送到客户端的浏览器。

Web服务器、浏览器、代理服务器

打开浏览器,输入URL,就能看到指定的网页。后台是怎么实现的呢? 当我们输入URL后,浏览器通过网络给web服务发送了一个Request, web服务器接收到Request后,进行响应,生成Response,然后返回给浏览器,浏览器解析Response中的HTML,然后展示出来。我们就看到了指定网页 现在这个过程基本上都要经过代理服务器,如CDN反向代理。 代理服务器就是网络信息的中转站,是为了提高访问速度、突破限制(GWV)、私藏身份。

URL

URL(Uniform Resource Locator)地址用于描述一个网络上的资源,基本格式如下:

schema://host[:port#]/path/.../[?query-string][#anchor]
  • scheme 指定底层使用的协议(如:http https ftp smb)
  • host HTTP服务器的ip地址或域名(www.vimlinux.com)
  • port# HTTP服务器的默认端口是80, 这种情况下可以省略,如果使用了其他端口,需要指明如8080
  • path 访问资源的路径
  • query-string 发送给http服务器的数据
  • anchor 锚点

URL例子:

http://www.vimlinux.com/sj/test/test.aspx?name=sviergn&x=true#stuff

Schema:                 http
host:                   www.mywebsite.com
path:                   /sj/test/test.aspx
Query String:           name=sviergn&x=true
anchor:                 stuff

HTTP协议是无状态的

http协议是无状态的,同一个客户端的多次请求直接是没有对应关系的,http服务器并不知道多次请求来自同一客户端,为了解决这个问题,web程序引入了cookie机制来维护状态。

现在的html不再是单纯的文本,而是包含图片、js等,所以浏览器再获取一个完整网页时,一般需要发送多次Request. 第一次浏览器会接收到一个框架,分析之后发现还有好多文件,然后再次request,等所有文件下载成功后,就显示出来了(显示时,其实一下大的文件仍在加载)

HTTP消息的结构

Request消息分为3个部分,第一部分叫Request line,第二部分叫Request header, 第三部分是body, header和body之间有个空行。

如 METHOD /path-to-resource HTTP/Version-number Header-Name-1: value Header-Name-2: value

Optional request body

第一行中的Method表示请求方法,比如"POST", "GET", path-to-resource表示请求的资源, Http/Version-number表示协议的版本号 当使用的是"GET"方法的时候,body是为空的 比如我们打开这个网站首页的的request如下:

GET http://www.cnblogs.com/ HTTP/1.1
Host: www.cnblogs.com

Get 和 Post方法的区别

Http协议定义了很多与服务器交互的方法,最基本的4种,分别为GET,POST,PUT,DELETE.一个URL地址用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应这个资源的查,改,增,删4个操作。最常见的就是GET和POST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

区别在于:

  • GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中。

  • GET提交的数据大小有限制(浏览器对URL的长度有限制),而POST方法提交的数据没有限制。

  • GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值
  • GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或则其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。

状态码

Response消息中的第一行叫状态行,由HTTP协议版本号,状态码,状态消息三部分组成。 状态码用来告诉http客户端,http服务器是否产生了预期的Response. http/1.1定义了5类状态码,状态码由三位数字组成,第一个数字定义了响应的类别。

  • 1xx 提示信息- 表示请求已被成功接收,继续处理
  • 2xx 成功-表示请求已被成功接收,理解,接受
  • 3xx 重定向-要完成请求必须进行更进一步的处理
  • 4xx 客户端错误-请求有语法错误或请求无法实现
  • 5xx 服务器端错误-服务器未能实现合法的请求

常见的状态码:

  • 200 OK : 表明请求被成功完成,所请求的资源发送回客户端
  • 302 Found: 重定向,新的URL会在response中的Location返回,浏览器会自动使用新的URL发出新的Request
  • 304 Not Modified 代表缓存未过期,可以继续使用
  • 400 Bad Request 客户端请求与语法错误,不能被服务器所理解
  • 403 Forbidden 服务器收到请求,但拒绝提供服务
  • 404 Not Found 请求资源不存在
  • 500 Internal Server Error 服务器发送了不可预期的错误
  • 503 Server Unavailable 服务器当前不能处理客户端请求,一段时间后恢复

HTTP Request Header

header有很多。 Cache

If-Modified-Since

把浏览器端缓存页面的最后修改时间发送给服务器,服务器会把这个时间和服务器文件的最后修改时间进行比对,如果时间一致,就返回304(本地缓存没过期),直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接收到后,会更新本地的缓存。

IF-None-Match

If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。当用户再次请求资源时,将在HTTP Request中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态码和新的资源及ETag.

Pragma

防止页面被缓存,在HTTP/1.1,它和Cache-Control:no-cache作用一样。注意:在HTTP/1.0版本中,只实现了Pragema:no-cache,没有实现Cache-Control

Cache-Control

用来指定Response-Request遵循的缓存机制。各个指令含义如下:

  • Cache-Control:Public 可以被任何缓存所缓存
  • Cache-Control:Private 内容只缓存到私有缓存中
  • Cache-Control: no-cache 所有内容不会被缓存

Client

Accept

浏览器可接受的媒体类型。例如Accept:text/html 代表浏览器接受服务器返回的类型为text/html.如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable) 通配符*代表任意类型

Accept-Encoding:

浏览器声明自己接受的压缩算法,是否支持压缩,支持什么类型的(gzip,deflate) 例如 Accept-Encoding: gzip, deflate

Accept-Language:

浏览器声明自己接受的语言

User-Agent

客户端使用的操作系统和浏览器版本信息

Accept-Charset

浏览器声明自己接受的字符集类型

Cookie/Login

Cookie

包含cookie值

Entity

Content-Length

表明发送给HTTP服务器数据的长度

Miscellaneous

Referer:

提供Request的上下文信息

Transport

Connection

Connection:keep-alive 当一个网页加载完成后,客户端与服务端之间用于传输HTTP数据的TCP连接保持,如果客户端再次访问服务端,仍继续使用这一条连接。

Connection:close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接。

Host

请求报头主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。

HTTP Response Header

Cache

Date: 生成消息的具体时间和日期 Expires: 浏览器会在指定过期时间内使用本地缓存 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-Type:text/html;charset=GB2312 Content-Type: image/jpeg

Content-Length:指明实体正文的长度,以字节方式存储的十进制数字表示。在数据下行的过程中,Content-Length的方式预先在服务器中缓存数据,然后把数据一起发给客户端。

Content-Encoding: 表明返回数据的压缩算法

Content-Language: 表明返回数据的语言

Miscellaneous

Server:指明HTTP服务器的软件信息

X-AspNet-Version:header表明net版本

Transport

connection: 例如: Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接

例如: Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。

Location

Location

作用:用于重定向一个新的位置, 包含新的URL地址

实例请看304状态实例

原文地址:https://www.cnblogs.com/weikunzz/p/6857973.html