0%

网络协议

⭐HTTP

HTTP是一种计算机之间通信的协议,是客户端与服务端之间传输文字、图片、音频、视频等超文本数据的约定和规范

HTTP通常跑在TCP/IP协议上,依靠IP协议实现寻址和路由,通过TCP协议实现数据传输,通过DNS协议实现域名查找,通过SSL/TLS协议实现安全通信

HTTP和HTML的区别:

HTML是超文本的载体,是一种标记语言,使用各种标签来描述文字、图片、超链接等资源,而且还可以嵌入CSS、JavaScript来实现复杂的动态效果,最终通过浏览器来渲染出可视化的页面。

⭐HTTP调用过程

  1. 首先浏览器首先要从URI中提取协议名称和域名,再用DNS解析域名,得到目标IP地址。
  2. 然后通过 ”三次握手“ 与目标服务器建立TCP连接。
  3. 建立连接后,浏览器会按照HTTP协议规定的格式,通过TCP发送一个 GET / HTTP/1.1 这样的请求报文。
  4. 服务器收到请求报文后,会在TCP协议层面回复一个确认消息,表示请求报文已经收到了。然后根据HTTP协议开始解析报文内容。并把请求的资源拼接成HTTP格式的响应报文 HTTP/1.1 200 OK,发送回去。
  5. 浏览器收到返回的响应报文之后,也会给服务器发送一个确认消息,表示响应报文已经收到了。

HTTP报文结构

HTTP协议的请求报文和响应报文的结构基本差不多,由三部分组成:

  1. 起始行(Start Line)
  2. 报文头(Header)
  3. 报文体(Body)

报文必须有header,但是可以没有body。

起始行

请求报文中起始行也叫请求行,主要包含三部分:

  1. 请求方式:GET、POST、DELETE、PUT等,表示对资源的操作类型。
  2. 请求目标:通常是一个资源路径,表示具体要请求的资源。
  3. 版本号:表示使用的HTTP协议版本。

GET / HTTP/1.1:这个请求行里,”GET” 是请求方式,”/“ 是请求目标,”HTTP/1.1” 是版本号。

响应报文中的起始行叫状态行,主要包含三部分:

  1. 版本号:表示使用的HTTP协议版本。
  2. 状态码:表示请求处理的结果,比如200是成功,404是资源未找到,500是服务器错误。
  3. 原因:是状态码的补充,是更详细的文字描述。

HTTP/1.1 200 OK:这个状态行中,”HTTP/1.1” 是版本号、”200” 是状态码、”OK” 是具体的描述。

报文头

请求报文和响应报文中头部结构基本是一样的,头部字段是key-value的形式,用 “:” 分隔,用换行符表示字段结束。

报文头中可以添加任意自定义的字段,拓展性很强。

需要注意的是:

  1. 字段名不区分大小写,Host也可以写成host。
  2. 字段名不可用包含空格,可以用横杠 “-“ ,不能用下划线 “_”。
  3. 字段名后面必须紧跟着冒号 “:”,不能有空格。

常用的头字段

  • 通用字段:在请求报文和响应报文都可以出现。

    • 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的工作流程

  1. 浏览器第一次访问服务器的时候,服务器肯定不知道他是谁。服务器就需要创建一个key-value格式的标识,然后放到响应头中的 Set-Coolie 这个字段里面,然后发送给浏览器。
  2. 浏览器收到响应报文之后,看到响应头中有 Set-Cookie 字段,就知道这是服务器给的身份标识,就会把这个标识保存起来,下次再请求的时候就会自动把这个值放到请求头中的 Cookie 字段里面,发送给服务器。
  3. 第二次请求里面有了 Cookie 字段,服务器就可以通过 Cookie 字段中的值,识别出用户的身份。

Cookie的作用域

可以通过 DomainPath 这两个属性指定Cookie所属的域名和路径,让浏览器只发送给特定的URI。

浏览器在发送Cookie前会从URI中提取出host和path部分,然后跟Cookie中的属性对比,如果不相等,就不会在请求头中发送Cookie。

可以用这两个属性为不同的URI分别设置Cookie。Path用一个 “/“ 表示域名下的任意路径都可以用Cookie。

Cookie的安全性

在JS脚本中可以用document.cookie来读写Cookie中的数据,这就有可能导致跨站脚本(XSS)攻击。

解决办法有三种:

  1. HttpOnly: 告诉浏览器,这个Cookie只能通过HTTP协议传输,这样浏览器就会禁用document.cookie这些脚本。

  2. SameSite:可以防止”跨站请求伪造”(XSRF)攻击。

    “SameSite=Strict” 可以严格限定Cookie不能跨站发送,

    “SameSite=Lax”允许 GET/HEAD安全方法,但是禁止POST跨站发送。

  3. Secure:表示这个Cookie只能用HTTPS协议加密传输,明文的HTTP协议会禁止发送,但Cookie本身不是加密的,浏览器中还是以明文的形式存在。

Cookie的应用场景

  1. 身份识别:Cookie最常见的应用场景就是识别客户端身份,保存用户登录的信息。

  2. 广告跟踪:我们在上网的时候,网页上一般都会有很多广告图片,这些图片点击之后都会跳转到广告商的网站,这些广告就会在Cookie上添加一些信息,这样在上其它网站的时候,别的广告就能用Cookie读出这些信息,分析之后,再推广告。

为了防止滥用Cookie搜集用户信息,互联网组织相继提出了 DNT(Do Not Track) 和 P3P(Platform for Privacy Preference Project)。但实际上作用不大。

缓存控制

浏览器使用HTTP获取资源的成本比较高,就会把一些数据缓存起来,下次请求的时候尽可能的复用,可以节约带宽,加快响应速度。

缓存验证

浏览器做缓存使用前还需要去服务器验证是否是最新的,这样的请求成本太高了,所以HTTP协议就定义了一些条件请求字段,专门来检查资源是否过期。

  1. 服务器第一次在响应头中需要提供 Last-modifiedETag 字段
  2. 客户端第二次请求的时候,通过 if-Modified-Since 字段带上缓存里的原值,验证资源是否是最新的。
  3. 如果资源没有变,服务器会回应“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-ForX-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,传输报文调用的都是安全接口。

⭐调用过程

  1. 浏览器首先会从URI中提取出协议名称和域名,然后通过DNS解析域名,得到目标的IP地址。
  2. 然后通过 “三次握手” 与服务器建立TCP链接。
  3. 然后执行TLS握手,建立安全链接。
  4. 之后就是和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” 需要使用一个固定的密钥文件来加密,为了防止密钥被破解,密钥文件需要定期更换。

什么是安全

一般来说,如果通信过程具备了四个特性就可以认为是安全的:

  1. 机密性:对数据进行加密。
  2. 完整性:是指数据在传输过程中不会被修改。
  3. 身份认证:确认对方的真实身份。
  4. 不可否认:已经发生过的行为不能诋毁。

机密性

加密主要分为两大类:对称加密非对称加密

  • 对称加密

    • 对称加密就是,加密和解密用的都是同一个密钥,只要保证密钥的安全,就是安全的。
    • 对称加密有一个很大的问题,就是如何把密钥安全的传递给对方,也叫密钥交换。所以就出现了非对称加密
  • 非对称加密

    • 非对称加密有两个密钥,一个叫 公钥,一个叫 私钥。这两个密钥是不一样的,公钥可以公开给任何人,但是私钥必须严格保密。
    • 非对称加密可以解决 密钥交换的问题,网站来管理私钥,然后在网上发布公钥,用公钥就可以登录网站,但是密码必须要通过私钥才能破解,黑客没有私钥,所以就没办法破解密码。
    • 非对称加密的问题是,算法的运算速度很慢,于是又有通过混合加密的方式解决运算速度的问题。
  • 混合加密

    • TLS协议中使用的就是混合加密
    • 混合加密其实就是对称加密非对称加密的混合版本,通过非对称加密解决密钥交换的问题,之后的通信全部使用对称加密。
    • 加密流程:
      1. 服务端生成一对公钥和私钥,并且把公钥发送给客户端。
      2. 客户端随机生成一个会话密钥,并且用会话密钥加密需要发送的数据。
      3. 客户端再用公钥加密会话密钥,然后把前两步的加密结果发送给服务端
      4. 服务端收到数据后,利用自己的私钥解密,可以得到会话密钥。
      5. 最后利用会话密钥解密客户端发送的数据。

完整性

实现完整性的手段主要是摘要算法,比如哈希函数。摘要算法可以把任意长度的数据压缩成一个固定长度的字符串。

只要在原始数据后面附上它的摘要,如果黑客在中间改动了任何内容,摘要就会完全不同,这样就可以保证数据的完整性

身份认证不可否认

非对称加密中的私钥,再加上摘要算法,就能实现数字签名。数字签名可以保证身份认证和不可否认。

数字签名的原理其实很简单,就是把公钥私钥的用法反过来,之前是公钥加密、私钥解密,现在是私钥加密、公钥解密。

数字签名是完全公开的,但是这个签名只有用私钥对应的公钥才能解开,拿到摘要后,再对比源数据的完整性,就像签字盖章一样。

只要客户端和服务器互相交换公钥,就可以用“签名”和“验签”来确认消息的真实性,因为私钥保密,黑客不能伪造签名,就能够保证通信双方的身份。

数字证书和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握手过程

  1. 在建立了TCP连接之后,浏览器首先会发一个 “Client Hello” 消息,里面包含协议的版本信息、支持的密码组件、随机数(用于后续生成会话密钥)。
  2. 服务器收到消息之后,会返回一个 “Server Hello” 消息,包含协议的版本号、根据客户端发来的消息选择一个密码组件和服务器生成的随机数。
  3. 之后服务器会把证书以及公钥和私钥的签名认证发送给客户端。
  4. 客户端拿到服务器的证书后就开始验证证书是否有效,再验证公钥和签名,就可以确认服务器的身份。
  5. 客户端再把公钥发送给服务器。
  6. 服务器和客户端都拿到两个随机数之后,就用ECDHE算法算出一个新的随机数,然后用这三个随机数生成会话密钥。
  7. 最后客户端和服务器把之前发送的数据做个摘要,再加密一下,发送给服务器做验证, 双方都验证加密解密没问题,握手就结束了。

⭐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协议中,请求方和应答方中间的一个环节,可以转发客户端的请求,也可以转发服务器的应答

代理的种类有很多:

  1. 匿名代理:完全隐匿了被代理的机器,外界只能看到被代理的服务器。
  2. 透明代理:在传输过程中是透明的,外界知道代理,也知道客户端。
  3. 正向代理:代表客户端向服务端发送请求。
  4. 反向代理:代表服务器响应客户端的请求。

CDN实际上也是一种代理,它代替服务器响应客户端的请求,通常扮演者透明代理和反向代理的角色。

因为在传输过程中,插入了中间环节,所以在这个环节可以做很多事情:

  1. 负载均衡:把请求均匀分发到多台机器。
  2. 内容缓存:暂存上下行的数据,减轻后端的压力。
  3. 安全防护:隐藏IP,使用WAF抵御网络攻击,保护被代理的机器。
  4. 数据处理:可以提供压缩、加密等额外功能。

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。