HTTP 协议 理解

HTTP协议总结

看了一些关于HTTP协议的文章,现在自己也来总结下。

1. HTTP协议是什么

HTTP,即Hypertext Transfer Protocol,超文本传输协议。它是一种通信协议,用于将超文本HTML文档从Web服务器传输到客户端浏览器的传送协议。

它的发展是万维网协会和Internet小组合作的结果,最终发布了一系列的RFC,定义了HTTP协议,目前最流行的是HTTP1.1版本,由RFC2616定义。

2. 服务器和浏览器通信

当我们打开浏览器,在地址栏中输入URL,就看到了网页。这是怎样的呢?

首先浏览器会发送一条request请求命令给服务器,请求服务器上的一个资源,服务器接收到请求后,将包含资源的响应response发送给浏览器,浏览器解析其中的HTML最终生成网页。

URL给出了网络中资源的位置,request/response是基于HTTP协议的信息,在浏览器和服务器之间传送,用于获取资源。

3. URL

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

scheme://host[:port#]/path/.../[;url-params][?query-string][#anchor]

Scheme:指定使用的协议

Host:服务器的IP地址或者域名

Path:访问的资源的路径

Query-string:请求的参数

例如:http://www.baidu.com/s?wd=http表示使用HTTP协议,访问域名为www.baidu.com的服务器,路径为根目录,请求的参数为wd=http

4. HTTP请求

1) 组成

浏览器向服务器发送的请求消息由三部分组成:请求行、HTTP头和请求体。

请求行包括三个部分:请求的方法、资源的路径和HTTP版本。如:

GET  http://c.baidu.com/c.gif?t=0  HTTP/1.1

在请求中HTTP头可以是3HTTP头:1.请求头(request-header)2:普通头(general header)3:实体头(Entity header)

请求体不是必须的,POST方法请求时,提交的表单信息会保存在请求体中。

下面是使用Fiddler抓取的请求信息:

1.GET方式的请求信息

图2.POST方式的请求信息

2) HTTP请求方法

HTTP的请求方法有很多种,最基本的有4中:GETPOSTPUTDELETE,分别表示对资源的查、改、增、删。其中GETPOST最为常见,GET用于获取/查询资源,POST用于更新资源信息。现在看看GETPOST的区别:

1.GET通过url的参数向服务器发送信息,而POST将信息保存在请求体中。

2.GET提交的数据有长度限制,而POST没有,因为浏览器对URL的长度有限制。

3.GET方式效率高,但数据 存在安全性问题,可通过对URL加密提高安全性。

5. HTTP响应

1) 组成

HTTP响应也由3部分组成:状态行、HTTP头和响应体

状态行包括HTTP版本、状态码、状态描述。如:

HTTP/1.1 200 OK

HTTP协议中定义了5类的状态码,状态码由3位数字组成,第一个数字定义 了响应的类别:

1XX  提示信息 表示请求已被成功接收,继续处理

2XX  响应成功 表示请求已被成功接收,理解,接受

3XX  重定向 要完成请求必须进行更进一步的处理

4XX  客户端错误 -  请求有语法错误或请求无法实现

5XX  服务器端错误 -   服务器未能实现合法的请求

比较常见的如200404500等。200 OK表示请求响应成功,403 Forbidden,服务器拒绝提供资源,404 Not Found表示请求的资源部存在,没有找到,500Internal Server Error表示服务器发生了不可预期的错误。502 connection Failed连接失败了。

响应的HTTP头也有3个部分:响应头(response header)、普通头(general header)、实体头(entity header)

响应体就是服务器返回给浏览器的资源信息,可以是HTML页面,可以是一个图片。如:

3.HTTP响应信息

2) HTTP头:

下面来说下HTTP头,HTTP头符合W3C标准,按功能可分为4大类。

通用头(general header)

通用头即可以存在HTTP请求中,也可以包含在HTTP响应中,主要用来描述HTTP协议本身,如:描述HTTP连接是否持久的Connection头、HTTP发送日期Date头、HTTP所在TCP连接时间Keep-Alive头,用于缓存控制的Cash-Control头等。例如:

    Date: Sat, 05 Oct 2013 11:51:30 GMT

    Connection: close

    Cache-Control: max-age=86400

实体头(Entity header)

描述请求或响应体信息,如Content-Length描述实体的大小,Content-Type描述实体的类型,其他还有Content-LanguageContent-Encoding,以及控制实体缓存的ExpiresLast-Modifies等。例:

    Content-Length: 7687

    Content-Type: text/html

    Content-Encoding: gzip

    Content-Language: en-US

Last-Modified: Wed, 25 Sep 2013 03:39:17 GMT

Expires: Tue, 03 Oct 2023 11:57:31 GMT

请求头(request header)

由客户端发送到服务器端以便帮助服务器更好的满足客户端请求的头。只能出现在HTTP请求中。如:显示主机域的Host头、告诉服务器只接受某种响应的Accept头,发送CookieCookie头,用于缓存的If-MatchIf-Match-SinceIf-None-Match、用于只取HTTP响应信息中部分信息的Range头,用于附属HTML相关请求引用的Referer头等。

Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, */*

Accept-Language: zh-cn

Accept-Encoding: gzip, deflate

Referer: http://dict.youdao.com/minisite/index.s?uid=1302877188c31e1e3&uf=2

Cookie: BAIDUID=93640D76F89BA2C918D90C81C6C3F1AD

响应头(response header)

描述HTTP响应的头,不包括描述响应体信息的头。如显示服务器的server头、设置CookieSet-Cookie头、定时刷新的头Refresh,定时刷新的Retry-After头等。例:

Accept-Ranges: bytes

Server: Microsoft-IIS/6.0

6. HTTP协议网络层次

可以看到HTTP协议是应用层协议,是基于TCP协议的,而TCP是一个端到端的面向连接的协议。HTTP在开始传输之前需要建立TCP连接,经过所谓的“三次握手”后,建立TCP连接,然后就可以进行HTTP传输。在传输的过程中,连接不会中断,直到传输完成,服务器断开连接。

7. HTTP会话跟踪

    需要说明的是HTTP协议是无状态的,也就是说HTTP协议对于事务处理没有记忆能力,事务即一次请求响应的过程。因此服务器并不知道每一次的请求是否来自于同一个客户端。因此需要采用会话跟踪技术来让服务器知道请求来时于某个客户端,如URL重写、隐藏表单域、SessionCookie

URL重写:

所谓URL重写,就是为URL地址末尾添加参数,发送给服务器,这样服务器就可以从参数中获取客户端信息。如

http://www.xxx.com/xxx.jsp?var1=value1&var2=value2,通过参数var1var2来传递信息。

隐藏表单域:

将客户端信息保存在表单中,并将该表单隐藏。如html页面中通过设置表单的type为‘hidden’:

<input type="hidden" name="__userInfo" id="__user_id" value="f007">

Session:

Session机制是服务器端的一种机制,通过类似散列的结构保存信息。服务器创建session,保存客户端信息。当请求到达时包含session id服务器通过该id将保存的session检索出来,从中获取信息。

Cookie:

Cookie是将信息保存至客户端磁盘上,服务器每次从Cookie中获取用户信息。很多购物网站、微博、空间等都会通过Cookie保存用户信息,这样在下次登录时,会直接显示用户信息,而不用每次都重新输入。

7. HTTP持久连接

HTTP1.1版本默认支持持久连接,即Keep-Alive,也就是在一次请求中,不会将用于传输HTTP数据的TCP连接关闭,如果客户端再次访问该服务器上的网页会继续使用这条已经建立好的连接。Keep-Alive不会永久保持连接,不同的服务器会设置保持时间。

例如,访问百度首页,在浏览器中输入www.baidu.com

图4. HTTP持久连接

可以看到并不是简单的进行一次HTTP传输,该页面中不仅包含一个HTML页面,还有很多图片、应用程序等。浏览器获取到这些对象的引用会使用已建立好的连接再次发起请求获取资源,并最终将他们显示到页面中。

与之对应的HTTP1.0默认是非持久连接的,也就是每建立一次连接获取资源后,服务器即断开TCP连接。如果像上图那样则需要建立22次连接才能将整个页面完整的显示出来。由此可见持久连接的高效性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值