第一章:Web及网络基础
- TCP/IP是互联网相关的各类协议族的总称,包含TCP、UDP、HTTP、FTP、IP、PPPoE等。
- TCP/IP的分层管理:
• 应用层:决定向用户提供应用服务时通信的活动,如HTTP属于应用层,发送原始的数据报文。
• 传输层:提供处于网络连接中的两台计算机之间的数据传输,如TCP、UDP属于传输层,对数据报文进行分割。
• 网络层:处理网络上流动的数据包,数据包时网络传输最小的数据单位,对数据包进行打包,增加MAC地址进行转发。
• 数据链路层:处理连接网络的硬件部分。 - 数据每经过一层都会被打上一个该层所属的首部信息,接收时一层一层去掉首部信息,这个过程叫封装。
- MAC地址是网卡所属的固定地址,基本不会改变,IP地址和MAC地址一起确定接收方在哪。
- 建立TCP连接需要三次握手(SYN、_SYN/ACK、ACK),断开TCP连接四次握手(FIN、_ACK、_FIN、ACK)。
- URI是统一资源标识符,标识某一互联网资源;URL是统一资源定位符,标识资源地点,是URI的子集。
- 路由器相当于物流中的集散中心,路由器有固定的MAC地址,发送端和接收端有自己的IP(相应路由器分配的),因此发送端先将数据包发给自己的路由器,路由器会根据IP地址和MAC去寻找对应的其他路由器进行中转,最后由接收端的路由器发给接收端。
- 网页处理大致流程:客户端输入域名 -> DNS解析出IP地址 -> 三次握手简历连接 -> HTTP协议生成原始请求报文 -> TCP协议对报文分割、打包 -> IP协议搜索对方地址,一边中转一边传送 -> TCP协议重组报文段 -> HTTP协议解析原始报文请求内容 -> 目标计算机(服务器)处理请求并回传结果 -> 四次挥手断开连接。
第二章:简单的HTTP协议
- 请求必定由客户端发出,而服务端回复响应。
- 请求报文由请求方法、请求URI、协议版本、请求头、内容实体五部分构成。
响应报文由协议版本、状态码、状态码原因短语、响应头、响应实体五部分构成。 - 八种HTTP方法:
• GET:查,用来请求访问已被URI识别的资源。
• POST:改,用来传输实体的主体。
• PUT:增,用来传输文件到服务器保存到URI指定位置,无验证机制,一般不使用。
• DELETE:删,用来删除指定URI位置的文件,无验证机制,一般不使用。
• HEAD:类似GET,只用于请求头部一些信息。
• OPTIONS:用来查询针对请求URI指定资源的支持方法。
• TRANCE:请求可能经过一些代理服务器转发,用来让Web服务器将之前的请求通信环回给客户端。
• CONNECT:要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信,主要使用SSL和TLS进行隧道加密传输。 - HTTP/1.0中的链接是无状态的,每次断开链接后才能再次链接;HTTP/1.1中默认是持久链接,三次握手之后可以多次发送请求响应,也使管线化方式成为可能(不必等待上一次响应可再次发送请求);持久链接减少了TCP链接的重复建立和断开所造成的额外开销,减轻了服务器负载。
- 由于是HTTP协议无状态的,采用Cookie技术来保存客户端状态,首次请求后服务端会下发set-cookie在响应中,下次请求时客户端带上cookie即可。
第三章:HTTP报文内的HTTP信息
- 请求报文和响应报文一般都分为三部分:请求行、请求头、请求体。
- 报文是HTTP通信中的基本单位,8位字节流;实体主体指请求体部分。一般报文主体就是实体主体,当传输中编码时,实体主体内容发生变化,才会与报文主体有差异。
- 常见的几种压缩内容编码:gzip、compress、deflate、identity。
- 当传输大量内容时,可以把数据分割成多块,让浏览器逐步显示页面,实体主体最后一块会用"0(CR+LF)"来标记。
- 发送多种数据的多部分对象集合,采用MIME机制,使用Multipart来标记内容类型,如multipart/form-data、multipart/byteranges等。
- 使用boundary字符串来划分多部分对象集合指明的各类主体,在头部Content-Type中定义boundary=XXX,使用--XXX来标记起始位置、分隔位置和末尾位置,每一部分都可以有实体头和实体主体。
- 内容协商返回最合适的内容,三种类型:服务器驱动协商(服务端处理)、客户端驱动协商(浏览器处理)、透明协商(双向处理)。
第四章:返回结果的HTTP状态码
- 5中常见类型:
• 1XX:接收的请求正在处理。
• 2XX:请求正常处理完毕。200成功、204成功但无内容返回、206分段请求成功。
• 3XX:需要附加操作以完成请求。301永久重定向、302临时重定向、303临时重定向(指明客户端需要使用GET请求)、304资源找到但不符合请求条件、307临时重定向(不能将POST转为GET)。
• 4XX:客户端错误。400语法错误服务端无法理解、401需要认证客户端、403请求被禁止、404请求URI不存在。
• 5XX:服务端错误。500服务端本身发生错误、503服务器处于超负载或正在停机维护。
第五章:与HTTP协作的WEB服务器
- 一台Web服务器可以利用虚拟主机技术搭建多个web站点,多个站点的域名不同,但是映射的IP相同,这时候就需要用的头部字段Host(必传),来确认要请求哪个Uri。
- 通信数据转发程序:
• 代理:扮演了客户端和服务器的中间人角色,不改变请求Uri,每一次转发会加入Via首部信息,分为缓存代理和透明代理两种类型,可以作用于内网访问控制。
• 网关:作为中间的转发服务器,可以转发请求也可以自己直接对请求进行处理,另外它可以进行非HTTP协议的转发服务,对接其他各种系统,功能更叼。
• 隧道:在客户端和服务器相距甚远时进行中转,保证稳定通信,采用SSL等一些加密手段可以保证双端的安全通信。
第六章:HTTP首部
- 首部分为四种类型:通用首部、请求首部、响应首部、实体首部,作用是为报文数据增加一些附加信息。
- 各个首部常用字段:
• 通用首部字段:Catch-Control、Connection、Date、Via等
• 请求首部字段:Host、Accept、Authorization、Range、Referer、User-Agent等。
• 响应首部字段:Age、Location、Server、Set-cookie等。
• 实体首部字段:Content-length、Content-Type、Expires等。 - Http首部字段将定义成缓存代理和非缓存代理的行为,分为2种类型:
• 端到端首部(End-to-end Header 会转发给请求/响应的最终目标,必须保存在由缓存生成的响应中)
• 逐跳首部(Htp-by-hop Header 只对单次转发有效,会因通过缓存而不再次转发) - 首部字段格式为key:value,多个字段以","分隔,权重信息以q(0~1 默认1)标记,以";"加在value里,如Accept-Charset:iso-8895-5, unicode-1-1;q=0.8
- Catch-Control中no-cache代表不缓存过期的资源,缓存会向源服务器进行有效期确认后处理资源;而no-store才是真正的不进行缓存。
- HTTP1.1版本默认是持久化连接(Connection:Keep-Alive),服务端想断开链接可以设置Connection:Close。
- Accept字段表示客户端接收类型,使用type/subtype格式,可一次指定多种类型,也可以加权重,如image/jpeg。
- set-cookie是服务端的response首部,cookie是客户端的request首部。
第七章:确保WEB安全的HTTPS
- HTTP的三个缺点:传输内容可能被窃听、无法验证双方的身份、传输内容可能被篡改。
- HTTP协议本身没有加密机制,因此可以通过双方自己制定加密规则对传输内容进行加密;或者配合SSL或TSL进行HTTPS通信。
- HTTP + 加密 + 认证 +完整性保护 = HTTPS,SSL处于应用层和TCP/IP之间。
- 对称加密算法使用同一个秘钥进行加密解密,非对称加密算法使用公钥和私钥进行加密解密;通常对称加密更快,因此一般结合使用,通过对称加密报文,非对称加密秘钥的混合加密方式。
- CA认证流程:
①由于服务端要下发公钥给客户端,公钥可能在下发过程中被篡改,因此需要验证服务端下发公钥的可靠性。
②服务端会向CA机构申请公钥,CA会用自己的私钥对将要下发给服务端的公钥进行签名,并嵌入证书发给服务端,服务端将这个CA签发的公钥证书发给客户端即可。
客户端浏览器内置了CA机构的公钥,会对服务端下发的公钥证书的签名进行校验,校验通过说明公钥证书确实是CA机构颁发的,值得信任(中间篡改者没有CA的私钥因此无法篡改公钥的签名信息)。
③客户端就可以用服务端发的这个公钥对自己生成的对称秘钥进行加密,发给服务端,之后的请求就用该对称秘钥加密内容即可。 - HTTPS通信步骤:
• 客户端发起请求->服务端下发公钥->客户端验证公钥->客户端用公钥加密对称秘钥发给服务端->服务端成功解密获取对称秘钥(正式开始通信)->客户端发送对称密文->服务端解密并回复->断开链接。
• 这中间的混合加密都是HTTPS自己做的,我们双方不用自己具体去指定加密算法。 - 有些机构自己颁发证书,这些证书不内置在浏览器里,因此称为自签名证书,服务端下发此类证书时,我们要么直接信任该证书,要么在客户端事先植入自签名公钥等。
- HTTPS的通信速度由于多次传输、加密解密等会受到影响,比HTTP慢2~100倍,因此敏感数据使用HTTPS,一般数据使用HTTP即可。
第八章:确认访问用户身份
- HTTP1.1使用4种认证方式:BASIC认证(基本认证)、DIGEST认证(摘要认证)、SSL客户端认证、FromBase(基于表单认证)。
- 几种认证方式特点:
• BASIC认证第一次服务端会以401返回码返回,客户端将ID和密码已Base64编码后发给服务端,例如VPN第一次登录时填写账号密码一样,不过Base64编码时可逆的,这种方式不太安全。
• DIGEST认证同样使用质询/响应的方式,客户端先发送认证要求,服务端返回质询码,客户端计算后返回响应码结果,服务端验证认证结果,安全也是有限。
• SSL认证需要客户端证书,双向认证,需要花钱。。
• FromBase就是web应用自己写的表单认证了,平时的web应用那样自己认证。 - 虽然可以web应用认证,但是HTTP是无状态协议,服务端需要再次认证的话需要将第一次认证的sessionID放到set-cookie字段返回给客户端,客户端保存起来下次发送该cookie,服务端找到相应的sessionID进行认证。
第九章:基于HTTP的功能追加协议
- HTTP比较简单,因此性能还是有一定瓶颈的,无状态,且每次请求都要刷新整个response,于是有了Ajax通过JS脚本发送请求刷新局部页面的API。
- 为了实现长连接,WebSocket技术问世,一旦浏览器与服务器建立了WebSocket协议的全双工通信连接,之后就走这个协议进行通信了,类似Java中的Socket。
- WebSocket第一次通信时需要一次Http的握手,首先客户端请求头添加Upgrade:websocket、Connection:Upgrade、Sec-WebSoeket-Key、Origin、Sec-Websocket-Protocol、Sec-Websocket-Version等首部字段;服务端返回101 Switching Protocols响应确认使用WebSocket协议,包括Connection:Upgrade、Sec-Websocket-Accept、Sec-Websocket-Protocol等首部字段。
后面的请求就使用ws://example.com/
协议通信了。
第十章:构建Web内容的技术:
- Web页面几乎全部由Html文档构建,Html是超文本标记语言,超文本是一种文档系统,可以将任意位置的信息和其他信息(图片、链接等)建立关联,即超链接文本,浏览器可以解析html文档渲染出丰富的富文本页面,markdown也是类似的。
- Html5解决了浏览器兼容性问题(标签解析不一致、语法更加简单等),并且动画更加简单和丰富。
- Css属于样式标准之一,配合Html解析成各种样式效果,更多时候我们使用动态构建Html网页技术来实现页面动态改变,使用JavaScript脚本语言可以控制html元素和改变其样式,类似Android中Java代码控制控件一样。
- Web应用的作用是每次客户端请求Web服务器从而动态下发html文档来返回用户需要的页面,配合JS请求和编辑Html文档,浏览器负责渲染。
- Servlet是一种能在服务器上创建动态内容的程序,运行在Web容器中,常驻内存,因此执行效率较高。
第十一章:Web攻击技术
- HTTP只是一个单纯的协议机制,本身并不具备安全机制。需要客户端和服务器之间自己做安全防范。
- Web攻击分为主动攻击和被动攻击两种。主动攻击就是直接攻击Web应用,注入攻击代码;被动攻击就类似钓鱼网站,诱导用户自己进入圈套非法获取用户信息等。
- 几种攻击方式:
• 跨站脚本攻击:动态创建非法HTML标签或Js脚本进行攻击,获取cookie或数据等(被动攻击)。
• SQL注入攻击:服务端的SQL语句也是根据客户端操作动态生成的,可以插入命令执行非法SQL查询等(主动攻击)。
• OS命令注入攻击:Web应用有时候收到客户端请求会通过命令打开本地其他应用进行一些操作(例如发邮件),此时可以注入非法命令执行非法操作(主动攻击)。
• HTTP首部注入攻击:攻击者可以拦截请求或相应首部进行非法首部字段注入,例如常见的缓存服务器首部注入攻击(主动攻击)。
• Dos攻击:拒绝服务攻击,通过海量僵尸请求使服务器处理过载,来逼迫服务器停止服务。