什么是协议
协议是多人通过协商,最后达成一致的合约。
什么是HTTP协议
HTTP协议是客户端与服务器之间通信时所共同遵循一个合约。
HTTP协议的主要内容是什么
HTTP协议是双方的:它定义了客户端如何请求服务器资源,服务器如何响应客户端请求。
客户端如何请求资源
GET /index.html HTTP/1.1
Host:www.baidu.com
#GET:请求资源的方法
#/index.html:资源位置
#HTTP/1.1:请求资源的协议/版本
#Host:资源所在的服务器
服务器如何响应请求
HTTP/1.1 200 OK
Content-type:text/html
Hello,World!
#HTTP/1.1:响应资源的协议/版本
#200:状态码,表示资源状态
#OK:状态描述值
#Content-type:文本格式
#CRLF(换行符+回车符)
#Hello,World!:响应主体
HTTP协议与TCP/IP协议之间的关系
1 TCP/IP协议基础
TCP/IP协议包括两个子协议:
一个是TCP协议(Transmission Control Protocol,传输控制协议),另一个是IP协议(Internet Protocol,互联网协议),它起源于20世纪60年代末。
在TCP/IP协议中,TCP协议和IP协议各有分工。
TCP协议是IP协议的高层协议,TCP在IP之上提供了一个可靠的,连接方式的协议。
TCP协议能保证数据包的传输以及正确的传输顺序,并且它可以确认包头和包内数据的准确性。
如果在传输期间出现丢包或错包的情况,TCP负责重新传输出错的包,这样的可靠性使得TCP/IP协议在会话式传输中得到充分应用。
IP协议为TCP/IP协议集中的其它所有协议提供“包传输”功能,IP协议为计算机上的数据提供一个最有效的无连接传输系统,也就是说IP包不能保证到达目的地,接收方也不能保证按顺序收到IP包,它仅能确认IP包头的完整性。
最终确认包是否到达目的地,还要依靠TCP协议,因为TCP协议是有连接服务。
· 应用接口协议
这类协议主要包括Windows套接字(Socket,用于开发网络应用程序)、
远程调用、
NetBIOS协议(用于建立逻辑名和网络上的会话)和
网络动态数据交换(Network,用于通过网络共享嵌入在文本中的信息)。
· 基本的TCP/IP协议互连应用协议
主要包括finger、ftp、rep、rsh、telnet、tftp等协议。
这些工具协议使得Windows系统用户使用非Microsoft系统计算机上(如UNIX系统计算机)的资源成为可能。
2 HTTP 协议 (HTTP,HyperText Transfer Protocol) 超文本传输协议
HTTP是超文本传输协议,是客户端浏览器或其他程序与服务器之间的应用层通信协议。在Internet上的Web服务器上存放的都是超文本信息,客户机需要通过HTTP协议传输所要访问的超文本信息。HTTP包含命令和传输信息,不仅可用于Web访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成。
HTTP代理
在现实的网络世界中,代理无处不在,对于客户端来说,代理就是服务端,对于最终的服务端来说,代理又是客户端。 代理的身份可以是双重的,所以在很多方面,代理作用很大:
做为缓存服务器,直接与客户端通信,缓解真实服务端压力
做为代理服务器,可以让一些访问不了外网的客户端也能访问到外网的资源
做为认证服务器,可以拦截客户请求,只有通过认证的客户端才能访问到最终的资源
HTTP缓存策略
对于一些服务器资源,服务端并不希望客户端在重复请求时,每次都返回资源。这样当资源文件足够大、请求足够多时,服务器的压力会很大。 HTTP协议在缓存这一块有一个比较合理的交互规则:
客户端请求资源(默认是允许缓存,如果header中带Cache-Control: no-cache,那么说明客户端不缓存数据)
服务端响应资源,header中添加Cache-Control: max-age=1000,告诉客户端1000s内我不会改变资源内容,你就用旧的资源吧
客户端的将资源放入到缓存文件夹
客户端再次请求资源,先去缓存文件夹中查找,找到资源后,对比时间,看是否超过了1000s,如果没有超过就会继续使用资源,如果超过了就会向服务器询问资源是否已经更新,在header中添加if-modified-since:(服务端先前响应header中的Date值)或if-none-match:(服务端先前响应header中的ETag)
服务端接收到客户端请求,发现请求header中有条件请求if-modified-since或if-none-match,会检查服务器资源是否修改过,如果没有修改,服务端返回304,告诉客户端缓存资源可用。如果发现资源已经修改,那么就将修改过的资源发送给客户端