逐渐明白无论学什么Web开发技术,如JSP、ASP.NET、PHP,都需要掌握一门协议,那是HTTP协议,这是整个Web程序运行的基础,决定整理一下我对HTTP的认识。
整篇文章分为由以下几部分组成,1、浏览器访问网页的过程;2、HTTP协议简介,包括全称、版本、特点等;3、分析HTTP请求与HTTP响应;4、解析HTTP状态码。
1、浏览器访问网页过程
浏览器访问网页是一个非常复杂的过程,包含了查询本机Hosts文件,访问DNS,或经过代理服务器,这里简化为浏览器已经拿到目标主机IP,并且没有经过代理服务器。想要了解更多访问过程的知识查看我的这篇文章http://blog.youkuaiyun.com/jacklearntech/article/details/12239009。
2、HTTP协议简介
HTTP协议(Hyper Text Transfer Protocol),用于从WWW服务器传输超文本到本地浏览器的传送协议,是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。
IETF与W3C合作的结果,现在有两个稳定版本,HTTP 1.0和HTTP1.1,对应RFC文档获取地址为http://www.ietf.org/rfc/rfc1945.txt 和 http://www.ietf.org/rfc/rfc2616.txt ,目前使用的HTTP 1.1。
HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。默认HTTP的端口号为80,HTTPS的端口号为443。
特点:HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系,对http服务器来说,它并不知道这两个请求来自同一个客户端。这也就不难理解为什么JSP的request中数据每一个请求都是新的,可以通过session/cookie机制来解决此问题。
优点:
3、分析URL
URL(Uniform Resource Locator)统一资源定位器,用于描述一个网络上的资源, 基本格式如下
schema://host[:port#]/path/.../[?query-string][#anchor]
scheme 指定低层使用的协议(例如:http, https, ftp)
host HTTP服务器的IP地址或者域名
port# HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如 http://www.youkuaiyun.com:8080/
path 访问资源的路径
query-string 发送给http服务器的数据
anchor- 锚
http://www.youkuaiyun.com/fuck/fuck/fuck.aspx?name=hehe&male=true#cao
Schema: http
host: www.youkuaiyun.com path: /fuck/fuck/fuck.aspx Query String: name=hehe&male=true Anchor: cao
3、分析HTTP请求消息结构
请求消息分为3部分,第一部分叫Request line, 第二部分叫Request header, 第三部分是body. header和body之间有个空行, 结构如下图
第一行中的Method表示请求方法,比如"POST","GET", Path-to-resoure表示请求的资源, Http/version-number 表示HTTP协议的版本号
当使用的是"GET" 方法的时候, body是为空的;使用POST时,body中会有内容
比如我们打开优快云首页的request 如下
GET http://www.youkuaiyun.com/ HTTP/1.1
Host: www.youkuaiyun.com
抽象的东西,难以理解,老感觉是虚的, 所谓眼见为实, 实际见到的东西,我们才能理解和记忆。 我们今天用Fiddler,实际的看看Request和Response.
下面我们打开Fiddler 捕捉一个csdn登录的Request 然后分析下它的结构, 在Inspectors tab下以Raw的方式可以看到完整的Request的消息, 如下图
4、分析HTTP响应消息结构
我们再看Response消息的结构, 和Request消息的结构基本一样。 同样也分为三部分,第一部分叫状态行, 第二部分叫消息报头,第三部分是响应正文. 消息报头与响应正文之间也有个空行, 结构如下图
HTTP/version-number表示HTTP协议的版本号, status-code 和message 请看下节[状态代码]的详细解释.
我们用Fiddler 捕捉一个www.youkuaiyun.com然后分析下它的结构, 在Inspectors tab下以Raw的方式可以看到完整的Response的消息, 如下图
5.从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方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
6、解析HTTP状态码
请看我的这篇文章