⭐HTTP
HTTP是一种计算机之间通信的协议,是客户端与服务端之间传输文字、图片、音频、视频等超文本数据的约定和规范。
HTTP通常跑在TCP/IP协议上,依靠IP协议实现寻址和路由,通过TCP协议实现数据传输,通过DNS协议实现域名查找,通过SSL/TLS协议实现安全通信。
HTTP和HTML的区别:
HTML是超文本的载体,是一种标记语言,使用各种标签来描述文字、图片、超链接等资源,而且还可以嵌入CSS、JavaScript来实现复杂的动态效果,最终通过浏览器来渲染出可视化的页面。
⭐HTTP调用过程
- 首先浏览器首先要从URI中提取协议名称和域名,再用DNS解析域名,得到目标IP地址。
- 然后通过 ”三次握手“ 与目标服务器建立TCP连接。
- 建立连接后,浏览器会按照HTTP协议规定的格式,通过TCP发送一个
GET / HTTP/1.1
这样的请求报文。 - 服务器收到请求报文后,会在TCP协议层面回复一个确认消息,表示请求报文已经收到了。然后根据HTTP协议开始解析报文内容。并把请求的资源拼接成HTTP格式的响应报文
HTTP/1.1 200 OK
,发送回去。 - 浏览器收到返回的响应报文之后,也会给服务器发送一个确认消息,表示响应报文已经收到了。
HTTP报文结构
HTTP协议的请求报文和响应报文的结构基本差不多,由三部分组成:
- 起始行(Start Line)
- 报文头(Header)
- 报文体(Body)
报文必须有header,但是可以没有body。
起始行
请求报文中起始行也叫请求行,主要包含三部分:
- 请求方式:GET、POST、DELETE、PUT等,表示对资源的操作类型。
- 请求目标:通常是一个资源路径,表示具体要请求的资源。
- 版本号:表示使用的HTTP协议版本。
GET / HTTP/1.1
:这个请求行里,”GET” 是请求方式,”/“ 是请求目标,”HTTP/1.1” 是版本号。
响应报文中的起始行叫状态行,主要包含三部分:
- 版本号:表示使用的HTTP协议版本。
- 状态码:表示请求处理的结果,比如200是成功,404是资源未找到,500是服务器错误。
- 原因:是状态码的补充,是更详细的文字描述。
HTTP/1.1 200 OK
:这个状态行中,”HTTP/1.1” 是版本号、”200” 是状态码、”OK” 是具体的描述。
报文头
请求报文和响应报文中头部结构基本是一样的,头部字段是key-value的形式,用 “:” 分隔,用换行符表示字段结束。
报文头中可以添加任意自定义的字段,拓展性很强。
需要注意的是:
- 字段名不区分大小写,Host也可以写成host。
- 字段名不可用包含空格,可以用横杠 “-“ ,不能用下划线 “_”。
- 字段名后面必须紧跟着冒号 “:”,不能有空格。
常用的头字段
通用字段:在请求报文和响应报文都可以出现。
- Date:表示HTTP报文的创建时间,客户端可以根据这个字段做一些缓存策略。
- Via:用来表示代理服务器身份。每经过一个代理节点,代理服务器就会把自身的信息追加到字段的末尾:
Via: proxy1,proxy2...
。
请求字段:只能出现在请求头中,一般是用来说明请求信息。
Host:是唯一一个HTTP协议规定的必须出现的字段,主要是告诉服务器这个请求应该由哪个主机来处理。
User-Agent:用来描述发起这个HTTP请求的客户端的信息,服务器可以根据这个字段来返回最适合这个浏览器的页面。
但是实际上User-Agent特别混乱,有很多外壳浏览器都自称是 “Chrome”、”FireFox”、”Safari”,企图通过这个字段来伪装,就导致User-Agent变得毫无意义。
也有一些比较友好的爬虫会在User-Agent里用 “spider” 表明自己是爬虫,可以利用这个字段做简单的反爬虫策略。
Accept:表示客户端希望接收到什么样的数据。
响应字段:只能出现在响应头中,用来补充响应报文信息。
- Server:用来表示当前正在提供服务的软件名称和版本号。因为这会把服务器的一部分信息暴露给外界,如果这个版本正好有一些bug,那黑客就可能会利用这个bug去攻击服务器。所以一般网站的响应头中要么没有这个字段,要么就给一个不相关的信息。
- Content-Type:告诉客户端实际返回了什么类型的数据。
- Connection: keep-alive:表示支持长连接。
实体字段:专门用来描述body的额外信息。
- Content-Length:表示报文中body的长度,如果没有这个字段,就说明body是不定长的,需要用chunked方式分段传输。
⭐连接管理
HTTP/1.1版本之前,采用的是短链接,收到报文后会立刻关闭连接。
短链接的短板很严重,因为在TCP协议中,建立连接需要 “3次握手”,会发送3个数据包,关闭连接是 “4次握手”,会发送4个数据包。而一次请求和响应只需要发送4个数据包(请求、收到请求、响应、收到响应)。
创建和销毁连接的代价比实际传输数据的代价还要高。
在HTTP/1.1版本采用了长连接,客户端向服务器发送一次请求,之后的请求会复用第一次创建的连接。
服务器一般都会在响应头中添加Connection: keep-alive表示支持长连接。
长连接也是有缺点的,因为服务器必须在内存中保存连接的状态,这就占用了服务器的资源,如果有大量空连接存在,就会浪费很多服务器的资源。
客户端可以在请求头中,添加Connection: close字段,通知服务器关闭连接,服务器就会在响应头中也加上这个字段,发送之后就会关闭连接。
服务端一般不会主动关闭连接,也可以使用一些策略:
比如Nginx可以使用 keepalive_timeout
指令,设置长连接的超时时间,如果一段时间内没有任何数据收发就会主动断开连接。
队头阻塞:
因为HTTP规定了报文必须是 “一发一收”,这就形成了一个先进先出的队列,如果前面的请求处理的很慢,就会阻塞后面的请求。
因为 “请求-应答” 模型不能改,所以队头阻塞无法彻底解决,HTTP通过并发连接来缓解队头阻塞的问题。
但是并发连接压榨出的性能还是跟不上需求,有些公司就开始用域名分片来提升长连接的数量。
并发连接:就是同时对一个域名发起多个长连接,这种方式也有缺点,如果每个客户端都建立很多连接,并发量就会很高,服务器根本扛不住。HTTP协议建议每个客户端最多并发2个连接。
域名分片:域名分片就是用多个域名指向同一台服务器,这样实际长连接的数量就上去了。
HTTP的特点
拓展性:
- HTTP协议最开始的时候比较简单,只是规定了报文的基本格式,比如用空格分隔单词,用换行分隔字段,报文内容没有严格的语法限制,可以由开发者随意定制。
- 后来HTTP协议逐渐增加了请求方法、版本号、状态码、头字段等特性,而body也不只是文本或HTML,而是可以传输图片、视频等任意数据。这些都依赖HTTP的灵活可扩展的特性。
可靠性:
- 因为HTTP协议是基于TCP/IP协议的,TCP/IP本身就是一个可靠的传输协议。
通用性:
- HTTP几乎可以传输任何数据,通用性很强。相比于其它协议,比如FTP只能传文件、SMTP只能发邮件、SSH只能远程登录。
无状态:
- 在HTTP协议中,每次收发报文都是独立的操作,没有任何联系。
状态其实就是客户端或者服务器保存的一些数据或标志位,记录了通信过程中的一些变化信息。
Cookie机制
HTTP是无状态的,但是现在很多的应用程序都需要用户登录之后才能执行某些操作,在HTTP协议中每次请求都是独立的操作,服务器就不知道有哪些客户端是已经登陆过的。
Cookie机制就相当于把 “登录状态” 给缓存起来,发送请求的时候再把这些信息发送给服务器,这样服务器就知道这个请求是谁发的了。
Cookie可以理解为就是服务器委托浏览器存储在客户端里的一些数据,这些数据可以用来表示用户的身份信息。
Cookie的工作流程:
- 浏览器第一次访问服务器的时候,服务器肯定不知道他是谁。服务器就需要创建一个key-value格式的标识,然后放到响应头中的 Set-Coolie 这个字段里面,然后发送给浏览器。
- 浏览器收到响应报文之后,看到响应头中有 Set-Cookie 字段,就知道这是服务器给的身份标识,就会把这个标识保存起来,下次再请求的时候就会自动把这个值放到请求头中的 Cookie 字段里面,发送给服务器。
- 第二次请求里面有了 Cookie 字段,服务器就可以通过 Cookie 字段中的值,识别出用户的身份。
Cookie的作用域:
可以通过 Domain和 Path 这两个属性指定Cookie所属的域名和路径,让浏览器只发送给特定的URI。
浏览器在发送Cookie前会从URI中提取出host和path部分,然后跟Cookie中的属性对比,如果不相等,就不会在请求头中发送Cookie。
可以用这两个属性为不同的URI分别设置Cookie。Path用一个 “/“ 表示域名下的任意路径都可以用Cookie。
Cookie的安全性:
在JS脚本中可以用document.cookie
来读写Cookie中的数据,这就有可能导致跨站脚本(XSS)攻击。
解决办法有三种:
HttpOnly: 告诉浏览器,这个Cookie只能通过HTTP协议传输,这样浏览器就会禁用
document.cookie
这些脚本。SameSite:可以防止”跨站请求伪造”(XSRF)攻击。
“SameSite=Strict” 可以严格限定Cookie不能跨站发送,
“SameSite=Lax”允许 GET/HEAD安全方法,但是禁止POST跨站发送。
Secure:表示这个Cookie只能用HTTPS协议加密传输,明文的HTTP协议会禁止发送,但Cookie本身不是加密的,浏览器中还是以明文的形式存在。
Cookie的应用场景:
身份识别:Cookie最常见的应用场景就是识别客户端身份,保存用户登录的信息。
广告跟踪:我们在上网的时候,网页上一般都会有很多广告图片,这些图片点击之后都会跳转到广告商的网站,这些广告就会在Cookie上添加一些信息,这样在上其它网站的时候,别的广告就能用Cookie读出这些信息,分析之后,再推广告。
为了防止滥用Cookie搜集用户信息,互联网组织相继提出了 DNT(Do Not Track) 和 P3P(Platform for Privacy Preference Project)。但实际上作用不大。
缓存控制
浏览器使用HTTP获取资源的成本比较高,就会把一些数据缓存起来,下次请求的时候尽可能的复用,可以节约带宽,加快响应速度。
缓存验证:
浏览器做缓存使用前还需要去服务器验证是否是最新的,这样的请求成本太高了,所以HTTP协议就定义了一些条件请求字段,专门来检查资源是否过期。
- 服务器第一次在响应头中需要提供 Last-modified 和 ETag 字段
- 客户端第二次请求的时候,通过 if-Modified-Since 字段带上缓存里的原值,验证资源是否是最新的。
- 如果资源没有变,服务器会回应“304 Not Modified” 表示缓存依然有效,浏览器就可以更新一下有效期,继续使用缓存了。
Last-Modified:文件最后的修改时间。
ETag:实体标签(Entity Tag),是资源的唯一标识。
服务器对客户端的缓存控制:
服务器会在响应头中添加 Cache-Control: max-age=value 字段,用来标记数据的有效期,max-age的单位是秒,相当于告诉浏览器,这个页面只能缓存这么久。
- Cache-Control: no_store:不允许缓存,一般用在一些变化特别频繁的数据。比如秒杀页面。
- Cache-Control: no_cache:可以缓存,但是使用之前需要去服务器验证是否有新的版本。
- Cache-Control: must_revalidate:如果缓存不过期就可以继续使用,如果过期了就需要去服务器验证一下,如果没有新的版本就可以继续使用。
服务器对代理服务器的缓存控制:
客户端和代理服务器是不一样的,客户端的缓存只是用户自己使用,代理的缓存可能会给很多客户端提供服务,所以就需要对它的缓存加一些限制条件。
private:表示缓存只能在客户端保存,是用户私有的,不能和别人共享。private,max-age=5
public:表示缓存是完全开放的,谁都可以用。public,max-age=5,s-maxage=10
proxy-revalidate:表示客户端可以到存储在代理服务器上的缓存做验证,但如果是私有缓存也需要回源服务器验证。
s-maxage:用来限定数据可以在代理服务器中生存多久。
no-transform:表示禁止对数据做一些额外的处理,比如把图片生成png、webp之类的格式。
客户端对源服务器的缓存控制:
浏览器也可以在请求头中添加 Cache-Control 字段。
其实在浏览器中点刷新按钮的时候,浏览器就会在请求头上加一个 “Cahce-Control: max-age=0“,服务器看到max-age=0,就会返回最新的数据给浏览器。
浏览器中 “Ctrl+F5” 的强制刷新,就是发了一个 “Cache-Control: no-cache“,和 max-age=0含义一样。
浏览器中点击 “前进” 和 “后退” 按钮,通常可以在状态栏中看到 from disk cache
的描述,意思是从磁盘上读取的缓存。
客户端对代理服务器的缓存控制:
max-stale:表示如果代理服务器上的缓存过期了也可以接受,但是不能过期太多,必须在指定的时间内。
min-fresh:表示缓存必须有效,而且必须在指定的时间内依然有效。
only-if-cached:表示只接受代理缓存的数据,不接受源服务器的响应。
代理服务
代理服务就是指,服务本身不生产数据,而是转发上下游的请求和响应。
代理服务器需要用 Via 字段表明身份。每经过一个代理节点,代理服务器就会把自身的信息追加到字段的末尾:Via: proxy1,proxy2...
。
可以通过 X-Forwarded-For 和 X-Real-IP 来获取客户端的地址:
X-Forwarded-For 每经过一个代理节点就会在字段里追加代理服务器的IP地址,所以第一个IP地址就是客户端的地址。
X-Real-IP 就是记录客户端的IP地址,没有中间代理服务器的信息。
有了 X-Forwarded-For 等字段,源服务器就可以拿到客户端的信息了,但是对于代理服务器来说并不是最佳方案。因为通过 X-Forwarded-For 操作代理信息必须要解析修改HTTP报文,会降低代理的转发性能。并且如果使用HTTPS通信,是无法修改原始报文的,所以就出现了专门的代理协议。
代理协议:
它其实是在HTTP报文前增加了一行ASCII码文本,相当于又多了一个头。
这行文本的开头必须是 “PROXY” 五个大写字母,然后是 “TCP4” 或者 “TCP6”,表示客户端的IP地址类型,再后面是请求方地址、应答方地址、请求方端口、应答方端口、最后用一个换行符结束。
1 | PROXY TCP4 192.168.0.1 192.168.0.2 5555 80 |
这样服务器只需要解析第一行就可以拿到客户端的地址。
代理的作用:
负载均衡:代理最基本的一个功能就是 负载均衡,由代理服务器来控制由哪台服务器来响应请求。
健康检查:使用 “心跳” 机制监控后端服务器,发现有故障就踢出集群,保证服务的可用性。
加密卸载:对外网使用SSL/TLS加密通信认证,对内网不加密,消除加密成本。
内容缓存:暂存、复用服务器响应。
⭐HTTPS
HTTPS为HTTP增加了一些安全特性,默认端口号从80改成443。
之所以会有HTTPS,是因为HTTP的传输过程是透明的,任何人都能在链路中获取并修改报文结构。
比如代理服务器可以作为HTTP通信的中间人,可以修改报文的结构,浏览器和服务器没办法辨别报文的真假。
HTTPS把底层的传输协议换成了SSL/TLS,传输报文调用的都是安全接口。
⭐调用过程
- 浏览器首先会从URI中提取出协议名称和域名,然后通过DNS解析域名,得到目标的IP地址。
- 然后通过 “三次握手” 与服务器建立TCP链接。
- 然后执行TLS握手,建立安全链接。
- 之后就是和HTTP一样的报文收发过程了。
HTTPS的性能优化
HTTPS的连接主要分为两部分,第一个是建立连接时的非对称加密握手,第二个是握手之后的对称加密报文传输。
目前主流的加密算法的性能都很好,所以通常HTTPS比HTTP慢,主要是慢在建立安全连接。
TCP建立连接之后,HTTPS比HTTP多了一个TLS握手的环节,不做任何优化的情况下,HTTPS建立连接可能比HTTP慢几百毫秒到几秒。
现在的优化方案也有很多:硬件优化、软件优化、证书优化、会话复用
硬件优化:
可以选择SSL加速服务器,加解密的时候调用它的API,让专门的硬件来做加密和解密,这样可以分摊CPU的运算压力。
软件优化:
把正在使用的软件尽量升级到新的版本,比如把Linux内核从2.x升级到4.x,把nginx从1.6升级到1.1.6。
证书优化:
握手过程中,证书的验证也是一个比较耗时的操作,服务器需要把自己的证书链全发给客户端,客户端接收后再验证。
客户端验证证书其实是个很复杂的过程,首先要根据公钥解密验证证书的签名,还要再去访问证书认证机构,确保证书没有被撤销,这又会产生网络通信。
可以通过OCSP补丁让服务器预先访问证书认证机构获取响应,然后在建立连接的时候和证书一起发送给客户端,这样就可以避免客户端再去连接证书认证机构了。
会话复用:
会话复用分两种:
第一种叫 “Session ID”,就是客户端和服务器建立连接之后,会各自保存一个会话的ID号存在内存里,里面主要存储一些密钥之类的信息,当客户端发送第二次请求的时候,把”Session ID”一起发过去,服务器就在内存中找这个”Session ID”,找到了就直接恢复会话状态,跳过证书验证和密钥交换,可以直接建立通信。
因为服务器必须保存每一个客户端的会话ID,如果用户量很大的话,就会加重服务器的负担,所以又出现了第二种 会话票证 的方案。
会话票证(Session Ticket),它有点类似Cookie。服务器加密会话信息之后,发送给客户端,由客户端来存储会话信息。重新连接的时候,客户端再把会话信息发送给服务器,服务器验证有效期之后就可以恢复会话了。
“Session Ticket” 需要使用一个固定的密钥文件来加密,为了防止密钥被破解,密钥文件需要定期更换。
什么是安全
一般来说,如果通信过程具备了四个特性就可以认为是安全的:
机密性:
加密主要分为两大类:对称加密和非对称加密。
对称加密:
- 对称加密就是,加密和解密用的都是同一个密钥,只要保证密钥的安全,就是安全的。
- 对称加密有一个很大的问题,就是如何把密钥安全的传递给对方,也叫密钥交换。所以就出现了非对称加密。
非对称加密:
- 非对称加密有两个密钥,一个叫 公钥,一个叫 私钥。这两个密钥是不一样的,公钥可以公开给任何人,但是私钥必须严格保密。
- 非对称加密可以解决 密钥交换的问题,网站来管理私钥,然后在网上发布公钥,用公钥就可以登录网站,但是密码必须要通过私钥才能破解,黑客没有私钥,所以就没办法破解密码。
- 非对称加密的问题是,算法的运算速度很慢,于是又有通过混合加密的方式解决运算速度的问题。
混合加密:
- TLS协议中使用的就是混合加密。
- 混合加密其实就是对称加密和非对称加密的混合版本,通过非对称加密解决密钥交换的问题,之后的通信全部使用对称加密。
- 加密流程:
- 服务端生成一对公钥和私钥,并且把公钥发送给客户端。
- 客户端随机生成一个会话密钥,并且用会话密钥加密需要发送的数据。
- 客户端再用公钥加密会话密钥,然后把前两步的加密结果发送给服务端
- 服务端收到数据后,利用自己的私钥解密,可以得到会话密钥。
- 最后利用会话密钥解密客户端发送的数据。
完整性:
实现完整性的手段主要是摘要算法,比如哈希函数。摘要算法可以把任意长度的数据压缩成一个固定长度的字符串。
只要在原始数据后面附上它的摘要,如果黑客在中间改动了任何内容,摘要就会完全不同,这样就可以保证数据的完整性。
身份认证和不可否认:
非对称加密中的私钥,再加上摘要算法,就能实现数字签名。数字签名可以保证身份认证和不可否认。
数字签名的原理其实很简单,就是把公钥私钥的用法反过来,之前是公钥加密、私钥解密,现在是私钥加密、公钥解密。
数字签名是完全公开的,但是这个签名只有用私钥对应的公钥才能解开,拿到摘要后,再对比源数据的完整性,就像签字盖章一样。
只要客户端和服务器互相交换公钥,就可以用“签名”和“验签”来确认消息的真实性,因为私钥保密,黑客不能伪造签名,就能够保证通信双方的身份。
数字证书和CA:
这里还有一个问题就是,谁都可以发布公钥,怎么来判断这个公钥是百度的还是黑客的呢?
CA是证书认证机构,由它来给各个公钥签名,确保公钥是可信的。
CA 对公钥的签名认证也是有格式的,会把序列号、用途、颁发者、有效时间等等,把这些打成一个包再签名,完整地证明公钥关联的各种信息,形成“数字证书”(Certificate)。
⭐SSL/TLS
SSL协议是一个负责加密通信的安全协议,运行在在TCP/IP协议上。
SSL协议是由网景公司发明的,发展到3.0版本时改名为TLS。
OpenSSL:是一个开源密码学工具包,支持很多加密算法和协议,很多软件都用它来实现TLS功能,比如Apache、Nginx。
TLS协议的组成
TLS协议包含几个子协议,可以理解成是负责不同功能的模块:
- 记录协议:规定了TLS收发数据的基本单位:记录,其它子协议都需要通过记录协议发送数据,多个记录可以在一个TCP包中一次发出去,不需要像TCP那样返回确认消息。
- 报警协议:用来向对方发出警报信息,有点像HTTP协议中的状态码,收到警报后可以选择继续或者终止连接。
- 握手协议:浏览器和服务器会在握手过程中协商TLS版本号、随机数、密码套件等信息,然后交换证书和密钥,最终双方得到会话密钥。
- 变更密码协议:通知对方,后续的数据会被加密。
TLS握手过程
- 在建立了TCP连接之后,浏览器首先会发一个 “Client Hello” 消息,里面包含协议的版本信息、支持的密码组件、随机数(用于后续生成会话密钥)。
- 服务器收到消息之后,会返回一个 “Server Hello” 消息,包含协议的版本号、根据客户端发来的消息选择一个密码组件和服务器生成的随机数。
- 之后服务器会把证书以及公钥和私钥的签名认证发送给客户端。
- 客户端拿到服务器的证书后就开始验证证书是否有效,再验证公钥和签名,就可以确认服务器的身份。
- 客户端再把公钥发送给服务器。
- 服务器和客户端都拿到两个随机数之后,就用ECDHE算法算出一个新的随机数,然后用这三个随机数生成会话密钥。
- 最后客户端和服务器把之前发送的数据做个摘要,再加密一下,发送给服务器做验证, 双方都验证加密解密没问题,握手就结束了。
⭐TCP/IP
TCP/IP协议实际上是一系列网络通信协议的统称,其中最核心的两个协议是TCP和IP。其它的还有UDP、ICMP、ARP等。
TCP/IP协议一共有四层:应用层,传输层,网络层,连接层。
TCP和IP分别属于传输层和网络层。
IP协议
IP协议主要是用来解决寻址和路由的问题,以及如何在两个节点之间传送数据包。
IP协议需要通过IP地址来定位互联网上的每一台计算机。
TCP协议
TCP协议位于IP协议之上,基于IP协议提供可靠的字节流形式的通信。
TCP协议是一个有状态的协议,需要先与对方建立连接才能发送数据,并且保证数据不丢失,不重复。数据是连续的。
UDP协议是无状态的,不用先建立连接就可以发送数据,但不保证数据一定会发送到对方。数据是分散的小数据包,顺序发,乱序收。
网络分层模型
第一层叫 ”链接层“ ,负责在底层网络上发送原始数据包,在网卡层面工作,使用mac地址来标记网络中的设备。
第二层叫 ”网络层“,IP协议就在这一层,因为IP协议规定了IP地址的概念,所以就可以在 ”链接层“的基础上,用IP地址取代mac地址,把许多局域网、广联网连接成一个大的网络,在这个网络查找设备时,只要把IP地址再翻译成mac地址就可以了。
第三层叫 ”传输层“,TCP协议就在这一层,用来保证数据可靠的传输。
第四层叫 ”应用层“,应用层是面向具体应用的协议。比如FTP、SMTP、HTTP。
层次的顺序是从下往上的,第一层也就是最下面的一层。
OSI网络分层模型
OSI全称是开放式系统互联通信参考模型。
- 第一层是 ”物理层“,是网络的物理形式,比如电缆、光纤、网卡之类的设备。
- 第二层是 ”数据链路层“,它基本相当于TCP/IP的链路层。
- 第三层是 ”网络层“,相当于TCP/IP协议中的网际层。
- 第四层是 ”传输层“,相当于TCP/IP协议中的传输层。
- 第五层是 ”会话层“,用来维护网络中的连接状态,保持会话和同步。
- 第六层是 ”表示层“,把数据转换为合适,可理解的语法和语义。
- 第七层是 ”应用层“,面向具体的应用传输数据。
两个分层模型的映射关系:
第一层:物理层,TCP/IP中无对应
第二层:数据链路层,对应TCP/IP的连接层。
第三层:网络层,对应TCP/IP的网际层。
第四层:传输层,对应TCP/IP的传输层。
第五层、第六层、第七层:对应TCP/IP的应用层。
RPC
RPC就是把网络通信封装成函数调用的形式,本质上还是网络通信。
CDN
CDN(Content Delivery Network),主要应用在HTTP协议中的缓存和代理技术,用来代替原网站响应客户端的请求。
CDN可以缓存网站上的数据,让浏览器的请求在半路上就可以得到响应。
浏览器
浏览器的正式名字叫 ”Web Browser“,就是用来查看互联网上的网页资源。
浏览器的本质是一个HTTP协议中的请求方,使用HTTP协议获取网络上的各种资源。
在HTTP协议中,浏览器的角色被称为 ”User Agent“(用户代理),意思是作为访问者的”代理“来发起HTTP请求,一般都简单的称为”客户端“。
Web服务器
服务器就是HTTP协议中的应答方。
Web服务器包含两个含义:软件和硬件
软件:就是提供Web服务的应用程序,运行在硬件服务器上,利用硬件能力来处理客户端发来的HTTP请求。
硬件:就是物理形式或者云形式的机器,通常是利用反向代理、负载均衡技术组成的集群。
常见的Web服务器有:Apache、Nginx、Jetty、Tomcat等
代理
代理是HTTP协议中,请求方和应答方中间的一个环节,可以转发客户端的请求,也可以转发服务器的应答。
代理的种类有很多:
- 匿名代理:完全隐匿了被代理的机器,外界只能看到被代理的服务器。
- 透明代理:在传输过程中是透明的,外界知道代理,也知道客户端。
- 正向代理:代表客户端向服务端发送请求。
- 反向代理:代表服务器响应客户端的请求。
CDN实际上也是一种代理,它代替服务器响应客户端的请求,通常扮演者透明代理和反向代理的角色。
因为在传输过程中,插入了中间环节,所以在这个环节可以做很多事情:
- 负载均衡:把请求均匀分发到多台机器。
- 内容缓存:暂存上下行的数据,减轻后端的压力。
- 安全防护:隐藏IP,使用WAF抵御网络攻击,保护被代理的机器。
- 数据处理:可以提供压缩、加密等额外功能。
HTML / WebService / WAF
HTML:
HTML是HTTP协议传输的主要内容之一,它主要用来描述超文本页面,通过各种标签,来定义文字、图片等资源的排版和布局,最终由浏览器渲染出可视化的页面。
HTML目前主要有两个标准,HTML4和HTML5。
WebService:
WebService是一种应用服务开发规范,采用的是CS架构,用HTTP协议传输XML或JSON消息,它是一个基于HTTP的服务架构技术。
因为采用了HTTP协议传输数据,所以在WebService中,服务端和客户端可以采用不同的操作系统和编程语言开发。
WAF:
WAF是”网络应用防火墙“,用来检测HTTP流量,是防护Web应用安全的技术。
WAF通常在Web服务器之前,可以防止SQL注入、跨站脚本攻击等。目前应用比较多的一个开源项目是ModSecurity,可以集成进Apache或者Nginx。