什么是Http协议?
Http协议是基于TCP/IP协议的应用层协议,它不包含数据包的传输,主要规定了客户端和服务器端之间的通信格式,默认端口为80端口。
Http协议的工作流程:
如上图:
- 客户端向服务器端发送request请求
- 服务器端监听端口,接收到客户端的请求
- 服务器发送response响应给客户端
- 客户端接收到服务器端的响应
客户端如何向服务器端发送request请求?
客户端主要是通过发送请求报文来向客户端发送request请求的。
请求报文的格式:
- 状态行
- 请求头
- 空行(个人认为是为了区分请求头与消息体的作用)
- 其他消息体
<method> <request-URL> <version>
<headers>
<entity-body>
1. 状态行包含请求方法,请求的URL和http版本。
a.请求方法:GET,POST,PUT,DELETE分别对应着对资源的查,增,改,删。这里主要介绍GET和POST方法。
b. 请求的URL
schema://host[:port#]/path/.../[?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/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
c. Http版本:常用的版本有:0.9 / 1.0 / 1.1 / 2
状态行的例子:
GET /books/?sex=man&name=Professional HTTP/1.1
表示请求方法为GET,请求的URL为/books/?sex=man&name=Professional
,所用的Http协议为1.1版本。
2. 请求头:
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
这里要注意的是Content-Type和Content-Length是在POST方式 下才有的,而对于GET方式是不存在的。
Host:表示主机域名
User-Age:表示用户代理,用来表明浏览用户的身份,让网页开发者可以得知访问终端的信息
Connection : 表示连接状态,一般设置为keep-Alive或close,分别表示连接状态和关闭状态
Content-Type:表示数据类型
常见的类型有如下:这些类型总称为MIME type
text/plain
text/html
text/css
image/jpeg
image/png
image/svg+xml
audio/mp4
video/mp4
application/javascript
application/pdf
application/zip
application/atom+xml
- Content-Length:表示数据长度
3. 其他消息体:
对于GET来说是不存在,因为它是将数据添加到URL的形式来传递数据的。
对于POST的请求:其中最后一行表示为消息体
POST / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
sex=man&name=Professional
响应报文:
- 状态行
- 响应头
- 响应正文
a. 状态行:
<HTTP-Version> <Status-Code> <Reason-Phrase CRLF>
HTTP-Version:表示服务器HTTP协议的版本
Status-Code:表示服务器发回的响应状态码
Reason-Phrase CRLF:表示状态码的文本描述
如下例子:
HTTP/1.1 200 OK
表示版本为1.1,状态码为200,描述为OK
常用的状态码:
- 200 OK 客户端请求成功
- 301 Moved Permanently 请求永久重定向
- 302 Moved Temporarily 请求临时重定向
- 304 Not Modified 文件未修改,可以直接使用缓存的文件。
- 400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解。
- 401 Unauthorized 请求未经授权。这个状态代码必须和WWW-Authenticate报头域一起使用
- 403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因
- 404 Not Found 请求的资源不存在,例如,输入了错误的URL
- 500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。
- 503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。
b. 响应头:显示一些信息,如下
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112
c. 响应正文:表示服务器返回的资源。
一个完整的响应示例:
HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112
<html>....</html>
Http连接模式的发展
我们知道HTTP协议采用的是“请求-应答”模式。HTTP 1.0版本采用的是“非Keep-Alive模式",我们暂且称它为普通模式。
a. 普通模式
对于每一个请求/应答,客户端和服务器端都需要新建一个TCP连接,完成之后立即断开连接。
然而,我们知道TCP连接的新建成本是很高的,因为需要客户和服务三次握手,并且开始时发送速率慢。为了解决这个问题,某些浏览器提供在请求头添加一个Connection: Keep-Alive字段。通过这样的方法来保持HTTP连接。
b. 持久连接(Keep-Alive):
在HTTP /1.1版本中,默认所有连接都被保持,如果加入”Connection: close"才关闭。