Http全称?
超文本传输协议:Hypertext Transfer protocol
常用状态码
1 | - 200 响应正常 |
常用method
1 | - get 用于获取资源 |
Http协议格式
请求和响应的消息协议是一样的:起始行、消息头、消息体。三部分以CRLF分隔,最后一个消息头有两个CRLF,表示接下来是消息体的内容了。
起始行
请求的起始行称为请求行,格式:method uri http/version,如 get /index.html http/1.1
响应的起始行称为状态行,格式 :http/version code desc,如 http/1.1 200 ok。第三个字段是状态码的简单描述信息。
消息头
消息头由很多键值对组成,键值对之间以CRLF作为分隔。
消息体
消息体是一个字符串,字符串长度由消息头中的Content-length字段指定。没有指定则没有消息体。
分块传送
当浏览器向服务器请求一个资源时,该资源是一个动态资源,服务器无法预知该资源的大小。此时会采用分块传送。
服务器先生成一个chunk,发送这个chunk,再生成一个chunk,再发送一个chunk,直到全部资源传送完成。分块传送需要在请求头增加一个特殊的键值对transfer-encoding: chunked,那么消息体的内容便是分块传送的。
chunked传输格式如下图所示,由一段一段的分块组合而成,每个块由一个长度行和一个分块体组成,最后一个分块长度为0表示结束。
持久连接的机制是怎样的
早期的Http 1.0每个请求都会发起一个连接,每个页面数百个请求就会发起数百个连接,非常浪费服务器资源。因此在Http 1.1加入了持久连接的机制,Keep-Alive,使得一个连接可以连续服务多个请求。节省了资源
持久连接并不会一直保持连接,而是通过设置 Keep Alive Timeout和Keep Alive Request限制单个连接的持续时长和最多的请求次数。
如果 Keep Alive Timeout设置为0,则退化到非持久连接。如果Keep Alive Timeout设置为超长,当然也不会一直保持,各个浏览器都有相关的控制。
什么叫Pipeline管线化
这也是Http 1.1新引入的特性。之前的请求模式是:一个请求发起,服务器响应完了,再进行下一个请求的发起和响应,这样当请求一多时就会很慢
改进的方式是,将多个请求按顺序打包一起发给服务器,服务器再按顺序将多个响应一起打包回复。这样就快很多了。如下图示很形象地描述了管线化前和管线化后
如何理解Http协议的无状态性
无状态指的是服务器的协议层无需为不同请求之间建立任何相关关系。不过这是协议规定的,但建立在Http协议上的应用会通过Session的方式来达到状态保存的目录。
GET和POST的区别
- GET用于获取资源,POST用于向服务器发送数据
- GET将数据添加到URL后,POST则是将数据放在请求消息体中
- 由第二点导致了如下三点的不同
- GET相对POST能让用户看到传输内容,不安全
- GET由于URL长度的限制传输内容有限,POST则好很多
- GET由于URL的编码限制只能传输ASCII码,而POST则可以传输正常编码格式的文件
常见Http消息头字段
通用头部字段
1 | - Date 报文创建时间 |
请求头部字段
1 | - Host 请求资源所在服务器:主机+端口 |
响应头部字段
1 | - Accept-Ranges 可接受的字节范围 |
实体头部字段
1 | - Allow 资源可支持的Http方法 |
其它知识补充
应用层协议
- HTTP
- FTP
- SMTP
- DNS
- TELNET