持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情
HTTP
HTTP全称超文本传输协议。
当用户请求一个web页面的时候,浏览器向服务器发出对该页面中所包含对象的HTTP请求报文,服务器接收到请求并用包含这些对象的HTTP响应报文进行响应
使用分层体系结构,HTTP协议不需要担心数据丢失,也不关注TCP从网络的数据丢失和乱序故障中恢复的细节,那是TCP以及协议栈较低层协议的工作。
1、无状态
HTTP是** 无状态协议,这里的无状态指的是短时间两次请求同一对象,服务器会重新发送对象,也就是每次的请求都是独立的**。为什么要这么设计呢?
原因一:从历史的角度去思考。在www应用还很简单的时候,这个应用只是被用来浏览内容。如果只是浏览内容的话,无状态的协议已经够了,这样实现可以减轻实现的负担。
原因二:维护成本高。因为随着Web应用的复杂化,某些场景下,我们希望一个Web站点能够识别用户。但是有状态的协议实现起来代价相对比较高,因为需要维护状态,根据状态来处理情况,如果用户访问一个页面后,在那个页面上逗留很久才跳转到另外一个页面,如果你需要我们在这两个页面(两个http请求应答)之间维持状态,是非常代价高的。
原因三:既然修改http本身代价高,后面我们想到解决方案,就是通过引入cookie、session这些来保持web应用之间的状态。而这些模块的引入相对于更改HTTP协议,实现起来更加简单,所以采用了这个方案,所以HTTP一直是无状态的协议。
2、持续连接和非持续连接
如果每个请求是经一个单独的TCP连接发送的,就是非连续连接
如果每个请求都是经过同一个TCP发送的,就是连续连接
HTTP既支持连续连接,也支持非连续连接,默认连续连接。
2.1非持续连接
其中非连续连接指的是每个TCP连接只传输一个请求报文和一个响应报文。
其中客户端请求HTML基本文件起到该客户收到整个文件止所花费的时间为两个往返时间加上服务器传输HTML文件的时间。其中TCP连接前两部分用了一个RTT,第三部分HTTP请求/响应用去一个RTT。
缺点:
1、每个请求的对象建立和维护一个全新的连接。对于每个这样的连接,在客户和服务器中都要分配TCP的缓冲区和保持TCP变量,这给Web服务器带来了严重的负担。
2、每个对象需要2倍RTT的交付时延,一个用于创建TCP,一个用于请求和接收对象
2.2持续连接
服务器发送响应后保持TCP连接打开,相同客户与服务器之间的后续请求和响应报文能够通过相同的连接进行传送。当一条连接经过一定时间间隔扔未被使用,HTTP服务器就关闭该连接。HTTP默认模式是带流水线的持续连接。
3、报文格式
3.1请求报文
通用格式
例子
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr
第一行叫请求行,包含方法字段,URL字段和HTTP版本字段。
方法字段包括GET(常用)、POST、HEAD、PUT、DELETE
/somedir/page.html表示URL字段,也就是说该服务器正在请求对象/somedir/page.html
HTTP版本字段表示该HTTP版本为1.1
后面的叫首部行
首部行Host: www.someschool.edu指明对象所在的主机,它主要是因为Web代理高速缓存所要求的,所以加上(高速缓存不要求)
首部行Connection: close 指的是发送完请求就关闭连接
首部行User-agent用来指明向服务器发送请求的浏览器类型(也就是用户代理),这里的是指火狐浏览器,加上这个的目的是为了让服务器给不同类型的用户代理发送相同对象的不同版本(可以理解为同一个软件,有安卓版本和苹果IOS版本)
首部行Accept-language表示浏览器支持的语言,这里指的是支持法语
实体主体主要根据请求行中的方法字段来决定的
GET方法时,实体主体为空
POST方法一般用在用户提交表单时的场景,实体主体包含的就是用户在表单字段中的输入值
HEAD方法类似GET方法,主要用于跟踪调试,服务器接收到HEAD方法请求的时候会用一个HTTP报文进行响应,但是不返回请求对象
PUT方法常常和Web开发工具联合使用
DELETE方法允许用户或应用程序删除web服务器上的对象
3.2响应报文
通用格式
例子
HTTP/1.1 200 OK
Connection: close
Date: Tue, 09 Aug 2011 15:44:04 GMT
Server: Apache/2.2.2.3 (CentOS)
Last-Modified: Tue, 09 Aug 2011 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data data ...)
第一行是状态行,有三个字段:协议版本字段、状态码和相应状态信息。这里显示服务器正在使用HTTP/1.1协议,并且一切正常
常见的状态码
| 状态码 | 状态码英文 | 中文描述 |
|---|---|---|
| 200 | OK | 请求成功,信息在返回的响应报文中 |
| 301 | Moved Permanently | 请求的对象被永久转移,新的URL定义在响应报文的Location中并返回:首部行中。客户软件将自动获取新的URL。今后任何新的请求都应使用新的URI代替 |
| 400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
| 404 | Not Found | 服务器中没有被请求的文档 |
| 505 | HTTP Version Not Supported | 服务器不支持请求的HTTP协议的版本,无法完成处理 |
第二行是首部行
通过Connection: close告诉客户,发送完报文后关闭TCP连接。
Date: 指的是服务器从它的文件系统中检索到该对象,插入到响应报文,并发送该响应报文的时间
Server:类似于请求报文中的User-agent,指的是该报文产生的服务器的名字。这里是Apache Web服务器产生的
Last-Modified: 最近一次修改的时间
Content-Length:被发送对象的字节数
Content-Type:指明实体体的对象
实体体就是请求的对象