这里我只是整理了一些知识,方便自己的理解和记忆。还有很多不完善之处。更多的细节,你需要参考书籍或其他文章。http协议的发展过程HTTP是基于TCP/IP协议的应用层协议。不涉及数据包(packet)的传输,主要规定了客户端与服务端的通信格式,默认使用80端口。http/0.9是1991年发布的,只有一个GET命令。协议规定服务器只能响应HTML格式的字符串,不能响应其他格式。http/1.0发布于1996年5月,发布了HTTP/1.0版本,内容大大增加。首先,可以发送任何格式的内容。这使得Internet不仅可以传输文本,还可以传输图像、视频和二进制文件。这为互联网的大发展奠定了基础。除了GET命令外,还引入了POST命令和HEAD命令,丰富了浏览器与服务器交互的手段。HTTP请求和响应的格式也发生了变化。除了数据部分之外,每次通信还必须包含头部信息(HTTPheader),用于描述一些元数据。其他新特性包括状态码、多字符集支持、多部分类型、授权、缓存、内容编码等。**缺点:**每个TCP连接只能发送一个请求。发送数据后,连接关闭。如果你想请求其他资源,你必须创建一个新的连接。创建一个TCP连接的代价很高,因为它需要客户端和服务器进行三次握手,而且一开始发送速率很慢(slowstart)。因此,HTTP1.0版本的性能比较差。随着越来越多的外部资源被网页加载,这个问题变得更加突出。为了解决这个问题,一些浏览器在请求中包含一个带有列表项的非标准连接字段。Connection:keep-alive建立一个可重用的TCP连接,直到客户端或服务端主动关闭连接。但是,这不是一个标准字段,不同的实现可能表现不一致,所以这不是根本的解决方案。http/1.1发布于1997年1月,HTTP/1.1版本发布,仅比1.0版本晚了半年。它进一步改进了HTTP协议,一直沿用到20年后的今天,直到现在仍然是最流行的版本。1.1版本最大的变化是引入了持久连接,即TCP连接默认不关闭,无需声明Connection:keep-alive即可被多次请求复用。当客户端和服务端发现对方有一段时间没有活动时,可以主动关闭连接。但是,标准做法是客户端在最后一个请求中发送Connection:close,明确请求服务器关闭TCP连接。1.1版本还增加了很多动词方法:PUT、PATCH、HEAD、OPTIONS、DELETE。**缺点**虽然1.1版本允许TCP连接的多路复用,但是在同一个TCP连接中,所有的数据通信都是按顺序进行的。在处理完一个响应之前,服务器不会继续处理下一个响应。如果前面的响应特别慢,后面就会有很多请求在排队等候。这称为“队头阻塞”。为了避免这个问题,只有两个办法:一是减少请求次数;另一种是同时打开更多的持久连接。这导致出现了许多网页优化技巧,例如合并脚本和样式表、在CSS代码中嵌入图像、域分片(domainsharding)等等。如果HTTP协议设计得更好,这些额外的工作是可以避免的。SPDY2009年Google发布了自主研发的SPDY协议,主要解决HTTP/1.1效率低下的问题。该协议在Chrome浏览器上被证明可行后,被视为HTTP/2的基础,主要特性在HTTP/2中得到继承。HTTP/22015年,HTTP/2发布。它不被称为HTTP/2.0,因为标准委员会不打算发布更多的颠覆,下一个新版本将是HTTP/3。HTTP/1.1版本的头信息必须是文本(ASCII编码),数据体可以是文本也可以是二进制。HTTP/2是一个完全二进制的协议。二进制协议的一个好处是可以定义额外的帧。HTTP/2定义了近十种框架,为未来的高级应用奠定了基础。如果用文本来实现这个功能,解析数据会变得很麻烦,二进制解析就方便多了。HTTP/2多路复用TCP连接。在一次连接中,客户端和浏览器都可以同时发送多个请求或响应,不需要按顺序一一对应,从而避免了“队列阻塞”。HTTPSHTTPS是HTTP协议的安全版本。HTTP协议的数据传输是明文的,不安全。HTTPS使用SSL/TLS协议进行加密。http协议的特点是无状态的——每个HTTP请求都是独立的,任意两个请求之间没有必然联系。然而,在实际应用中并非完全如此。引入Cookie和Session机制来关联请求。无连接——每次请求完成后立即断开连接。单向应用层协议——通信请求只能由客户端发起,服务器响应请求。多次请求—— 当客户端请求一个网页时,在大多数情况下,并不是一个成功的请求。服务器先响应HTML页面,然后浏览器收到响应后发现HTML页面还引用了其他资源。例如CSS、JS文件、图片等,对于这些需要的资源,也会自动发送HTTP请求。目前的HTTP版本支持管道机制(即在同一个TCP连接中,客户端可以同时发送多个请求),可以同时请求和响应多个请求,大大提高了效率。http报文结构请求行url——请求URL请求方式——请求方式状态码——状态码服务器地址——远程地址跨域拒绝时,方法可以是options,状态码为404/405等。(当然,事实上还有很多可能的组合)**常见的状态码:**200——表示请求成功完成,将请求的资源发回给客户端304——自上次请求以来,请求的资源网页未被修改,请使用客户端本地缓存400--客户端请求错误(比如可以被安全模块拦截)401--请求未授权403--禁止访问(比如未登录时可以禁止)404--资源500未找到-内部服务器错误503-服务不可用...**HTTP请求方式**支持HTTP1中的GET、POST等近10种方法。1个版本。通用头字段HTTPCookie本质上是cookie是http的扩展。有两个http头负责设置和发送cookie,它们是Set-Cookie和Cookie。HTTPCookie(也称为WebCookie或BrowserCookie)是服务器发送给用户浏览器并存储在本地的一小段数据。下次浏览器再次向同一服务器发出请求时,它会被携带并发送给服务器。.通常,它用于告诉服务器两个请求是否来自同一个浏览器,例如保持用户登录状态。Cookie使得基于无状态HTTP协议记录稳定状态信息成为可能。Cookies主要用于以下三个方面:会话状态管理(如用户登录状态、购物车、游戏分数或其他需要记录的信息)个性化设置(如用??户自定义设置、主题等)浏览器行为追踪(如追踪分析用户行为等)Cookies曾经是用来存储客户端数据的,因为当时没有其他合适的存储方式,所以作为唯一的存储方式,但是现在随着现代浏览器开始支持各种存储方式,cookie逐渐被淘汰。服务器指定cookie后,浏览器的每次请求都会携带cookie数据,这会带来额外的性能开销(尤其是在移动环境下)。新的浏览器API已经允许开发人员直接在本地存储数据,例如使用Web存储API(本地存储和会话存储)或IndexedDB。创建cookie当服务器收到HTTP请求时,服务器可以在响应头中添加一个Set-Cookie选项。浏览器通常在收到响应后保存cookie,然后通过每次向服务器请求中的cookie请求头将cookie信息发送给服务器。另外cookie的过期时间、域、路径、有效期、适用站点都可以根据需要指定。nodejs中服务端设置cookie的方法request.setHeader('Set-Cookie',['type=ninja','language=javascript']);cookie保存在客户端,根据保存在客户端的位置,可以分为内存cookie和硬盘cookie。如果cookie的存活时间是整个session,浏览器会将cookie保存在内存中,关闭浏览器后会自动清除cookie。不会被清除,下次打开浏览器访问相应网站时,cookie会自动再次发送到服务器。Cookie不跨域许多网站都使用cookie。例如:谷歌会向客户发放cookies,百度也会向客户发放cookies。浏览器访问谷歌时是否也会携带百度发布的cookie?或者Google可以修改百度发布的Cookie吗?情况是否定的。Cookie不能跨域名。根据cookie规范,浏览器访问谷歌时,只会携带谷歌的cookie,不会携带百度的cookie。谷歌只能操作谷歌的cookies,不能操作百度的cookies。Cookie由客户端的浏览器管理。浏览器可以保证谷歌只会操作谷歌的cookies,不会操作百度的cookies,从而保证用户的隐私。浏览器判断一个网站是否可以操作另一个网站的cookie的依据是域名。谷歌和百度的域名不同,所以谷歌无法操作百度的cookies。同一个一级域名下的两个二级域名,如www.helloweenvsfei.com和images.helloweenvsfei.com,不能互换使用cookies,因为两者的域名并不严格相同。如果想让helloweenvsfei.com下的所有二级域名都使用这个cookie,需要设置cookie的domain参数,例如:Cookiecookie=newCookie("time","20080808");//新建一个cookiecookiecookie.setDomain(".helloweenvsfei.com");//设置域名cookie.setPath("/");//设置路径cookie.setMaxAge(Integer.MAX_VALUE);//设置有效期response.addCookie(cookie);//输出给客户端cookie的有效期cookie的maxAge决定了cookie的有效期,单位秒(Second)。通过getMaxAge()方法和setMaxAge(intmaxAge)方法在cookie中读写maxAge属性。如果maxAge属性为正数,则表示cookie将在maxAge秒后自动过期。浏览器会将maxAge为正数的cookie持久化,即写入对应的cookie文件中。无论客户是否关闭浏览器或电脑,只要还在maxAge秒之前,登录网站时cookie仍然有效。如果maxAge为负数,则表示cookie只在本浏览器窗口和本窗口打开的子窗口有效,关闭窗口后cookie失效。maxAge为负数的cookie是临时cookie,不会被持久化,也不会写入cookie文件。Cookie信息保存在浏览器的内存中,因此当浏览器关闭时cookie消失。注意:从客户端读取cookie时,maxAge等其他属性不可读,不会提交。浏览器提交cookie时,只提交name和value属性。maxAge属性仅供浏览器用来判断cookie是否过期。Cookie的安全属性HTTP协议不仅是无状态的,而且是不安全的。使用HTTP协议的数据直接在网络上传输,没有任何加密,可能会被拦截。使用HTTP协议传输非常机密的内容是一个隐患。如果不希望cookies在HTTP等非安全协议中传输,可以将cookies的secure属性设置为true。浏览器仅通过HTTPS和SSL等安全协议传输此类cookie。以下代码将安全属性设置为true:Cookiecookie=newCookie("time","20080808");//创建一个新的Cookiecookie.setSecure(true);//设置安全属性response.addCookie(cookie);//输出给Client提示:secure属性无法对cookie内容进行加密,无法保证绝对安全。如果对安全性要求高,需要在程序中对cookie内容进行加密解密,以防泄露。HttpsessionSession和cookie一样,是一种记录http状态的机制,但不同的是cookie存在于客户端,携带的大小是有限的,而session存在于服务器端,存储大小没有限制。当程序需要为客户端的请求创建会话时,服务器首先检查客户端的请求是否已经包含会话标识符——称为会话标识。如果已经包含了sessionid,说明这个client之前已经使用过session,一旦session被创建,server会根据sessionid获取session(如果获取不到,可能会创建一个新的),如果客户端请求不包含sessionid,则为该客户端创建一个session,并与该session生成一个session关联的sessionid,sessionid的值应该是一个既不重复又不易被发现的字符串模仿。这个sessionid会在这个response中返回给客户端保存。Cookies可以用来保存sessionid,这样浏览器在交互过程中就可以自动按照规则向服务器显示这个id。通常,此cookie的名称类似于SEEESIONID。通常session的创建需要依赖cookies,但是可以人为禁止cookies,在禁止cookie时需要其他机制将sessionid传回服务端,可以直接将sessionid追加到url后面path注:在讲session机制的时候,经常听到这样的误解“只要关闭浏览器,session就消失了”。其实大家可以想象一下会员卡的例子。除非顾客主动要求店家卖卡,否则店家绝不会轻易删除顾客的资料。会话也是如此。除非程序通知服务器删除会话,否则服务器将永远保留它。程序一般会在用户注销时发送删除会话的命令。但是浏览器在关闭前从来不会主动通知服务器自己将要关闭,所以服务器永远没有机会知道浏览器已经关闭。造成这种错觉的原因是大部分session机制使用sessioncookies来保存sessionids,关闭浏览器后sessionid消失,再次连接服务器时就找不到原来的session了。如果将服务器设置的cookie保存到硬盘,或者通过某种手段改写浏览器发送的HTTP请求头,将原来的sessionid发送给服务器,那么仍然可以找到原来的session再次打开浏览器。参考文章:http://www.ruanyifeng.com/blo...https://www.cnblogs.com/wxism...https://developer.mozilla.org...https://www.2cto.com/kf/20120...
