HTTP协议

什么是HTTP协议
协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则, 超文本传输协议 (HTTP,HyperText Transfer Protocol)是 互联网 上应用最为广泛的一种 网络通信协议 ,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。目前我们使用的是 HTTP/1.1 版本 。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收 HTML 页面的方法。1960年美国人 Ted Nelson 构思了一种通过 计算机 处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。

Web服务器,浏览器,代理服务器
Web内容都是存储在Web服务器上的。Web服务器所使用的是HTTP协议,因此也被称为HTTP服务器。当然最常见的客户端就是Web浏览器。

   当我们打开浏览器,在地址栏中输入URL,然后我们就看到了网页。 原理是怎样的呢?
  实际上我们输入URL后,我们的浏览器给Web服务器发送了一个 Request , Web服务器接到Request后进行处理,生成相应的 Response ,然后发送给浏览器, 浏览器解析Response中的HTML,这样我们就看到了网页,过程如下图所示


  我们的Request 有可能是经过了 代理服务器 ,最后才到达Web服务器的。过程如下图所示


  代理服务器就是网络信息的中转站,有什么功能呢?
  1. 提高访问速度, 大多数的代理服务器都有缓存功能。
  2. 突破限制, 也就是翻墙了
  3. 隐藏身份。
资源
dWeb服务器是Web资源的宿主。Web资源是Web内容的源头。Web资源可以是静态文件,也可以是动态文件。可以是任意格式。 所有 能够提供 Web 内容的东西都是 Web 资源。



URI
每个Web服务器资源都有一个名字,这样客户端就可以说明他们感兴趣的资源是什么了。服务器资源名被称为统一资源标识符(U niform Resource Indetifier,URI)。URI就像因特网上的邮政地址一样,在世界范围内唯一标识并定位信息资源。
URI有两种形式,分为称为URL和URN。现在几乎所有的URI都是URL。

URL详解
   URL(Uniform Resource Locator) 地址用于描述一个网络上的资源,  基本格式如下
schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]
   scheme        指定低层使用的协议(例如:http, https, ftp)
   host              HTTP服务器的IP地址或者域名
   port#            HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如 http://www.cnblogs.com:8080/
   path              访问资源的路径
   query-string      发送给http服务器的数据
   anchor              锚

URL 的一个例子
http://www.mywebsite.com/sj/test;id=8079?name=sviergn&x=true#stuff
Schema: http
host: www.mywebsite.com
path: /sj/test
URL params: id=8079
Query String: name=sviergn&x=true
Anchor: stuff

HTTP协议是无状态的
   http协议是无状态的,同一个客户端的这次请求和上次请求是没有对应关系,对http服务器来说,它并不知道这两个请求来自同一个客户端。 为了解决这个问题, Web程序引入了 Cookie 机制来维护状态.


HTTP消息的结构
事务和报文
客户端是怎样通过HTTP与Web服务器及其资源进行事务处理的呢?一个 HTTP事务 由一条请求命令(从客户端发往服务器)和一个响应(从服务器发回客户端)结果组成。这种通信是通过名为 HTTP报文 (HTTP Message)的格式化数据块进行的。
HTTP事务:


简单HTTP报文:




下边是登录公司项目中的浏览器和服务器的通信信息(Network),当浏览器读取到网页的HTML源码后,它会解析HTML,显示页面,然后,根据HTML里面的各种链接,再发送HTTP请求给对应的服务器,拿到相应的图片、视频、Flash、JavaScript脚本、CSS等各种资源,最终显示出一个完整的页面。所以我们在 Network 下面能看到很多额外的HTTP请求。


Get和Post方法的区别
   Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是 GET,POST,PUT,DELETE . 一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST, PUT, DELETE就对应着对这个资源的查,改,增,删4个操作。 我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.
  我们看看GET和POST的区别
  1. GET提交的数据会放在URL之后 ,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456.  POST方法是把提交的数据放在HTTP包的Body中
  2. GET提交的数据大小有限制 (因为浏览器对URL的长度有限制), 而POST方法提交的数据没有限制
  3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
  4. GET方式提交数据,会带来 安全问题 ,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。

请求头格式
  • 通用头(general-header):
Cache-Control :客户端希望服务端如何缓存自己的请求数据,如"Cache-Control: no-cache","Cache-Control: max-age=0";
Connection :客户端是否希望与服务端之间保持长连接,如"Connection: close", "Connection: keep-alive";
Date :只有当请求方法为POST或PUT方法时客户端才可能会有些字段;
Pragma :包含了客户端一些特殊请求信息,如 "Pragma: no-cache" 客户端希望代理或应用服务器不应缓存与该请求相关的结果数据;
Via :一般用在代理网关向应用服务器发送的请求头中,表明该来自客户端的请求经过了网关代理,     格式为:"Via: 请求协议版本  网关标识   [其它信息] ",     如 :" Via: 1.1  webcache_250_199.hexun.com:80 (squid)"
 
  • 请求头(request-header):
Accept : 表明客户同端可接受的请求回应的媒体类型范围列表。星号“*”用于按范围将类型分组,用“*/*”指示可接受全部类型;用“type/*”指示可接受 type类型的所有子类型,如“ Accept: image/gif, image/jpeg, */*”;
Accept-Charset :客户端所能识别的字符集编码格式,格式:“Accept-Charset: 字符集1[:权重],字符集2[:权重]”,如:“ Accept-Charset: iso-8859-5, unicode-1-1;q=0.8”;
Accept-Language :客户端所能识别的语言,格式:“Accept-Language: 语言1[:权重],语言2[:权重]”,如:” Accept-Language: zh, en;q=0.7”;
Host :客户请求的主机域名或主机IP,格式:“Host: 域名或IP[:端口号]”,如:“Host: www.hexun.com:80“,请求行中若有HTTP/1.1则必须有该请求头;
User-Agent :表明用户所使用的浏览器标识,主要用于统计的目的;
Referer :指明该请求是从哪个关联连接而来;
Accept-Encoding :客户端所能识别的编码压缩格式,如:“Accept-Encoding: gzip, deflate”;
If- Modified-Since :该字段与客户端缓存相关,客户端所访问的URL自该指定日期以来在服务端是否被修改过,如果修改过则服务端返回新的修改后 的信息,如果未修改过则服务器返回304表明此请求所指URL未曾修改过,如:“If-Modified-Since: Fri, 2 Sep 2006 19:37:36 GMT”;
If-None-Match :该字段与客户端缓存相关,客户端发送URL请求的同时发送该字段及标识,如 果服务端的标识与客户端的标识一致,则返回304表明此URL未修改过,如果不一致则服务端返回完整的数据信息,如:“If-None-Match: 0f0a893aad8c61:253, 0f0a893aad8c61:252, 0f0a893aad8c61:251”;
Cookie :为扩展字段,存储于客户端,向同一域名的服务端发送属于该域的cookie,如:“Cookie: MailUserName=whouse”;
 
  • 实体头(entity-header): (此类头存在时要求有数据体)
Content-Encoding :客户端所能识别的编码压缩格式,如:“Content-Encoding: gzip, deflate”;
Content-Length :客户端以POST方法上传数据时数据体部分的内容长度,如:“ Content-Length: 24”;
Content- Type :客户端发送的数据体的内容类型,如:“Content-Type: application/x-www-form-urlencoded”为以普通的POST方法发送的数据;“Content-Type: multipart/form-data; boundary=---------------------------5169208281820”,则表明数据体由多部分组成,分隔符为 “-----------------------------5169208281820”;
 
响应格式
  • 通用头(general-header):
Cache- Control :服务端要求中间代理及客户端如何缓存自己响应的数据,如“Cache-Control: no-cache”,如:“Cache-Control: private” 不希望被缓存,“Cache-Control: public” 可以被缓存;
Connection :服务端是否希望与客户端之间保持长连接,如“Connection: close”, “Connection: keep-alive”;
Date :只有当请求方法为POST或PUT方法时客户端才可能会有些字段;
Pragma :包含了服务端一些特殊响应信息,如 “Pragma: no-cache” 服务端希望代理或客户端不应缓存结果数据;
Transfer-Encoding :服务端向客户端传输数据所采用的传输模式(仅在HTTP1.1中出现),如:“Transfer-Encoding: chunked”,注:该字段的优先级要高于“Content-Length” 字段的优先级;
 
  • 响应头(response-header):
Accept-Ranges :表明服务端接收的数据单位,如:“Accept-Ranges: bytes”, ;
Location :服务端向客户端返回此信息以使客户端进行重定向,如:“Location: http://www.hexun.com”;
Server :服务端返回的用于标识自己的一些信息,如:“ Server: Microsoft-IIS/6.0”;
ETag :服务端返回的响应数据的标识字段,客户端可根据此字段的值向服务器发送某URL是否更新的信息;
 
  • 实体头(entity-header): (此类头存在时要求有数据体)
Content-Encoding :服务端所响应数据的编码格式,如:“Content-Encoding: gzip”;
Content-Length :服务端所返回数据的数据体部分的内容长度,如:“ Content-Length: 24”;
Content-Type :服务端所返回的数据体的内容类型,如:“Content-Type: text/html; charset=gb2312” ;
Set-Cookie :服务端返回给客户端的cookie数据,如:“ Set-Cookie: ASP.NET_SessionId=icnh2ku2dqlmkciyobgvzl55; path=/”

服务器返回状态码
每条HTTP响应报文返回时都会携带一个状态码。状态码是一个三位数字的代码,告知客户端请求是否成功,或者是都需要采取 其他动作。
1xx:表明服务端接收了客户端请求,客户端继续发送请求;
2xx:客户端发送的请求被服务端成功接收并成功进行了处理;
3xx:服务端给客户端返回用于重定向的信息;
4xx:客户端的请求有非法内容;
5xx:服务端未能正常处理客户端的请求而出现意外错误。
 
举例:
“100”  ; 服务端希望客户端继续;
“200”  ; 服务端成功接收并处理了客户端的请求;
“301”  ; 客户端所请求的URL已经移走,需要客户端重定向到其它的URL;
“304”  ; 客户端所请求的URL未发生变化;
“400”  ; 客户端请求错误;
“403”  ; 客户端请求被服务端所禁止;
“404”  ; 客户端所请求的URL在服务端不存在;
“500”  ; 服务端在处理客户端请求时出现异常;
“501”  ; 服务端未实现客户端请求的方法或内容;
“502”  ; 此为中间代理返回给客户端的出错信息,表明服务端返回给代理时出错;
“503”  ; 服务端由于负载过高或其它错误而无法正常响应客户端请求;
“504”  ; 此为中间代理返回给客户端的出错信息,表明代理连接服务端出现超时。

客户端与服务器的连接
基本的浏览器连接处理

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值