1.定义
Http(HyperText Transfer Protocol)是一个应用层协议,定义了应用间进程通信的的准则。
2.特点
1)传输效率高:
- Http是无状态的,即在数据传输的过程中,不保存任何历史和状态信息
- http协议是无连接的,所以在交换Http报文前,不需要建立Http连接(简化了服务器的设计,使服务器更容易的支持大量的并发请求)
- 传输格式简单,即在请求时,只需要传送请求方法和路径
2)传输可靠性高:
- 采用TCP作为运输层协议
- TCP协议:面向连接,可靠性高,交换报文时,需预先建立TCP连接
3)兼容性好(支持B/S,C/S模式)、灵活性高(Http允许传输任意类型的对象数据)
3.工作方式
Http协议采用请求/响应的工作方式,流程如下所示
-->服务端不断的监听TCP端口80(等待客户端发出连接请求)
-->客户端发送连接建立请求
-->双方建立TCP连接
-->客户端发送页面请求(HTTP请求报文)
-->服务端返回响应数据(HTTP响应报文)
-->关闭TCP连接
4.HTTP报文详解
1)请求报文
- 开始行(请求行):声明请求方法(get、post、delete、put等)、主机域名、资源路径和协议版本
- 首部行(请求头):声明客户端、服务器/报文的部分信息
- 实体主题(请求体):存放需要发送的数据信息
关于get方法和post方法的区别
- get方法:传递参数受长度限制(因为参数写在URL里);参数类型只允许ASCII字符;安全性较差;通常用于数据不敏感的小量数据。
- post方法:传递参数不受长度限制;参数类型可以是任何类型;安全性较高;通常用于大量的敏感数据。
常见的请求头
1)请求和响应报文通用Header
- Content-Type:请求体/响应体的类型,如:text/plain、application/json
- Accpet:说明接收的类型,可以用多个值,用“,(半角逗号)”隔开
- Content-Length:请求体/响应体的长度,单位字节
- Content-Encoding:告知对方接收的Content-Encoding
- ETag:给当前资源的标识,和Last-Modified、If-None-Match等配合,用于缓存控制
- Cache-Control:取值一般为no-cache或max-age=XX,XX为整数,表示该资源缓存有效期(秒)
2)常见请求Header
- Authorization:用于设置身份证信息
- User-Agent:用户表示,如OS和浏览器类型和版本
- If-Modified-Since:值为上一次服务器返回的Last-Modified值,用于确认某个资源是否被更改过,没有更改过(304)就从缓存中读取
- If-None-Match:值为上一次服务器返回的ETag值,一般会和If-Modified-Since一起出现
- Cookie:已有的Cookie
- Referer:表示请求引用自哪个地址,比如从页面A跳转到页面B时,值为页面A的地址
- Host:请求的主机和端口号
请求体:
存放需要发送给服务器的信息
2)响应报文
其中响应头、响应体与请求报文的请求头、请求体类似,最大的不同在于状态行和请求行
1)状态行
示例:HTTP/1.1 202 Accepted
(接受)、HTTP/1.1 404 Not Found
(找不到)
常见状态码:
- 1XX:表示信息通知,如请求收到了或者正在处理
- 2XX:表示成功,如果接受
- 3XX:表示重定向,如果请求完成还必须采取进一步行动
- 4XX:表示客户端错误,请求包含语法错误/无法实现
- 5XX:表示服务器错误,服务器不能实现一种明显无效的请求
2)响应头
请求/响应通用请求头可以看上面
响应头常见Header
关于Cookie,Cookie是由服务器生成的。客户端第一次向服务器发送Http请求时,由于没有Cookie,在Http请求头中即Header中不包含"Cookie"。此时在服务器返回的相应(HttpResponse)中会多一个字段"Set-Cookie",此字段的值就是服务器生成的Cookie值,下次再由此客户端程序访问该服务器时,就可以把该Cookie值放入Http请求头中。服务器就会知道是哪个用户再次访问了该服务器。客户端需要保存该Cookie以此用户再次访问服务器时使用。Cookie会有一个失效时间,客户端在Cookie失效后再次访问服务器,服务器会返回一个Cookie失效的状态码(比如403之类的),并在HttpResponse中包含"Set-Cookie"字段,这里面是新的Cookie。客户端需要做的操作是:1.将新Cookie覆盖旧的Cookie。2.跳入用户登录界面,让用户用新的Cookie重新登陆。Cookie 可以保存在SharePreferenced或者Sqlite中。
- Data:服务器时间
- Last-Modified:该资源最后被修改时间
- Transfer-Encoding:取值一般为chunked,出现在Content-Length不能确定的情况下,表示服务器不知道响应版本体的数据大小,一般同时还会出现Content-Encoding响应头
- Set-Cookie:设置Cookie
- Lication:重定向到另一个URL,如输入浏览器就是google.com回车,会自动跳到https:www.google.com,就是通过响应头控制的
- Sever:服务器后台
5.Http处理长链接的方式
http1.1默认保持长连接,即数据完成传输后TCP连接不断开,继续使用该通道传输数据
建立长链接
Http头部字符:Connection
- 不使用长连接: Connection:close
- 长连接的失败次数: Connection:keep-alive Keep-alive:max = 10(即链接超过该次数则断开)
- 长连接的超时时间: Connection:keep-alive Keep-alive:time = 10(即超过该时间则断开)
Keep-Alive机制:
Keep-Alive机制开启后,TCP层将定时发送相应的 Keep-Alive探针以确定链接的可以用性,以次来检测链接的有无
结束长链接:
- 判断传输数据是否达到了Content-Length指示的大小
- 根据chunked编码判断:若chunked编码的数据在最后有一个空的chunked快,则表明本次传输数据结束