HTTP协议是位于TCP协议之上的应用层协议,是应用进程之间通讯的一种协议。之所以称之为应用层协议,是因为它无需关心数据是通过什么方式到达对端的,在到达对方的应用程序之前都经历了什么,而只需要协商好使用的数据格式,保证一方可以解析出另一方的意图即可
这也是TCP/IP协议的真正目的,上层无需过度关心底层的实现细节
当用户在浏览器上输入一段网址后,主要经历了以下几个阶段
- dns解析,通过主机名找到主机ip地址
- 向对应ip地址和端口(默认是80)发送连接请求,服务器接收请求(三次握手)
- 浏览器发送HTTP请求报文段
- 服务器解析HTTP请求,生成响应报文段
- 浏览器解析HTTP响应,将资源信息显示在屏幕上
- 保持连接或者断开连接,取决于是否开启keep-alive
可以参考这篇博客,讲得比较详细从输入URL到页面加载发生了什么
URL格式
不管是否学过HTTP协议,总听过URL这个东西吧,平时输入在浏览器上的网址,自然就是URL本尊了。但是URI又是什么呢
URI学名叫统一资源标识符,它有两种形式,分别是URL和URN
URL,统一资源定位符是URI最常见的形式,它描述了资源在一台特定服务器上的特定位置。比如输入下面的网址时
http://www.balabala.com/index.html
实际上要访问的资源就是目标主机服务器当前目录下的index.html文件,而
http://www.balabala.com/image/hello.jpg
要访问的是目标主机服务器当前目录下的image子目录下的hello.jpg文件
通过URL可以准确定位一个资源的具体位置。但是如果服务器主机的内部目录有所改变,那么网站就要改变了
URL的完整格式如下
虽然很复杂,但是基本上没有哪个URL包含的这么完整,由于http默认端口号是80,经常省略,所以通常使用协议,地址,路径三部分就足以定位到某个主机的某个资源了,比如下面这段URL
http://www.balabala.com/index.html
其中http就是采用的协议,www.balabala.com代表目标服务器的主机ip或者主机名,/index.html表示目标主机的资源路径
除了上述三部分,出现次数比较多的还有查询字符串,它由?标识开始,通常是将后面出现的变量值作为参数传递给访问的资源(动态资源)。比如下面的URL
http://www.balabala.com/cgi-bin/adder?a=1&b=2
首先从中截取出资源位置/cgi-bin/adder(这里假设adder是一个可执行文件,接收两个数,返回加法和)
并将1和2作为参数调用/cig-bin/adder这个程序,然后将计算结果返回给客户端
URN称为统一资源名,是通过文件名定位资源的一种形式,目前正在研究中。。。
HTTP请求报文段
客户端与服务器的通信是基于HTTP协议的,通信双方发送的数据格式必须符合HTTP协议标准,这样接收方才能解析出发送方的意图。
HTTP协议规定必须是客户端先发送请求,然后服务器处理后发送响应。服务器不能在没有收到客户端请求的情况下主动发送数据给客户端。
websocket正是为了解决这一问题而诞生的,比如一个获取时间的web服务器,一有连接就将当前时间主动发给客户端
请求报文段分为请求行,请求头,请求体(数据实体)三部分。请求行由方法名,资源路径,版本号三部分组成
GET /index.html HTTP/1.1
方法名
方法名指出客户端的意图,常用的几个方法名有GET, POST, HEAD, PUT, OPTIONS, TRACE等
GET
GET是最常用的方法,当客户端想要从服务器上获取某个资源的内容时使用。服务器将资源内容作为响应报文段的数据实体返回
HEAD
HEAD方法与GET类似,但是服务器只通过HTTP响应头返回资源的信息(如文件大小,类型等),响应报文段的数据实体为空
PUT
PUT方法表示客户端想要在服务器上生成一个文件,文件名由请求行的资源路径指出,文件内容由数据实体指出。如果服务器上存在同名文件,则覆盖
POST
POST方法表示客户端打算向服务器提交某些数据,比如图书管理员想要向服务器的数据库中增加新图书,就可以通过POST方法提交一个表单,包含图书的各种信息
TRACE
TRACE方法表示客户端想要看看自己发送的请求报文段是什么样子,也就是服务器回复的HTTP响应头的数据实体部分是它收到的请求报文段。由于在HTTP请求报文段被送往服务器的过程中可能会途径代理服务器,而代理服务器可能会更改请求报文段,为了一探究竟,客户端可以使用TRACE方法
OPTIONS
OPTIONS方法用于获取服务器支持的所有方法名,以防止客户端使用了服务器不支持的方法
DELETE
DELETE方法用于将服务器上的某个资源删掉,是否删除取决于服务器
HTTP响应报文段
HTTP响应报文段由响应行,响应头,响应体(数据实体)三部分组成。当服务器处理完客户端的请求后会发送响应报文段给客户端告知服务器的处理结果
比如客户端想要获取目标资源/index.html的内容,如果服务器正确找到index.html文件,就会将它的内容作为数据实体返回给客户端。但是如果服务器没有找到/index.html文件或者无法识别HTTP请求信息,就会返回一个代表出错的响应报文段
响应行包含了HTTP协议版本号,状态码和状态信息
HTTP/1.1 200 OK
状态码
状态码用于说明服务器对于客户端请求的处理情况,分成五大类,范围从100到599总共600个
100~199代表信息性状态码
使用不多
200~299代表成功状态码
这些状态码表示客户端的请求服务器已经成功处理。常见的状态码及解释如下
300~399代表重定向状态码
这些状态码告知客户端要么使用替代的位置访问想要的资源,要么告诉服务器可以返回什么来替代资源内容
比如客户端请求服务器上的一个资源信息,但是这个资源已经移动到其它地方了,此时服务器会将资源的新位置返回给客户端,随后客户端重新请求资源信息
常见的状态码有
400~499代表客户端错误状态码
比如最讨厌的404,它表示服务器对客户端请求的资源一无所知
常见的状态码如下
500~599代表服务器错误状态
表示服务器出现错误,常见的状态码如下