HTTP(HyperText Transfer Protocol)超文本传输协议,用于客户端和服务器端之间的通信。
HTTP协议的特点:
- 无状态:HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议自身不对请求和相应之间的状态进行保存。
- 无连接:每进行一次HTTP通信就要断开一次TCP连接。
- 简单快速:HTTP协议使用URI(Uniform Resource Identifier,统一资源标识符)定位互联网上的资源,需要访问哪一资源就输入对应的URL(Uniform Resource Locator,统一资源定位符),URL是URI的子级。
- 灵活:可以传输各种类型的数据。
HTTP请求报文:HTTP协议交互的信息称为HTTP报文。请求端(客户端)的报文称为请求报文,响应端(服务器端)的称为响应报文。
请求报文的结构:
- 请求行:包含用于请求的方法、HTTP协议及版本、请求的URI;
- 请求头:包含请求的各种条件和属性(key:value键值对);
- 空行:分割请求头和请求体之间的空行;
- 请求体:
响应报文的结构:
- 状态行:包含响应结果的状态码(200),原因短语(ok)及HTTP版本;
- 响应头:包含响应的各种条件和属性(key:value键值对);
- 空行:分割响应头和响应体之间的空行;
- 响应体:服务器返回的文档。
告知服务器意图的HTTP方法:
- POST:传输资源;
- GET:获取资源;
- HEAD:获取报文首部;
- PUT:传输文件;
- DELETE:删除文件。
POST与GET请求的区别:
- GET在浏览器回退是无害的,而POST会提交请求;
- GET请求会被浏览器主动缓存,POST不会,除非手动设置;
- GET请求在URL中传输的参数是有长度限制的,而POST无长度限制;
- GET请求的参数通过URL传递(不能传递敏感信息),POST的参数放在Request body中;
- GET请求的参数会被完整保留在浏览器历史记录中,POST请求中的参数不会被保留。
- ……
HTTP状态码:
类别 | 原因短语 | |
---|---|---|
1×× | 信息状态码 | 接受的请求正在处理 |
2×× | 成功状态码 | 请求正常处理完毕 |
3×× | 重定向状态码 | 需要进行附加操作以完成请求 |
4×× | 客户端错误状态码 | 服务器无法处理请求 |
5×× | 服务端错误状态码 | 服务器处理请求出错 |
状态码 | 含义 |
---|---|
200 | 客户端发来的请求在服务器端被正常处理 |
206 | 客户端进行了范围请求,而服务器端成功的执行了这部分的GET请求。响应报文中的Content-Range指定范围的实体内容 |
301 | 永久重定向,请求的资源已经被分配了新的URI,以后应使用资源现在的URI |
302 | 临时重定向,请求的资源已经被临时分配了新的URI |
304 | 服务端资源未改变,可直接使用客户端为过期的缓存 |
400 | 请求报文中存在语法错误 |
403 | 请求资源的访问被服务器拒绝 |
404 | 服务器上无法找到请求的资源 |
500 | 服务器端在执行时发生了错误 |
503 | 服务器暂时处于超负荷或正在进行停机维护,现在无法处理请求 |
持久连接:持久连接是为了解决HTTP协议无连接的特性(比如使用浏览器访问包含多张图片的HTML页面时,在发送请求访问HTML资源同时,也会请求该页面包含的其他资源。HTTP协议每次的请求都会造成无谓的TCP连接和断开,增加了通信的开销)。为了解决这个问题,HTTP\1.1和一部分HTTP\1.0想出了持久连接,也就是HTTP keep-alive的方法。持久连接的特点是只要任意一端没有明确提出断开连接,则保持TCP连接状态。在HTTP\1.1中,所有的连接默认都是持久连接,但在HTTP\1.0中并未标准化。
管线化:持久连接使得多次请求以管线化方式发送成为可能,从前发送请求需要等待并收到响应,才能发送下一个请求。管线化技术出来后,不用等待响应就可以直接发送下一个请求。这样就能够同时发送多个请求,而不用一个个等待响应了。