一、TCP/IP是互联网相关的各类协议族的总称。通常使用的网络(包括互联网)是在TCP/IP协议族的基础上运作的。而HTTP属于它内部的一个子集。不是说协议只有这两个,但是因为他们最具代表性,所以协议族称为TCP/IP协议。其他的协议还有SMTP协议、UDP协议以及ARP协议等等……
二、TCP/IP协议族按层次分别分为以下4层:应用层、传输层、网络层和数据链路层。
我们用HTTP举例来说明,首先作为发送端的客户端在应用层(HTTP协议)发出一个想看某个Web页面的HTTP请求。接着,为了传输方便,在传输层(TCP协议)把从应用层处收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。
在网络层(IP协议),增加作为通信目的地的MAC地址后转发给链路层。这样一来,发往网络的通信请求就准备齐全了。接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用层。当传输到应用层,才能算真正接收到由客户端发送过来的HTTP请求。
三、发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层时会把对应的首部消去。这种把数据信息包装起来的做法称为封装(encapsulate)。
一、IP协议的作用是把各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足各类条件。其中两个重要的条件是IP地址和MAC地址。IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对。IP地址可变换,但MAC地址基本上不会更改。
- MAC地址就像是网卡的固有属性,一旦网卡被生产也就存在。IP地址是网卡所在设备在某个子网下被分配的地址,若设备更换到其他子网对应的IP地址也就改变。IP地址如住址,MAC如身份证号。
- 使用ARP协议凭借MAC地址进行通信:ARP是一种用以解析地址的协议,根据通信方的IP地址就可以反查出对应的MAC地址。ARP协议会向当前网络中的机器广播查找目标IP对应的MAC地址,如果没有收到响应,则默认发送给路由
二、TCP:提供可靠的字节流服务。所谓的字节流服务(Byte Stream Service)是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。为了准确无误地将数据送达目标处,TCP协议采用了三次握手
三、DNS:提供域名到IP地址之间的解析服务。
一、URI就是由某个协议方案表示的资源的定位标识符。协议方案是指访问资源所使用的协议类型名称。采用HTTP协议时,协议方案就是http。
二、URI用字符串标识某一互联网资源,而URL表示资源的地点(互联网上所处的位置)。可见URL是URI的子集。
三、URI的格式。
通过使用查询字符串(URL参数),可以区分用户的来源是否已知,以及它是来自自然搜索还是来自广告。 “URL参数”是提供用户足迹的参数。
一、请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成的。
二、 响应报文基本上由协议版本、状态码(表示请求成功或失败的数字代码)、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成
无状态是指两次连接通信之间是没有任何关系的,每次都是一个新的连接,服务端不会记录前后的请求信息。为了实现期望的保持状态功能,于是引入了Cookie技术。
如果不是访问特定资源而是对服务器本身发起请求,可以用一个*
来代替请求URI。比如option方法,询问服务器能使用哪些方法,资源位置可以填*
一、GET:获取资源
二、POST:传输实体主体,提交数据
三、PUT方法用来传输文件。就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。但是,鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,因此一般的Web网站不使用该方法。若配合Web应用程序的验证机制,或架构设计采用REST(Representational State Transfer,表征状态转移)标准的同类Web网站,就可能会开放使用PUT方法。
Post方法与put方法的区别:POST方法不是幂等的,而PUT方法有幂等性。幂等特点就是任意多次执行所产生的影响均与依次一次执行的影响相同。POST在请求的时候,服务器每次都创建一个文件,但是在PUT方法的时候只是简单地更新,而不是去重新创建。因此PUT是幂等的。
分布式场景,服务间的调用要有重试机制。这也意味着被调用方的每个接口都要满足幂等。post实现幂等方案,可以在请求参数里面写入唯一标识,多次请求用唯一标识过滤即可。
四、HEAD:获得报文首部。用于确认URI的有效性及资源更新的日期时间等。
五、DELETE:删除文件。HTTP/1.1的DELETE方法本身和PUT方法一样不带验证机制,所以一般的Web网站也不使用DELETE方法。
六、OPTIONS方法用来查询针对请求URI指定的资源支持的方法。
定义的6个请求消息分别是:邀请(INVITE),证实(ACK),再见(BYE),取消(CANCEL),选择(OPTIONS)和登记(REGISTER)。其中,INVITE用来邀请用户或者应用程序加入某会话,相当于呼叫信令中的Setup消息。ACk用于证实客户机已收到关于INVITE请求的最终响应,该消息仅和INVITE配套使用。BYE用于指示释放呼叫,可由主叫方或被叫方发出,任一方收到BYE后应停止向发起BYE请求的另一方发送媒体流。CANCEL用于取消一个尚未完成的请求。OPTIONS用于询问服务器的能力,包括用户的忙闲状态信息。按RFC3216初衷,实体发起呼叫前可发送该消息以确认网络实体是否支持某种消息或某种能力,但从电信网络运营角度,不希望终端能获知网络能力。目前,有的厂商或运营商将该消息作为心跳消息来确认对端实体是否存活、两实体间是否可达,在该种应用下,实体会周期向相关实体发送OPTION消息(不带有查询能力的参数),对端收到该消息后,返回200消息表示收到OPTION消息。。REGISTER则用于客户程序在启动时向登记服务器登记其地址。
七、TRACE:让Web服务器端将之前的请求通信环回给客户端的方法。
发送请求时,在Max-Forwards首部字段中填入数值,每经过一个服务器端就将该数字减1,当数值刚好减到0时,就停止继续传输,最后接收到请求的服务器端则返回状态码200 OK的响应。客户端通过TRACE方法可以查询发送出去的请求是怎样被加工修改/篡改的。这是因为,请求想要连接到源目标服务器可能会通过代理中转,TRACE方法就是用来确认连接过程中发生的一系列操作。但是,TRACE方法本来就不怎么常用,再加上它容易引发XST(Cross-Site Tracing,跨站追踪)攻击,通常就更不会用到了。
八、CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
在 HTTP 协议中,CONNECT 方法可以开启一个客户端与所请求资源之间的双向沟通的通道。它可以用来创建隧道(tunnel)。
- CONNECT 可以用来访问采用了 SSL (HTTPS) 协议的站点。客户端要求代理服务器将 TCP 连接作为通往目的主机隧道。之后该服务器会代替客户端与目的主机建立连接。连接建立好之后,代理服务器会面向客户端发送或接收 TCP 消息流。
- 因为客户端要与服务器建立隧道,但是经过代理,而代理没有私钥相关证书。所以先发送connection请求,告诉代理,接下来的报文你都别管了,直接转发就行。所以感觉上是客户端直接和服务器建立了隧道,直接传输报文。
一、持久连接:只要任意一端没有明确提出断开连接,则保持TCP连接状态。
这里用 keep alive 实现的长连接,只是为了避免每次请求都要重新建立 TCP 连接带来的消耗,因此进行一轮三次握手,之后保持复用链路,直接请求数据,连接空闲间隔默认2小时。但在移动互联网时代,我们常说的长连接并不是使用http的keep alive,而是基于 tcp 自定义协议,使用心跳机制(这里心跳间隔往往选择几秒,半分,五分等更高频率),并且服务端也能推送数据,往往用于 im ,推送(如实时行情推送,Android 后台消息推送),因此要区分两者的长连接。在 http 的 keep alive 的长连接中,依然是客户端请求服务端响应,并不包含服务端推送的功能。
二、在HTTP/1.1中,所有的连接默认都是持久连接
三、持久连接使得多数请求以管线化(pipelining)方式发送成为可能。从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。
用于HTTP协议交互的信息被称为HTTP报文。HTTP报文大致可分为报文首部和报文主体两块。两者由最初出现的空行(CR+LF)来划分。通常,并不一定要有报文主体。
一、HTTP在传输数据时可以按照数据原貌直接传输,但也可以在传输过程中通过编码提升传输速率。但是,编码的操作需要计算机来完成,因此会消耗更多的CPU等资源。
二、报文(message):是HTTP通信中的基本单位,由8位组字节流
三、实体(entity):作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。
四、报文主体等于实体主体。只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。
内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。常用的内容编码有以下几种:gzip(GNU zip)、compress(UNIX系统的标准压缩)、deflate(zlib)、identity(不进行编码)
分块传输编码会将实体主体分成多个部分(块)。每一块都会用十六进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标记。
一、发送邮件时,我们可以在邮件里写入文字并添加多份附件。这是因为采用了MIME(Multipurpose Internet Mail Extensions,多用途因特网邮件扩展)机制,它允许邮件处理文本、图片、视频等多个不同类型的数据。在MIME扩展中会使用一种称为多部分对象集合(Multipart)的方法,来容纳多份不同类型的数据。相应地,HTTP协议中也采纳了多部分对象集合,发送的一份报文主体内可含有多类型实体。通常是在图片或文本文件等上传时使用。
在springmvc中,当DispatcherServlet做doDispatcher的时候,会对request判断是否为multipart。它的原理就在这里。
二、多部分对象集合包含的对象如下。
“multipart/form-data” 是一种 HTTP 内容类型,用于向服务器提交表单数据。它与其他 HTTP 内容类型的不同之处在于,它允许提交不止一个数据项,并且每个数据项都可以具有不同的内容类型。当浏览器提交表单时,它会将数据打包成多部分(multipart),并以 “multipart/form-data” 的格式发送到服务器。服务器在接收到这样的请求后,可以对每一部分的数据进行单独处理。
“multipart/byteranges” 是一种 MIME 类型,它表示请求的 HTTP 响应包含多个独立的部分,每个部分代表响应的一个子集。这种方法通常用于在客户端请求的某些字节范围内获取服务器上的资源。例如,假设客户端想获取一个大文件的部分,而不是整个文件。客户端可以通过请求一个特定的字节范围来获取文件的部分。服务器会响应一个 “multipart/byteranges” 类型的响应,其中包含客户端请求的字节范围内的所有数据。
这种方法可以帮助优化网络带宽和减少服务器的负载,因为客户端只需要下载所需的数据。
三、在HTTP报文中使用多部分对象集合时,需要在首部字段里加上Content-type。
四、使用boundary字符串来划分多部分对象集合指明的各类实体。在boundary字符串指定的各个实体的起始行之前插入“–”标记(例如:–AaB03x、–THIS_STRING_SEPARATES),而在多部分对象集合对应的字符串的最后插入“–”标记(例如:–AaB03x–、–THIS_STRING_SEPARATES–)作为结束。
执行范围请求时,会用到首部字段Range来指定资源的byte范围。byte范围的指定形式如下:
●5001~10000字节
Range: bytes=5001-10000
●从5001字节之后全部的
Range: bytes=5001-
●从一开始到3000字节和5000~7000字节的多重范围
Range: bytes=-3000, 5000-7000
针对范围请求,响应会返回状态码为206 Partial Content的响应报文。另外,对于多重范围的范围请求,响应会在首部字段Content-Type标明multipart/byteranges后返回响应报文。如果服务器端无法响应范围请求,则会返回状态码200 OK和完整的实体内容。
一、当浏览器的默认语言为英语或中文,访问相同URI的Web页面时,则会显示对应的英语版或中文版的Web页面。这样的机制称为内容协商.
访问的是同一个uri,但是会用浏览器的语言展示
二、内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。
包含在请求报文中的某些首部字段(如下)就是判断的基准:Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language
三、内容协商技术有以下3种类型。
服务器只要遵循类别定义,可以自定义状态码
一、200 OK:表示从客户端发来的请求在服务器端被正常处理了。
二、204 No Content:该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。比如,当从浏览器发出请求处理后,返回204响应,那么浏览器显示的页面不发生更新。一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。
应用:
- 客户端向服务器发送了处理请求,服务器处理成功后,不希望客户端有变化,可以以204状态码返回
- 导航或ifeame,返回空的200响应,页面会空白,返回204则停留在当前页面
三、206 Partial Content:客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。
我们在网站建设中,时常会遇到需要网页重定向的情况:
- 网站调整(如改变网页目录结构);
- 网页被移到一个新地址;
- 网页扩展名改变(如应用需要把.php改成.Html或.shtml)。
这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。
一、301 Moved Permanently:永久性重定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。
二、302 Found:临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。
常见的是表单提交时,会先到表单的处理控制器中进行逻辑分析,再对用户进行重定向。这个逻辑分析的页面一般用户不可见
三、303 See Other:由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。
303状态码和302 Found状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源,这点与302状态码有区别。比如,当使用POST方法访问CGI程序,其执行后的处理结果是希望客户端能以GET方法重定向到另一个URI上去时,返回303状态码。
当301、302、303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送。为什么要把POST方法改成GET方法:
如果浏览器发送的最后一个请求是POST请求,这时用户点了刷新按钮,浏览器会弹出一个对话框询问用户是否要重新提交表单(可以参考某些网站输入密码时点了刷新),这会让用户觉得很奇怪,是一种很不好的用户体验,解决这个问题的方法就是不让POST作最后一个请求,那如何才能不让POST作最后一个请求呢?就是返回一个302/303重定向,让用户重定向回到这个地址,并且由于浏览器会自动把POST改成GET,所以这时相当于以GET的方式又访问了一遍这个地址,最后一个请求变成GET了,用户再点刷新按钮就不会弹出对话框了,这虽然会多带来一次请求,但是可以大大的提高用户体验,这个技巧叫POST重定向/GET模式
301、302标准是禁止将POST方法改变成GET方法的,但实际使用时大家都会这么做。
Https改造项目,所有的http重定向到https,是做的301,此时所有的post请求发生请求主体参数丢失的情况,后来在做301的时候post保持无协议,不做301
四、304 Not Modified:客户端发送附带条件的请求时,服务器端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回304 Not Modified(服务器端资源未改变,可直接使用客户端未过期的缓存)。304状态码返回时,不包含任何响应的主体部分。
五、307 Temporary Redirect:307会遵照浏览器标准,不会从POST变成GET。但是,对于处理响应时的行为,每种浏览器有可能出现不同的情况。
一、400 Bad Request:请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。
二、401 Unauthorized:发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。另外若之前已进行过1次请求,则表示用户认证失败。
返回含有401的响应必须包含一个适用于被请求资源的WWW-Authenticate首部用以质询(challenge)用户信息。
三、403 Forbidden:未获得文件系统的访问授权,访问权限出现某些问题(从未授权的发送源IP地址试图访问)等列举的情况都可能是发生403的原因。
对html目录设置普通用户无法访问,就可以出现这个状态码,客户端无权限访问此资源。
四、404 Not Found:该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用(看看此处的评论)
一、500 Internal Server Error:服务器端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障。
二、502 Bad Gateway:作为代理或网关使用的服务器从请求响应链的下一条链路上收到了一条伪响应(比如它无法连接到其父网关)时,使用此状态码。
三、503 Service Unavailable:服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入Retry-After首部字段再返回给客户端。
四、504 Gateway Timeout:与状态码408类似,只是这里的响应来自一个网关或代理,它们在等待另一服务器对其请求进行响应时超时了。
一、HTTP/1.1规范允许一台HTTP服务器搭建多个Web站点。比如,提供Web托管服务(Web Hosting Service)的供应商,可以用一台服务器为多位客户服务,也可以以每位客户持有的域名运行各自不同的网站。这是因为利用了虚拟主机(Virtual Host,又称虚拟服务器)的功能。
二、在互联网上,域名通过DNS服务映射到IP地址(域名解析)之后访问目标网站。可见,当请求发送到服务器时,已经是以IP地址形式访问了。所以,如果一台服务器内托管了www.tricorder.jp和www.hackr.jp这两个域名,当收到请求时就需要弄清楚究竟要访问哪个域名。在相同的IP地址下,由于虚拟主机可以寄存多个不同主机名和域名的Web网站,因此在发送HTTP请求时,必须在Host首部内完整指定主机名或域名的URI。
通信数据转发程序:代理、网关、隧道
代理是中转服务器只提供HTTP服务; 网关是中转服务器可以提供除了HTTP服务外的其他服务,比如安全,数据库访问和其他系统的互动等; 隧道的目的是在客户端与服务端之间建立一个安全的数据通路(采用了加密的方式保证安全)
透明代理会隐藏你的真实IP地址,但是仍旧可以通过某个字段知道你是谁,查到你的IP。但是匿名代理,只知道你使用了代理,无法知道你的真实IP. 只知道代理IP,还有个混淆代理,也可以知道你的IP地址,不过获取到的是假的IP地址,因为混淆代理帮你伪装了。
有时候可能需要改变报文的数据,比如增加一个header,但是想让客户端无察觉,可以使用代理
也就是说,代理和网关会去解析http请求,其中代理可能会直接返回请求的内容,而网关可能会将请求转发为其他协议,而隧道,理解为“透传”,重点放在了保证请求的安全。
当代理转发从服务器返回的响应时,代理服务器将会保存一份资源的副本。放缓存的数据和资源肯定是改动频率比较低的,设置一个缓存的过期时间。客户端请求资源时,如果缓存过期了,就去服务器拿,拿到了返回给客户端,并且刷新自己的缓存
一、HTTP请求报文:在请求中,HTTP报文由方法、URI、HTTP版本、HTTP首部字段等部分构成。
二、HTTP响应报文:在响应中,HTTP报文由HTTP版本、状态码(数字和原因短语)、HTTP首部字段3部分构成。
一、当HTTP报文首部中出现了两个或两个以上具有相同首部字段名时会怎么样?这种情况在规范内尚未明确,根据浏览器内部处理逻辑的不同,结果可能并不一致。有些浏览器会优先处理第一次出现的首部字段,而有些则会优先处理最后出现的首部字段。
二、HTTP首部字段将定义成缓存代理和非缓存代理的行为,分成2种类型:
一、若你没有缓存服务器,cache-control指令都基本没用
二、缓存请求指令
三、缓存响应指令
Cache-Control: no-cache=Location
由服务器返回的响应中,若报文首部字段Cache-Control中对no-cache字段名具体指定参数值,那么客户端在接收到这个被指定参数值的首部字段对应的响应报文后,就不能使用缓存。换言之,无参数值的首部字段可以使用缓存。只能在响应指令中指定该参数。
no_cache指令分为请求和响应
请求中代表不接受过期的响应,意思就是,缓存服务器每次都要去原服务器进行有效性验证(及验证eTag值)
响应中主要影响两处:一处缓存服务器不能对资源进行缓存,并且以后对于该资原服务器不进行有效性验证;另一处客户端发现no_cache中不带参数则可以使用缓存,否则不能使用缓存
no_store才是真正的不使用缓存
max_age代表缓存服务器在这段时间内是不需要向原服务器进行有效性验证
有s-maxage则直接忽略max-age了……所以当接收方是一个只供一个用户调用的缓存服务器时,s-maxage不起任何作用,而max-age还被忽略了
Http1.1版本中,优先级:s-maxage>max-age>Expires
min-fresh=60 :缓存服务器的资源离到期时间最小等于60秒才会返回
功能:即客户端只从缓存服务器中获取资源: 缓存服务器不会向源服务器发送资源有效性认证,源服务器也不会向缓存服务器发送更新资源。
若请求缓存加载失败,则会返回504状态码Gateaway TimeOut
使用must-revalidate指令会忽略请求的max-stale指令
这里是自己检查本地的缓存是否过期, 而上面的must-revalidate是向源服务器询问数据的
一、Connection首部字段具备如下两个作用。
二、HTTP/1.1版本的默认连接都是持久连接。为此,客户端会在持久连接上连续发送请求。当服务器端想明确断开连接时,则指定Connection首部字段的值为Close。
三、HTTP/1.1之前的HTTP版本的默认连接都是非持久连接。为此,如果想在旧版本的HTTP协议上维持持续连接,则需要指定Connection首部字段的值为Keep-Alive。Connection: Keep-Alive
首部字段Date表明创建HTTP报文的日期和时间。
一、该首部字段属于通用首部字段,但只用在客户端发送的请求中。客户端会要求所有的中间服务器不返回缓存的资源。客户端会要求所有的中间服务器不返回缓存的资源。
别给我缓存的意思
该首部字段可应用在HTTP/1.1版本分块传输编码时,可以用来消息的完整性校验、消息的数字签名、消息经过处理后的最终状态。
HTTP/1.1的传输编码方式仅对分块传输编码有效。
一、首部字段Upgrade用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
二、Connection的值被指定为Upgrade。Upgrade首部字段产生作用的Upgrade对象仅限于客户端和邻接服务器之间。因此,使用首部字段Upgrade时,还需要额外指定Connection:Upgrade
Connection:Upgrade
:告诉相邻的服务器不要转发Upgrade这个字段(Upgrade首部字段产生作用的Upgrade对象仅限于客户端和相邻的服务器之间)
一、使用首部字段Via是为了追踪客户端与服务器之间的请求和响应报文的传输路径。报文经过代理或网关时,会先在首部字段Via中附加该服务器的信息,然后再进行转发。
二、首部字段Via不仅用于追踪报文的转发,还可避免请求回环的发生。所以必须在经过代理时附加该首部字段内容。
三、Via首部是为了追踪传输路径,所以经常会和TRACE方法一起使用。比如,代理服务器接收到由TRACE方法发送过来的请求(其中Max-Forwards: 0)时,代理服务器就不能再转发该请求了。这种情况下,代理服务器会将自身的信息附加到Via首部后,返回该请求的响应。
该首部通常会告知用户一些与缓存相关的问题的警告。
请求首部字段是从客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容。
一、Accept首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用type/subtype这种形式,一次指定多种媒体类型。
斜线左边是资源类型,右边是资源格式,一组代表一种资源的一种可接受的格式,如果可以接受多种,互相之间逗号分隔。
当我们插入图片时,为了让图片占用资源最少,不同的图片的处理策略不同。
- 当图片是人像时,比较复杂的色块组合,使用JPG格式图片尺寸最小。JPG的处理原理是合并相邻色块,减小像素
- 当图像的色块是大面积纯色色块时,使用PEG,面积最小,最节省内存PEG的处理原理:会保留图层,图像非常清晰,不会合并相邻色块,通过再次导出方式可以去除图层
- 当我们的网页需要插入动图时一般插入GIF
二、若想要给显示的媒体类型增加优先级,则使用q=来额外表示权重值,用分号(;)进行分隔。权重值q的范围是0~1(可精确到小数点后3位),且1为最大值。不指定权重q值时,默认权重为q=1.0。
当服务器提供多种内容时,将会首先返回权重值最高的媒体类型。
Accept-Charset首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。另外,可一次性指定多种字符集。与首部字段Accept相同的是可用权重q值来表示相对优先级。该首部字段应用于内容协商机制的服务器驱动协商。
Accept-Encoding首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。
- 浏览器发送http request给服务器,request中带accept-Encoding:gzip,deflat。(告诉服务器,浏览器支持gzip压缩)
- 服务器收到request后,生成原始的response,其中有原始的content-type和content-length。
- 服务器通过gzip对response进行编码,编码后header中有context-type和context-length(压缩后的大小),并且增加了content-encoding:gzip。
- 浏览器接收到response后,根据content-encoding:gzip来对response进行解码。
首部字段Accept-Language用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。可一次指定多种自然语言集。权重值q来表示相对优先级。
一、通信使用明文(不加密),内容可能会被窃听:窃听相同段上的通信并非难事。只需要收集在互联网上流动的数据包(帧)就行了。对于收集来的数据包的解析工作,可交给那些抓包(Packet Capture)或嗅探器(Sniffer)工具。加密防止被窃听:
用SSL建立安全通信线路之后,就可以在这条线路上进行HTTP通信了与SSL组合使用的HTTP被称为HTTPS
二、不验证通信方的身份,因此有可能遭遇伪装。防范:数字证书
三、无法证明报文的完整性,所以有可能已遭篡改。防范:常用的是MD5和SHA-1等散列值校验的方法,以及用来确认文件的数字签名方法。提供文件下载服务的Web网站也会提供相应的以PGP创建的数字签名及MD5算法生成的散列值。但是用这些方法也依然无法百分百保证确认结果正确。因为PGP和MD5本身被改写的话,用户是没有办法意识到的。
PGP是用来证明创建文件的数字签名,MD5是由单向函数生成的散列值。不论使用哪一种方法,都需要操纵客户端的用户本人亲自检查验证下载的文件是否就是原来服务器上的文件。
请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击称为中间人攻击。在某些情况下,比如下载资源是海外资源,通过劫持域名纂改到国内提前缓存好的服务器上,可以减少成本。当然,这必须是在用户允许的情况下。
一、https来解决http的问题:
二、经常会在Web的登录页面和购物结算界面等使用HTTPS通信。
三、HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议代替而已。通常,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。
SSL是独立于HTTP的协议,所以不光是HTTP协议,其他运行在应用层的SMTP和Telnet等协议均可配合SSL协议使用。
四、如何证明收到的公开密钥就是原本预想的那台服务器发行的公开密钥。或许在公开密钥传输途中,真正的公开密钥已经被攻击者替换掉了。为了解决上述问题,可以使用由数字证书认证机构(CA,Certificate Authority)和其相关机关颁发的公开密钥证书。
五、数字证书认证机构的业务流程。
此处认证机关的公开密钥必须安全地转交给客户端。使用通信方式时,如何安全转交是一件很困难的事,因此,多数浏览器开发商发布版本时,会事先在内部植入常用认证机关的公开密钥。
六、客户端证书存在的问题:
七、如果使用OpenSSL这套开源程序,每个人都可以构建一套属于自己的认证机构,从而自己给自己颁发服务器证书。但该服务器证书在互联网上不可作为证书使用,似乎没什么帮助。浏览器访问该服务器时,会显示“无法确认连接安全性”或“该网站的安全证书存在问题”等警告消息。
由自认证机构颁发的服务器证书之所以不起作用,是因为它无法消除伪装的可能性
八、HTTPS通信
入侵者假如过早的发送了一个TCP FIN来终止正常的ssl连接,接收方收到的数据就不完整,所以结束报文是在ssl记录中发生的,指定一个ssl记录终止会话过程,因为记录中附加的mac密钥是无法被劫持篡改的
CBC模式(Cipher Block Chaining)又名密码分组链接模式。在此模式下,将前一个明文块加密处理后和下一个明文块做XOR运算,使之重叠,然后再对运算结果做加密处理。对第一个明文块做加密时,要么使用前一段密文的最后一块,要么利用外部生成的初始向量
九、HTTPS存在的问题:那就是当使用SSL时,它的处理速度会变慢。SSL的慢分两种。一种是指通信慢。另一种是指由于大量消耗CPU及内存等资源,导致处理速度变慢。和使用HTTP相比,网络负载可能会变慢2到100倍。除去和TCP连接、发送HTTP请求·响应以外,还必须进行SSL通信,因此整体上处理通信量不可避免会增加。另一点是SSL必须进行加密处理。在服务器和客户端都需要进行加密和解密的运算处理。因此从结果上讲,比起HTTP会更多地消耗服务器和客户端的硬件资源,导致负载增强。可以使用SSL加速器这种(专用服务器)硬件来改善该问题。
十、既然HTTPS那么安全可靠,那为何所有的Web网站不一直使用HTTPS?
一、需要核对“登录者本人才知道的信息”、“登录者本人才会有的信息”。核对的信息通常是指以下这些:
二、HTTP/1.1使用的认证方式:BASIC认证(基本认证)、DIGEST认证(摘要认证)、SSL客户端认证、FormBase认证(基于表单认证)。此外还有Windows统一认证(Keberos认证、NTLM认证)。如大数据组件,包含 Kafka,HBase,Zookeeper 等等
一、认证步骤:
二、缺点:BASIC认证虽然采用Base64编码方式,但这不是加密处理。不需要任何附加信息即可对其解码。换言之,由于明文解码后就是用户ID和密码,在HTTP等非加密通信的线路上进行BASIC认证的过程中,如果被人窃听,被盗的可能性极高。除此之外想再进行一次BASIC认证时,一般的浏览器却无法实现认证注销操作,这也是问题之一。
一、质询响应方式是指,一开始一方会先发送认证要求给另一方,接着使用从另一方那接收到的质询码计算生成响应码。最后将响应码返回给对方进行认证的方式。
二、认证步骤:
总结:客户端发送经过md5(根据服务端要求的加密方式进行加密,现在假设要求用md5)加密的[用户名:随机数:密码],并且同时附上字段如username:admin(不需要加密),nonce:xxxxx(随机数,不需要加密),服务端收到后根据username查找密码,然后进行md5加密[username:随机数:password],得到的结果与客户端发来的结果比对,对不上就肯定密码或者用户名错误。
三、Diguest认证首次向服务端发送用户和密码进行身份认证,认证通过后;在后续的通信过程中,每次由服务器提供一次性的nonce信息替换用户密码,从而防止了用户密码被监听窃取,但仍然不能防止用户拦截后被伪造。即:DIGEST认证提供防止密码被窃听的保护机制,但并不存在防止用户伪装的保护机制。
一、从使用用户ID和密码的认证方式方面来讲,只要二者的内容正确,即可认证是本人的行为。但如果用户ID和密码被盗,就很有可能被第三者冒充。利用SSL客户端认证则可以避免该情况的发生。
二、认证步骤:
为达到SSL客户端认证的目的,需要事先将客户端证书分发给客户端,且客户端必须安装此证书。
三、在多数情况下,SSL客户端认证不会仅依靠证书完成认证,一般会和基于表单认证组合形成一种双因素认证来使用,第一个认证因素的SSL客户端证书用来认证客户端计算机,另一个认证因素的密码则用来确定这是用户本人的行为。
一、基于表单认证本身是通过服务器端的Web应用,将客户端发送过来的用户ID和密码与之前登录过的信息做匹配来进行认证的。但鉴于HTTP是无状态协议,之前已认证成功的用户状态无法通过协议层面保存下来。即,无法实现状态管理,因此即使当该用户下一次继续访问,也无法区分他与其他的用户。于是我们会使用Cookie来管理Session,以弥补HTTP协议中不存在的状态管理功能。
二、认证步骤:
向客户端返回响应时,会在首部字段Set-Cookie内写入Session ID(如PHPSESSID=028a8c…)。
cookie,session在公司的用户认证中基本不会使用,正常都是以用户登录后返回token形式进行身份认证,服务端会保存token信息,一般都会存在如redis等缓存中,并设置一个过期时间
salt其实就是由服务器随机生成的一个字符串,但是要保证长度足够长,并且是真正随机生成的。然后把它和密码字符串相连接(前后都可以)生成散列值。当两个用户使用了同一个密码时,由于随机生成的salt值不同,对应的散列值也将是不同的。这样一来,很大程度上减少了密码特征,攻击者也就很难利用自己手中的密码特征库进行破解。
一、以下这些HTTP标准就会成为瓶颈。
二、解决方法:
一、WebSocket,即Web浏览器与Web服务器之间全双工通信标准。一旦确立WebSocket通信连接,不论服务器还是客户端,任意一方都可直接向对方发送报文。
二、WebSocket协议的主要特点。
HTTP连接的建立,又包含了TCP的三次握手。在HTTP连接建立好之后,要采用HTTP的request和response再进行一次HTTP协议层面的握手,从而升级为websocket协议。此后的数据传输,就采用web socket的协议报了。
成功握手确立WebSocket连接之后,通信时不再使用HTTP的数据帧,而采用WebSocket独立的数据帧。
一、WebDAV(Web-based Distributed Authoring and Versioning,基于万维网的分布式创作和版本控制)是一个可对Web服务器上的内容直接进行文件复制、编辑等操作的分布式文件系统。除了创建、删除文件等基本功能,它还具备文件创建者管理、文件编辑过程中禁止其他用户内容覆盖的加锁功能,以及对文件内容修改的版本控制功能。
二、 使用HTTP/1.1的PUT方法和DELETE方法,就可以对Web服务器上的文件进行创建和删除操作。可是出于安全性及便捷性等考虑,一般不使用。
三、WebDAV为实现远程文件管理,向HTTP/1.1中追加了以下这些方法。
为配合扩展的方法,状态码也随之扩展。
锁(Lock):把文件设置成无法编辑状态。多人同时编辑时,可防止在同一时间进行内容写入。
防火墙的基本功能就是禁止非指定的协议和端口号的数据包通过
HTML(HyperText Markup Language,超文本标记语言)是为了发送Web上的超文本(Hypertext)而开发的标记语言。超文本是一种文档系统,可将文档中任意位置的信息与其他信息(文本或图片等)建立关联,即超链接文本。标记语言是指通过在文档的某部分穿插特别的字符串标签,用来修饰文档的语言。我们把出现在HTML文档内的这种特殊字符串叫做HTML标签(Tag)
一、CGI(Common Gateway Interface,通用网关接口)是指Web服务器在接收到客户端发送过来的请求后转发给程序的一组机制。在CGI的作用下,程序会对请求内容做出相应的动作,比如创建HTML等动态内容。
二、Servlet是一种能在服务器上创建动态内容的程序。
之前提及的CGI,由于每次接到请求,程序都要跟着启动一次。因此一旦访问量过大,Web服务器要承担相当大的负载。而Servlet运行在与Web服务器相同的进程中,因此受到的负载较小
XML(eXtensible Markup Language,可扩展标记语言)是一种可按应用目标进行扩展的通用标记语言。旨在通过使用XML,使互联网数据共享变得更容易。
HTML倾向于数据的展示,XML更倾向于数据的描述和存储。至于原因,简单说就是HTML的标签被预设好了,便于浏览器去识别。XML的标签可自定义,便于人类去阅读。所以可读性上XML明显更高,但相对于H略显繁琐。利用一些手段两者也可以相互转换。
RSS(简易信息聚合,也叫聚合内容)和Atom都是发布新闻或博客日志等更新信息文档的格式的总称。两者都用到了XML。
JSON(JavaScript Object Notation)是一种以JavaScript(ECMAScript)的对象表示法为基础的轻量级数据标记语言。能够处理的数据类型有false/null/true/对象/数组/数字/字符串,这7种类型。
一、跨站脚本攻击(Cross-Site Scripting,XSS)是指通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种攻击。
跨站攻击可以认为是一种恶意的网络资源,通常网站上会从多个地方加载资源,比如专门的图库,css或者js公共cdn等。而攻击者通过某些方法让浏览器客户端加载了恶意脚本(并执行)
跨站脚本攻击有可能造成以下影响。
二、OS命令注入攻击(OS Command Injection)是指通过Web应用,执行非法的操作系统命令达到攻击的目的。只要在能调用Shell函数的地方就有存在被攻击的风险。可以从Web应用中通过Shell来调用操作系统命令。倘若调用Shell时存在疏漏,就可以执行插入的非法OS命令。
OS命令注入攻击可以向Shell发送命令,让Windows或Linux操作系统的命令行启动程序。也就是说,通过OS注入攻击可执行OS上安装着的各种程序。
三、SQL注入攻击
四、HTTP首部注入攻击(HTTP Header Injection)是指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击。HTTP首部注入攻击有可能会造成以下一些影响。
通过和会话固定攻击(攻击者可使用指定的会话ID)攻击组合,攻击者可伪装成用户。攻击者输入的%0D%0A,原本应该属于首部字段Location的查询值部分,但经过解析后,%0D%0A变成了换行符,结果插入了新的首部字段。
A登陆了,b没登录,获取a的cookie设置到b上面,b就可以冒充a的身份了
五、向首部主体内添加内容的攻击称为HTTP响应截断攻击。将两个%0D%0A%0D%0A并排插入字符串后发送。利用这两个连续的换行就可作出HTTP首部与主体分隔所需的空行了,这样就能显示伪造的主体,达到攻击目的。这样的攻击叫做HTTP响应截断攻击。利用这个攻击,已触发陷阱的用户浏览器会显示伪造的Web页面,再让用户输入自己的个人信息等,可达到和跨站脚本攻击相同的效果。另外,滥用HTTP/1.1中汇集多响应返回功能,会导致缓存服务器对任意内容进行缓存操作。这种攻击称为缓存污染。使用该缓存服务器的用户,在浏览遭受攻击的网站时,会不断地浏览被替换掉的Web网页。
六、邮件首部注入攻击:攻击者通过向邮件首部To或Subject内任意添加非法内容发起的攻击。%0D%0A在邮件报文中代表换行符。一旦咨询表单所在的Web应用接收了这个换行符,就可能实现对Bcc邮件地址的追加发送。使用两个连续的换行符就有可能篡改邮件文本内容并发送。
七、目录遍历(Directory Traversal)攻击是指对本无意公开的文件目录,通过非法截断其目录路径后,达成访问目的的一种攻击。这种攻击有时也称为路径遍历(Path Traversal)攻击。
固然存在输出值转义的问题,但更应该关闭指定对任意文件名的访问权限。
查询字段为了读取攻击者盯上的/etc/passwd文件,会从/www/log/目录开始定位相对路径
因此部署web程序的时候往往会单独使用一个用户且赋予很小的权限,这样就算被攻击,也会因为没有权限打开那些隐私文件
八、远程文件包含漏洞(Remote File Inclusion)是指当部分脚本内容需要从其他文件读入时,攻击者利用指定外部服务器的URL充当依赖文件,让脚本读取之后,就可运行任意脚本的一种攻击
固然存在输出值转义的问题,但更应控制对任意文件名的指定。
一、强制浏览(Forced Browsing)安全漏洞是指,从安置在Web服务器的公开目录下的文件中,浏览那些原本非自愿公开的文件。
对那些原本不愿公开的文件,为了保证安全会隐蔽其URL。可一旦知道了那些URL,也就意味着可浏览URL对应的文件。直接显示容易推测的文件名或文件目录索引时,通过某些方法可能会使URL产生泄露。
即使没有对这篇日记的访问权限,只要知道这图片的URL,通过直接指定URL的方式就能显示该图片。日记的功能和文本具有访问对象的控制,但不具备对图片访问对象的控制,从而产生了安全漏洞。
二、不正确的错误消息处理(Error Handling Vulnerability)的安全漏洞是指,Web应用的错误信息内包含对攻击者有用的信息。攻击者利用进行不同的输入会提示不同的错误信息这条,就可用来确认输入的邮件地址是否已在这个Web网站上注册过了。为了不让错误消息给攻击者以启发,建议将提示消息的内容仅保留到“认证错误”这种程度即可。
攻击者从这条消息中可读出数据库选用的是MySQL,甚至还看见了SQL语句的片段。这可能给攻击者进行SQL注入攻击以启发。
各系统应对详细的错误消息进行抑制设定,或使用自定义错误消息,以避免某些错误信息给攻击者以启发。
三、开放重定向(Open Redirect)是一种对指定的任意URL作重定向跳转的功能。而与此功能相关联的安全漏洞是指,假如指定的重定向URL到某个具有恶意的Web网站,那么用户就会被诱导至那个Web网站。
可信度高的Web网站如果开放重定向功能,则很有可能被攻击者选中并用来作为钓鱼攻击的跳板。
一、会话劫持(Session Hijack)是指攻击者通过某种手段拿到了用户的会话ID,并非法使用此会话ID伪装成用户,达到攻击的目的。攻击者在得知该Web网站存在可跨站攻击(XSS)的安全漏洞后,就设置好用JavaScript脚本调用document.cookie以窃取Cookie信息的陷阱,一旦用户踏入陷阱(访问了该脚本),攻击者就能获取含有会话ID的Cookie。攻击者拿到用户的会话ID后,往自己的浏览器的Cookie中设置该会话ID,即可伪装成会话ID遭窃的用户,访问Web网站了。
将cookie设置成httponly为true,或对cookie重要信息加密,签名等手段都是解决cookie信息安全管理或泄露。
二、会话固定攻击(Session Fixation)攻击会强制用户使用攻击者指定的会话ID。步骤:
Session Adoption是指PHP或ASP.NET能够接收处理未知会话ID的功能。
攻击者可私自创建会话ID构成陷阱,中间件却会误以为该会话ID是未知会话ID而接受。
三、跨站点请求伪造(Cross-Site Request Forgeries,CSRF)攻击是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动攻击。步骤:
Django 里面有CSRF防护机制,即在HTTP响应的 cookie里面,会添加一个 csrftoken字段,其值是一个自动生成的token。在客户端的所有POST表单中,必须包含一个 csrfmiddlewaretoken 字段。在处理POST之前,Django 会验证这个请求的 cooike 里面的 csrftoken 字段和提交的表单里面的字段值是否一样。如果一样,说明是合法请求,如果不一样就可能是 csrf攻击。
一、密码破解有以下两种手段:通过网络的密码试错、对已加密密码的破解(指攻击者入侵系统,已获得加密或散列处理的密码数据的情况)。主要有以下两种方式:穷举法、字典攻击
利用别处泄露的ID·密码进行攻击:字典攻击中有一种利用其他Web网站已泄露的ID及密码列表进行的攻击。很多用户习惯随意地在多个Web网站使用同一套ID及密码,因此攻击会有相当高的成功几率
二、从加密过的数据中导出明文通常有以下几种方法:通过穷举法、字典攻击进行类推、彩虹表、拿到密钥、加密算法的漏洞
从彩虹表内搜索散列值就可以推导出对应的明文密码。
三、点击劫持(Clickjacking)是指利用透明的按钮或链接做成陷阱,覆盖在Web页面之上。然后诱使用户在不知情的情况下,点击那个链接访问内容的一种攻击手段。这种行为又称为界面伪装
iframe引入,透明遮罩层覆盖
四、DoS攻击(Denial of Service attack)是一种让运行中的服务呈停止状态的攻击。有时也叫做服务停止攻击或拒绝服务攻击。主要有以下两种DoS攻击方式。
其中,集中利用访问请求的DoS攻击,单纯来讲就是发送大量的合法请求。
理解dos就要从syn泛洪攻击来说,简单地讲,前文提到的tcp三次握手,客户端不断给服务器发送syn,然后服务端响应syn和ack,此时第三步客户端不再给予回应,导致大量地一直处于确认握手状态链接,服务器端最终会因为拥挤而崩溃。
五、后门程序(Backdoor)是指开发设置的隐藏入口,可不按正常步骤使用受限功能。利用后门程序就能够使用原本受限制的功能。