HTTP
前言
HTTP协议,全称Hyper Text Transfer Protocol(超文本传输协议)。HTTP协议是基于TCP/IP协议的应用层协议,规定了客户端与服务器之间的通信格式,默认使用80端口。HTTP采用了经典的客户端-服务器模型,客户端与服务器连接并发出请求,然后等待服务器响应。除此之外,HTTP是一个无状态协议,服务器并不会保留连接所传输的信息。
HTTP发展历程
HTTP从最初的HTTP/0.9到现在最常用的HTTP/1.1,历经了几个版本,功能也越来越强大。
HTTP/0.9
这个版本的HTTP只支持GET请求,且规定服务器只能回应HTML格式的字符串,所以我们通过此协议只能访问静态页面。
HTTP/1.0
HTTP/1.0废除了0.9中服务器只允许回应HTML格式字符串的规定,可以发送任何格式的内容,这代表着除了文字还可以传输图片,视频等,且该版本协议还支持POST,HEAD请求。除此之外,HTTP请求和回应的格式也变了,除了数据部分,还必须包括头部信息。
HTTP/1.1
HTTP/1.1是现在最常用的HTTP协议,相较于HTTP/1.0,其引入了许多新的特性。
持续连接
在HTTP/1.1中,TCP连接默认不关闭,可以被多个请求使用。这个连接会持续下去,直到客户端或服务器端中的一个认为会话已经结束,就可以关闭连接。
HTTP pipelining(流水线)
此特性实现了让客户端一次性发送多个请求的操作,无需再一个个等待服务器的响应。在HTTP/1.1以前,客户端要请求两个资源,就需要先发送第一个请求,然后等待服务器响应,服务器响应后再发送第二个请求。而在HTTP/1.1中,客户端能够直接发送这两个请求,不过服务器端还是按照顺序一个一个处理请求的。
分块传输
Content-length
在说分块传输之前,先得说说Content-length字段。我们知道,Content-length字段是用来标识服务器响应的长度的,所以在服务器响应之前,服务器必须计算出回应的数据长度。当我们去请求一个很大的资源时,这无疑是很耗费时间得,所以就有了分块传输的出现。
Transfer-Encoding
HTTP/1.1中规定了一个新字段Transfer-Encoding,请求包或响应包中有该字段时,就表明包中的数据有数量未知的数据块组成。在非空的数据块前,有一个十六进制的数,表明该数据块的长度,最后会有一个长度为0的块,表名数据发送完毕。
URL
URL,翻译成中文就是统一资源定位符,我们大多数人一般叫网址。URL其实就是资源在WEB上的地址,我们可以通过这个地址获取到对应的资源。我们先来看看URL的一般格式:
协议://服务器ip地址:端口/文件路径
以百度的网址为
https://www.baidu.com/
从URL中我们可以看出来,使用的是https协议,不是说要用服务器ip及端口吗,为什么这里是一串字母呢。其实这个字符串叫做域名,域名经过DNS的处理,就会解析到对应ip。至于DNS就需要自己去了解了,我这里就不多说了。那为什么端口也没有呢,这又是一个知识点了,如果web服务器使用HTTP协议的标准端口(HTTP是80,HTTPS是443)来授予其资源的访问权限,那么端口就可以被忽略,也就是说写https://www.baidu.com:443也是可以的。端口一定要写对,比如使用的是HTTPS协议,你写80端口就会导致无法连接。
HTTP请求报文
http请求包由三部分构成,请求行,请求头,请求数据,格式如下图
图片来自 here
这就是一个标准的HTTP请求报文,第一行是请求行,表示出了请求方法,路径,协议版本。下面是请求头,想深入了解HTTP头可以看这篇文章 HTTP Headers。
HTTP响应报文
响应报文跟请求报文的格式基本一样,也由三部分构成,状态行,消息报头,响应正文。