HTTP概述
HTTP 是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。
通过使用网页浏览器、网络爬虫或者其它的工具,
客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。
我们称这个客户端为用户代理程序(user agent)。
服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。
在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。
使用TCP作为运输层协议
尽管 TCP/IP 协议是互联网上最流行的应用,HTTP 协议中,并没有规定必须使用它或它支持的层。
事实上,HTTP可以在任何互联网协议上,或其他网络上实现。
HTTP 假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。
因此也就是其在 TCP/IP 协议族使用 TCP 作为其传输层。
HTTP 短连接与持久连接(keep alive)
由于HTTP连接基于TCP连接,
在早期的短连接中,单一的TCP连接内仅仅执行一个“客户端发送请求——服务器发送应答”,之后便释放TCP连接。
持久连接的出现,使得同一个TCP在活跃期间(keep-alive)复用,避免重重复复的TCP握手。
非流水线方式
收到响应后才能发出下一个请求。
流水线方式
客户端在收到响应报文之前就可以接着发送新的请求报文。
HTTP/0.9 :短连接
已过时。只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。
每个HTTP请求都要经历一次 DNS 解析、三次握手、传输和四次挥手。反复创建和断开TCP连接的开销巨大。
HTTP/1.0 :持久连接概念提出
这是第一个在通讯中指定版本号的 HTTP 协议版本,至今仍被广泛采用,特别是在代理服务器中。
持久连接,即一个 TCP 连接服务多次请求:
客户端在请求 header 中携带Connection: Keep-Alive,即是在向服务端请求持久连接。
如果服务端接受持久连接,则会在响应 header 中同样携带 Connection: Keep-Alive ,这样客户端便会继续使用同一个 TCP 连接发送接下来的若干请求。
Keep-Alive 的默认参数是[ timout = 5, max = 100 ],即一个TCP连接可以服务至多 5 秒内的 100 次请求。
当服务端主动切断一个持久连接时(或服务端不支持持久连接),则会在 header 中携带Connection: Close,要求客户端停止使用这一连接。
HTTP/1.1 :持久连接被默认采用,还支持以管道方式在同时发送多个请求
HTTP/2 :基于SPDY协议
在 HTTP/2 的第一版草案(对 SPDY 协议的复刻)中,新增的性能改进不仅包括HTTP/1.1中已有的多路复用,修复队头阻塞问题,允许设置设定请求优先级,还包含了一个头部压缩算法(HPACK)。
此外, HTTP/2 采用了二进制而非明文来打包、传输客户端—服务器间的数据。
HTTP 无状态(stateless)
指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。
事务:指的时一系列的信息交换,而这一系列信息交换是不可分割的整体,也就是说,要么所有的信息交换都完成,要么一次交换都不进行。
HTTP 是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive 没能改变这个结果。
缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP 协议这种特性有优点也有缺点,优点在于解放了服务器,每一次请求“点到为止”,不会造成不必要连接占用,缺点在于每次请求会传输大量重复的内容信息。
客户端与服务器进行动态交互的 Web 应用程序出现之后,HTTP 无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。
于是,两种用于保持 HTTP 连接状态的技术就应运而生了,一个是 Cookie,而另一个则是 Session。