什么是HTTP?
http是一个超文本传输协议,它是基于TCP协议的应用层传输协议,简单点说就是客户端和服务端进行数据传输的一种规则。
http是一个无状态协议,它本身不会对发送过得请求和响应的通信状态进行持久化处理。这样做的目的是为了保持http协议的简单性,从而能够快速处理大量的事务,提高效率。
一个HTTP请求包括三个组成部分:
1.统一资源标识符(URI)
2.请求的头部(request header)
3.主体内容 (request body)
一个标准的HTTP请求:
1、GET /index.html HTTP/1.1
2、Host: 127.0.0.1:8000
3、User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0
4、Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
5、Accept-Language:
zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
6、Accept-Encoding: gzip, deflate
7、Connection: keep-alive
8、Upgrade-Insecure-Requests: 1
9、空行
HTTP响应包括三部分:
1.方法一统一资源标识符号(URI)协议/版本
2.响应的头部
3.主体内容
一个标准的HTTP响应:
服务器 —> 发给 —> 浏览器。主旨内容包含 4 部分:
状态行: 包括 http 协议版本号, 状态码, 状态信息
消息报头: 说明客户端要使用的一些附加信息
空 行: 必须!
响应正文: 服务器返回给客户端的文本信息 以下是经服务器按照 http 协议,写回给浏览器的内容举例,1~9 行是协议头部分。注 意:9 行\r\n 的空行不可忽略
- HTTP/1.1 200 Ok
- Server: xhttpd
- Date: Fri, 18 Jul 2014 14:34:26 GMT
- Content-Type: text/plain; charset=iso-8859-1 (必选项) ->内容类型,定义网络文件的类型和编码
- Content-Length: 32 ( 要么不写 或者 传-1, 要写务必精确 ! ) ->HTTP的信息长度
- Content-Language: zh-CN
- Last-Modified: Fri, 18 Jul 2014 08:36:36 GMT
- Connection: close ->连接状态
- 空行
两者之间的一些区别
1、HTTP 1.1 支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
2.、HTTP 1.1 增加host字段
在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
3、100状态码(节约带宽)
HTTP/1.1加入了一个新的状态码100(Continue)。客户端事先发送一个只带头域的请求,如果服务器因为权限拒绝了请求,就回送响应码401(Unauthorized);如果服务器接收此请求就回送响应码100,
客户端就可以继续发送带实体的完整请求了。100 (Continue) 状态代码的使用,允许客户端在发request消息body之前先用request header试探一下server,看server要不要接收request body,再决定要不要发request body。
4、HTTP/1.1中引入了Chunked transfer-coding来解决上面这个问题,发送方将消息分割成若干个任意大小的数据块,每个数据块在发送时都会附上块的长度,最后用一个零长度的块作为消息结束的标志。这种方法允许发送方只缓冲消息的一个片段,避免缓冲整个消息带来的过载。
5、HTTP/1.1在1.0的基础上加入了一些cache的新特性,当缓存对象的Age超过Expire时变为stale对象,cache不需要直接抛弃stale对象,而是与源服务器进行重新激活(revalidation)