前两天刚到公司报道上班,看了两天的文档就到五一放假了,趁着放假的三天时间打算好好复习下http协议的相关知识
一 URL详解
uri: uniform resource identifier统一资源标识符
url: uniform resource locator统一资源定位符,是通过web浏览器访问资源的
urn: uniform resource name,统一资源命名,是通过名字来标识资源
URL(Uniform Resource Locator) 地址用于描述一个网络上的资源, 基本格式如下:
schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]
http://www.mywebsite.com/sj/test;id=8079?name=sviergn&x=true#stuff
scheme:指定低层使用的协议(例如:http, https, ftp)
host:HTTP服务器的IP地址或者域名
port#:HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如http://www.mywebsite.com:8080/
path:访问资源的路径
url-params:
query-string:发送给http服务器的数据
anchor:锚
二 http协议
http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
无状态
http协议是无状态的,同一个客户端的这次请求和上次请求是没有对应关系,对http服务器来说,它并不知道这两个请求来自同一个客户端。 为了解决这个问题, Web程序引入了Cookie机制来维护状态。
Web服务器,浏览器,代理服务器
当我们打开浏览器,在地址栏中输入URL,然后我们就看到了网页。 原理是怎样的呢?
实际上我们输入URL后,我们的浏览器给Web服务器发送了一个Request, Web服务器接到Request后进行处理,生成相应的Response,然后发送给浏览器, 浏览器解析Response中的HTML,这样我们就看到了网页,过程如下图所示
我们的Request 有可能是经过了代理服务器,最后才到达Web服务器的。过程如下图所示:
代理服务器就是网络信息的中转站,有什么功能呢?
1. 提高访问速度, 大多数的代理服务器都有缓存功能。
2. 突破限制, 也就是翻墙了。
3. 隐藏身份。
4. 限制访问。
请求报文(Request)
第一部分叫请求行(request-line), 第二部分叫http header(首部行), 第三部分是entity body。header和body之间有个空行,如下图所示:
第一行中的Method表示请求方法,比如"POST","GET", Path-to-resoure(Request-URI)表示请求的资源路径(相对URL), HTTP/version-number 表示HTTP协议的版本号。当使用的是"GET" 方法的时候, body是为空的。
HTTP请求报文的一些方法
方法就是对所请求的对象进行的操作,这些方法实际上就是一些命令。最基本的有4种:GET POST PUT DELETE。URL用于描述网络上的一个资源,而HTTP请求报文的METHOD则对应着对这个资源的不同操作。
GET:请求读取资源(查询)
POST:给服务器添加信息(更新)
PUT:在指明的URL下存储一个文档(增加)
DELETE:删除指明的URL所标志的资源(删除)
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上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。
响应报文(Response)
和Request消息的结构基本一样。 同样也分为三部分,第一部分叫status-line, 第二部分叫response header,第三部分是entity body. header和body之间也有个空行,如下图所示:
HTTP/version-number表示HTTP协议的版本号, 状态码(status-code)和短语(message) 请看下文的详细解释。
状态码用来告诉HTTP客户端,HTTP服务器是否产生了预期的Response,共分5大类33种:
HTTP/1.1中定义了5类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别
1XX 提示信息 - 表示请求已被成功接收,继续处理
2XX 成功 - 表示请求已被成功接收,理解,接受
3XX 重定向 - 要完成请求必须进行更进一步的处理
4XX 客户端错误 - 请求有语法错误或请求无法实现
5XX 服务器端错误 - 服务器未能实现合法的请求
看看一些常见的状态码
200 OK 最常见的就是成功响应状态码200了, 这表明该请求被成功地完成,所请求的资源发送回客户端
302 Found 重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request
304 Not Modified 代表上次的文档已经被缓存了, 还可以继续使用
400 Bad Request 客户端请求语法错误,不能被服务器所理解
403 Forbidden 服务器收到请求,但是拒绝提供服务
404 Not Found 请求资源不存在(输错了URL)
500 Internal Server Error 服务器发生了不可预期的错误
503 Service Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常