HTTP是超文本传输协议(Hyper Text Transfer Protocol)的简称,设计之初是为了将HTML(超文本标记语言)文档从Web服务器传送到客户端的浏览器,但现在HTTP已经不局限与HTML的传输。HTTP是万维网(World Wide Web,www,也简称Web)的基础。同时HTTP协议是TCP/IP协议栈的应用层协议。
HTTP是面向事务的(transaction-oriented),HTTP事务=请求命令+响应结果(通过HTTP报文的格式化数据块进行的)。
客户端加载完成一个任务,如加载一个多图片的事务,需要多个事务,先完成加载页面的框架,然后完成加载图片的事务。
1.支持Client/Server模式。
2.简单快速:客户端向服务器请求服务时,只需发送请求方法和路径,请求的常用方法有GET、POST、DELETE。每种方法规定了客户端与服务器连接的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而速度很快。
3.灵活:HTTP允许传输任意类型的对象。传输类型有Content-Type加以标记,使用MIME类型区分数据格式,能够传输MIME类型有text/html、text/plain、image/jpeg和image/gif等。
4.无连接:每次连接只处理一个请求,服务器处理完客户端的请求,并收到客户的应答后,即断开连接。无连接的方式能够节省传输时间。但可以使用持续连接,即在传送完所请求的对象后,不释放TCP连接。
5.无状态:HTTP是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。可以使用Cookie保存HTTP服务器与客户端之间的状态信息。
URI(uniform resources identifier)为同一资源标识符,URL(uniform resource locator)为同一资源定位符,URI只是一个字符串的格式规范,于指定标识Web资源的字符串的各个不同部分,用于唯一标识一个资源。而URL是特定的URI,它是资源定位的规范,可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。
URL格式: protocol://host[:port]/path/[;parameters][?query][#fragment]
URL示例
http://www.website.com/p/test:p=test?name=test#top
protocol: http
host: www.website.com
path: /p/test
parameters: p=test
query: name=test
fragment: top
http请求由三部分组成,分别是:Request line(请求行)、http header(消息报头)、body(请求正文),如下图所示:(CRLF表示回车符+换行符,不同颜色之间用空格隔开)
请求行:包括请求的方法,请求资源的路径及请求的版本。
消息报头:包括实体报头请求报头。实体报头下面会介绍。
常用的请求报头
请求正文:包含一些提交给服务器的参数,如用户名,用户密码,是否为移动端访问等。
--- GET请求的消息格式 ---
GET /s?ie=utf-8&f=8&tn=baidu&wd=test HTTP/1.1 //---请求行
---http消息报头---
Accept: text/html, application/xhtml+xml, */*
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; TheWorld 6)
Accept-Encoding: gzip, deflate
Host: www.baidu.com
Connection: Keep-Alive
Cookie: ...
--- POST请求的消息格式 ---
POST /login HTTP/1.1 //---请求行
Accept: text/html,application/xhtml+xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Cache-Control: max-age=0
Connection: keep-alive
Content-Length: 744
Content-Type: application/x-www-form-urlencoded
Cookie: ...
Host: passport.baidu.com
Origin: https://passport.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36
---body---
charset: UTF-8
token: 326bc45afb8774977429e10e2c65b303
u: http://www.baidu.com/
isPhone:false
username: 12345678901
password: ...
请求访问除了POST与GET请求方法外,还有其他的请求方法,常见的请求方法如下图所示:
HTTP响应也是由三个部分组成,分为:状态行、消息报头、响应正文,如下图所示:
状态码由三位数字组成,第一个数字定义了响应的类别,有5中取值:
状态码 | 代表含义 |
---|---|
1xx | 指示信息–表示请求已接收,继续处理 |
2xx | 成功–表示请求已被成功接收、理解、接受 |
3xx | 重定向–要完成请求必须进行更进一步的操作 |
4xx | 客户端错误–请求有语法错误或请求无法实现 |
5xx | 服务器端错误–服务器未能实现合法的请求 |
常见的状态码:
200 OK 客户端请求成功
400 Bad Request 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden 服务器收到请求,但是拒绝提供服务
404 Not Found 请求资源不存在,eg:输入了错误的URL
500 Internal Server Error 服务器发生不可预期的错误
503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后,可能恢复正常
2. 消息报头,与请求的消息报头一样,包括实体报头与响应报头。
常用的响应报头:
3. 响应正文,是服务器返回的资源的内容,如HTML文件与JSON文件、图片等。
--- 响应的消息格式 ---
HTTP/1.1 200 OK //---状态行
Content-Type: text/html
Content-Length: 42066
Connection: keep-alive
Date: Sat, 12 Mar 2016 12:43:49 GMT
Server: SWS
Vary: Accept-Encoding
Cache-Control: no-transform,
max-age=120
Expires: Sat, 12 Mar 2016 12:45:49 GMT
Last-Modified: Sat, 12 Mar 2016 12:30:08 GMT
Content-Encoding: gzip
<!DOCTYPE HTML>
<html>
<head>
...
</head>
</html>
请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文(eg:有无实体正文)和请求所标识的资源的元信息。
常见的实体报头:
HTTP协议最开始版本为http 1.0,现在普遍使用的是http 1.1,下一代HTTP协议是HTTP 2.0。
HTTP是一种基于SSL/TLS的HTTP,所有的HTTP数据都是在SSL/TLS协议封装之上传输的。简单来说,HTTPS是安全版的HTTP,将HTTP的数据进行加密,其所用的端口是443。
参考引用:http://www.cricode.com/1880.html
原文:http://www.cnblogs.com/codingexperience/p/5274221.html