在浏览器地址栏键入URL,按下回车之后会经历以下流程:
- 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
- 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
- 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
- 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
- 释放 TCP连接;
- 浏览器将该 html 文本并显示内容;
HTTP
协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。
HTTP URL
HTTP URL
包含了用于查找某个资源的详细信息, 格式如下:
http://host[":"port][abs_path]
HTTP请求
下图是在网上找的一张图,觉得能很好的表达HTTP请求的所发送的数据格式。
由上图可以看到,http请求由请求行,消息报头,请求正文三部分构成。
HTTP请求状态行
请求行由请求Method
, URL
字段和HTTP Version
三部分构成, 总的来说请求行就是定义了本次请求的请求方式, 请求的地址, 以及所遵循的HTTP协议版本例如:
GET /example.html HTTP/1.1 (CRLF)
HTTP协议的方法有:
GET
: 请求获取Request-URI所标识的资源
POST
: 在Request-URI所标识的资源后增加新的数据
HEAD
: 请求获取由Request-URI所标识的资源的响应消息报头 ,与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
PUT
: 请求服务器存储或修改一个资源,并用Request-URI作为其标识
DELETE
: 请求服务器删除Request-URI所标识的资源
TRACE
: 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT
: 保留将来使用
OPTIONS
: 请求查询服务器的性能,或者查询与资源相关的选项和需求
HTTP请求头
消息报头由一系列的键值对组成,允许客户端向服务器端发送一些附加信息或者客户端自身的信息,主要包括:
HTTP请求正文
只有在发送POST
请求时才会有请求正文,GET
方法并没有请求正文。
HTTP请求报文
HTTP响应
与HTTP请求类似,先上一张图:
HTTP响应也由三部分组成,包括状态行,消息报头,响应正文。
HTTP响应状态行
状态行也由三部分组成,包括HTTP协议的版本,状态码,以及对状态码的文本描述。例如:
HTTP/1.1 200 OK (CRLF)
HTTP响应状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值: 1xx
:指示信息 - 表示请求已接收,继续处理 2xx
:成功 - 表示请求已被成功接收、理解、接受 3xx
:重定向 - 要完成请求必须进行更进一步的操作 4xx
:客户端错误 - 请求有语法错误或请求无法实现 * 5xx
:服务器端错误 - 服务器未能实现合法的请求
常见状态代码、状态描述、说明: 200
: OK - 客户端请求成功 400
: Bad Request - 客户端请求有语法错误,不能被服务器所理解 401
: Unauthorized - 请求未经授权,这个状态代码必须和WWW-Authenticate
报头域一起使用 403
: Forbidden - 服务器收到请求,但是拒绝提供服务 404
: Not Found - 请求资源不存在,eg:输入了错误的URL 500
: Internal Server Error - 服务器发生不可预期的错误 * 503
: Server Unavailable - 服务器当前不能处理客户端的请求,一段时间后,可能恢复正常
HTTP响应状态码说明
HTTP响应报文
HTTP协议详解
HTTP的五大特点
- 支持客户/服务器模式。
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有
GET
、HEAD
、POST
。每种方法规定了客户与服务器联系的类型不同。由于HTTP
协议简单,使得HTTP
服务器的程序规模小,因而通信速度很快。 - 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由
Content-Type
加以标记。 - 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。早期这么做的原因是请求资源少,追求快。后来通过
Connection: Keep-Alive
实现长连接 - 无状态:
HTTP
协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。