客户端 & 服务端
网络世界中的两台计算机,就像现实世界中的两个陌生人一样,要想搭上关系,首先得先说上话。
在网络世界中,先开口的,被称为客户端。而做出回应的,被称为服务端。
也就是说,在一条通信线路上,客户端用于请求资源,服务端用于提供资源。
事实上,HTTP协议还规定了:
- 在一条通信线路上必定有一端是客户端,另一端是服务器端。
- 请求从客户端发出,服务器端响应请求并返回。也就是说,请求肯定是先从客户端开始建立通信的,服务器端在没有接收请求之前不会发送响应。
HTTP的特点
无连接
HTTP协议是无连接的。
也就是说,每进行一次HTTP通信,都要断开一次TCP连接。
这是因为HTTP诞生之初,主要是为了应付很小的文本传输,所以即使这样也没多大的问题。
可随着HTTP的普及,文档中包含大量图片的情况多了起来,每次请求完都要断开TCP连接,无疑增加通信量的开销。为了解决TCP的连接问题,HTTP1.1提出了持久连接的方法。
所谓的持久连接,就是任意一端只要没有明确提出断开连接,则保持TCP连接状态。这样一来,就减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务端的负载,Web页面的显示速度也就相应的提高了。更重要的是,持久连接使得管线化成为可能。从前发送请求后,需要收到响应了才能发送下一个请求。管线化技术出现后,不用等待响应也可以直接发送下一个请求了。这样就能够做到同时并行发送多个请求,而不需要一个接一个地等待响应。管线化的效果是立竿见影的。持久连接可以让请求更快结束,而管线化技术则比持久连接还要快,而且请求数越多,时间差就越明显。
无状态
除了无连接,HTTP的另一个特点是无状态。
也就是说,HTTP协议无法根据之前的状态进行本次的请求处理。
不可否认,不保存状态是有他的优点的,可以减少服务器的CPU及内存资源的消耗。但问题也是显而易见。假设系统需要登录后才能访问,由于无状态的特点,每次跳转页面都需要重新登录,这是难以想象的。为了解决无状态的问题,引入了Cookie技术。
Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
首次访问服务端时,响应报文内会返回一个叫Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。
服务端发现客户端发送过来的Cookie后,会去检查究竟是从哪个客户端发送来的请求,然后对比服务器上的记录,最后得到之前的状态信息。
