返回
Featured image of post 计算机网络 - 应用层

计算机网络 - 应用层

应用层为特定应用程序提供数据传输服务,例如 HTTP,DNS 等协议,数据单位为报文.

常用端口及协议

应用 协议 端口号 传输层 备注
域名解析 DNS 53 UDP/TCP 长度超过 512 字节时使用 TCP
动态主机配置协议 DHCP 67/68 UDP
简单网络管理协议 SNMP 161/162 UDP
文件传送协议 FTP 20/21 TCP 控制连接 21,数据连接 20
远程终端协议 TELNET 23 TCP
超文本传送协议 HTTP 80 TCP
简单邮件传送协议 SMTP 25 TCP
邮件读取协议 POP3 110 TCP
网际报文存取协议 IMAP 143 TCP
超文本传送协议 HTTPS 443 TCP

域名系统

DNS ( Domain Name System ) 是一个分布式数据库,提供了主机名和 IP 地址之间相互转换的服务。这里的分布式数据库是指,每个站点只保留它自己的那部分数据。

域名具有层次结构,从上到下依次为:根域名、顶级域名、二级域名。

DNS 使用 UDP/TCP

DNS 可以使用 UDP 或者 TCP 进行传输,使用的端口号都为 53。大多数情况下 DNS 使用 UDP 进行传输,这样 DNS 服务器负载更低,响应更快,不过这要求域名解析器和域名服务器都必须自己处理超时和重传从而保证可靠性。一般在两种情况下会使用 TCP 进行传输:

  • 如果返回的响应超过的 512 字节(UDP 最大只支持 512 字节的数据)

  • 区域传送

    辅域名服务器会定时(一般三小时)向主域名服务器查询变动,如有变动则需要区域传送来同步数据,这一过程数据量很大,且对可靠性有一定要求,因此使用 TCP

有一种比较少见的情况——客户端可以指定向 DNS 服务器查询时用 TCP,但很多 DNS 服务器都配置为仅支持 UDP 查询。

DNS 缓存

DNS 有多级缓存,按离浏览器距离,有浏览器缓存、系统缓存、路由器缓存、IPS服务器缓存、根域名服务器缓存、顶级域名服务器缓存、主域名服务器缓存。


文件传送协议

FTP ( File Transfer Protocol ) 使用 TCP 进行连接,它需要两个连接来传送一个文件:

  • 控制连接:服务器打开端口号 21 等待客户端的连接,客户端主动建立连接后,使用这个连接将客户端的命令传送给服务器,并传回服务器的应答。
  • 数据连接:用来传送一个文件数据。

根据数据连接是否是服务器端主动建立,FTP 有主动和被动两种模式:

  • 主动模式:服务器端主动建立数据连接,其中服务器端的端口号为 20,客户端的端口号随机,但是必须大于 1024,因为 0~1023 是熟知端口号。

  • 被动模式:客户端主动建立数据连接,其中客户端的端口号由客户端自己指定,服务器端的端口号随机。

主动模式要求客户端开放端口号给服务器端,需要去配置客户端的防火墙。被动模式只需要服务器端开放端口号即可,无需客户端配置防火墙。但是被动模式会导致服务器端的安全性减弱,因为开放了过多的端口号。


动态主机配置协议

自动配置 IP 地址等信息,DHCP ( Dynamic Host Configuration Protocol ) 配置的内容不仅是 IP 地址,还包括子网掩码、网关 IP 地址。

DHCP 工作过程如下:

  1. 客户端发送 Discover 报文,该报文的目的地址为 255.255.255.255:67,源地址为 0.0.0.0:68,被放入 UDP 中,该报文被广播到同一个子网的所有主机上。如果客户端和 DHCP 服务器不在同一个子网,就需要使用中继代理。
  2. DHCP 服务器收到 Discover 报文之后,发送 Offer 报文给客户端,该报文包含了客户端所需要的信息。因为客户端可能收到多个 DHCP 服务器提供的信息,因此客户端需要进行选择。
  3. 如果客户端选择了某个 DHCP 服务器提供的信息,那么就发送 Request 报文给该 DHCP 服务器。
  4. DHCP 服务器发送 Ack 报文,表示客户端此时可以使用提供给它的信息。


远程登录协议

TELNET 用于登录到远程主机上,并且远程主机上的输出也会返回。

TELNET 可以适应许多计算机和操作系统的差异,例如不同操作系统系统的换行符定义。


电子邮件协议

一个电子邮件系统由三部分组成:用户代理、邮件服务器以及邮件协议。

邮件协议包含发送协议和读取协议,发送协议常用 SMTP,读取协议常用 POP3 和 IMAP。

  1. SMTP

    SMTP 只能发送 ASCII 码,而互联网邮件扩充 MIME 可以发送二进制文件。MIME 并没有改动或者取代 SMTP,而是增加邮件主体的结构,定义了非 ASCII 码的编码规则。

  1. POP3

    POP3 的特点是只要用户从服务器上读取了邮件,就把该邮件删除。但最新版本的 POP3 可以不删除邮件。

  2. IMAP

    IMAP 协议中客户端和服务器上的邮件保持同步,如果不手动删除邮件,那么服务器上的邮件也不会被删除。IMAP 这种做法可以让用户随时随地去访问服务器上的邮件。


HTTP / HTTPS

状态码:

类别 原因
1XX Informational(信息性) 接收的请求正在处理
2XX Success(成功) 请求正常处理完毕
3XX Redirection(重定向) 需要进行附加操作以完成请求
4XX Client Error(客户端错误) 服务器无法处理请求
5XX Server Error(服务器错误) 服务器处理请求出错

HTTP/1.1 起默认使用长连接,用以保持连接特性,并支持请求的流水线 (Pipelining) 处理。实现长连接需要客户端和服务端都支持长连接。使用长连接的 HTTP 协议会在响应头加入这行代码:

Connection:keep-alive

网页打开后,客户端与服务器间用于传输 HTTP 数据的 TCP 连接不会关闭,再次访问服务器时会继续使用。连接的保持时间由服务器设定。

HTTP 本身是无状态协议,因此 Session 机制通过服务端记录用户状态。服务端为特定用户创建特定 Session 后用以标识和跟踪用户。

大部分情况下,服务端通过在 Cookie 中附加 Session ID 来跟踪,并将 Session 存在缓存或数据库中。如果 Cookie 被禁用,也可以利用 URL 重写附在 URL 路径后面。

不过诸如 Spring Security 等安全框架中采用 Token 认证,服务器通过PayloadHeader和一个密钥(secret)创建令牌(Token)并将 Token 发送给客户端,客户端将 Token 保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP Header 的 Authorization字段中: Authorization: Bearer Token

扩展:HTTP 协议的优化

参考阅读材料: https://mp.weixin.qq.com/s/GICbiyJpINrHZ41u_4zT-A?

HTTP1.1 引入了更多缓存控制策略,并允许对某个资源的部分请求,新增了 24 个错误状态响应码,请求和响应消息都支持 Host 头域(这使得多个主机可以共享一个IP,一台物理服务器从而可以存在多个虚拟主机),最重要的——支持了长连接和请求的流水线处理

2012年 Google 提出 SPDY 方案,通过多路复用 (Multiplexing) 提高 TCP 连接利用率(因为浏览器一般对同一域名有最大连接数限制),为每个 Request 设置优先级(展示内容可以优先加载,优化了用户体验),加了首部压缩协议,并强制使用 HTTPS 保障安全,服务端也可以主动推动(例如客户端请求 style.css 文件时,服务端可以将相关的 style.js 也推送过去)。

SPDY位于HTTP之下,TCP和SSL之上,这样可以轻松兼容老版本的HTTP协议(将HTTP1.x的内容封装成一种新的frame格式),同时可以使用已有的SSL功能。

HTTPS 运行在 SSL/TLS 上,而 SSL/TLS 运行在 TCP 上,所有传输内容都经过对称加密,对称密钥用服务器方的证书进行了非对称加密。因此 HTTPS 消耗服务器资源比 HTTP 多。

CA ( Certification Authority ) 负责签发证书,并且能够验证域名所属——通过 DNS 记录或指定 URI 下放置的特殊文件供 CA 通过外网访问。

如果网站证书被 CA 私自发给了第三方,那第三方就能够利用证书实施中间人攻击了,因此 CA 信用非常重要。


Web 页面请求过程

也算是比较常见的面试题吧

  1. DHCP 配置主机信息
  • 假设主机最开始没有 IP 地址以及其它信息,那么就需要先使用 DHCP 来获取。

  • 主机生成一个 DHCP 请求报文,并将这个报文放入具有目的端口 67 和源端口 68 的 UDP 报文段中。

  • 该报文段则被放入在一个具有广播 IP 目的地址(255.255.255.255) 和源 IP 地址(0.0.0.0)的 IP 数据报中。

  • 该数据报则被放置在 MAC 帧中,该帧具有目的地址 FF:<zero-width space>FF:<zero-width space>FF:<zero-width space>FF:<zero-width space>FF:FF,将广播到与交换机连接的所有设备。

  • 连接在交换机的 DHCP 服务器收到广播帧之后,不断地向上分解得到 IP 数据报、UDP 报文段、DHCP 请求报文,之后生成 DHCP ACK 报文,该报文包含以下信息:IP 地址、DNS 服务器的 IP 地址、默认网关路由器的 IP 地址和子网掩码。该报文被放入 UDP 报文段中,UDP 报文段有被放入 IP 数据报中,最后放入 MAC 帧中。

  • 该帧的目的地址是请求主机的 MAC 地址,因为交换机具有自学习能力,之前主机发送了广播帧之后就记录了 MAC 地址到其转发接口的交换表项,因此现在交换机就可以直接知道应该向哪个接口发送该帧。

  • 主机收到该帧后,不断分解得到 DHCP 报文。之后就配置它的 IP 地址、子网掩码和 DNS 服务器的 IP 地址,并在其 IP 转发表中安装默认网关。

  1. ARP 解析 MAC 地址
  • 主机通过浏览器生成一个 TCP 套接字,套接字向 HTTP 服务器发送 HTTP 请求。为了生成该套接字,主机需要知道网站的域名对应的 IP 地址。

  • 主机生成一个 DNS 查询报文,该报文具有 53 号端口,因为 DNS 服务器的端口号是 53。

  • 该 DNS 查询报文被放入目的地址为 DNS 服务器 IP 地址的 IP 数据报中。

  • 该 IP 数据报被放入一个以太网帧中,该帧将发送到网关路由器。

  • DHCP 过程只知道网关路由器的 IP 地址,为了获取网关路由器的 MAC 地址,需要使用 ARP 协议。

  • 主机生成一个包含目的地址为网关路由器 IP 地址的 ARP 查询报文,将该 ARP 查询报文放入一个具有广播目的地址(FF:<zero-width space>FF:<zero-width space>FF:<zero-width space>FF:<zero-width space>FF:FF)的以太网帧中,并向交换机发送该以太网帧,交换机将该帧转发给所有的连接设备,包括网关路由器。

  • 网关路由器接收到该帧后,不断向上分解得到 ARP 报文,发现其中的 IP 地址与其接口的 IP 地址匹配,因此就发送一个 ARP 回答报文,包含了它的 MAC 地址,发回给主机。

  1. DNS 解析域名
  • 知道了网关路由器的 MAC 地址之后,就可以继续 DNS 的解析过程了。

  • 网关路由器接收到包含 DNS 查询报文的以太网帧后,抽取出 IP 数据报,并根据转发表决定该 IP 数据报应该转发的路由器。

  • 因为路由器具有内部网关协议(RIP、OSPF)和外部网关协议(BGP)这两种路由选择协议,因此路由表中已经配置了网关路由器到达 DNS 服务器的路由表项。

  • 到达 DNS 服务器之后,DNS 服务器抽取出 DNS 查询报文,并在 DNS 数据库中查找待解析的域名。

  • 找到 DNS 记录之后,发送 DNS 回答报文,将该回答报文放入 UDP 报文段中,然后放入 IP 数据报中,通过路由器反向转发回网关路由器,并经过以太网交换机到达主机。

  1. HTTP 请求页面 (TCP、HTTP)
  • 有了 HTTP 服务器的 IP 地址之后,主机就能够生成 TCP 套接字,该套接字将用于向 Web 服务器发送 HTTP GET 报文。

  • 在生成 TCP 套接字之前,必须先与 HTTP 服务器进行三次握手来建立连接。生成一个具有目的端口 80 的 TCP SYN 报文段,并向 HTTP 服务器发送该报文段。

  • HTTP 服务器收到该报文段之后,生成 TCP SYN ACK 报文段,发回给主机。

  • 连接建立之后,浏览器生成 HTTP GET 报文,并交付给 HTTP 服务器。

  • HTTP 服务器从 TCP 套接字读取 HTTP GET 报文,生成一个 HTTP 响应报文,将 Web 页面内容放入报文主体中,发回给主机。

  • 浏览器收到 HTTP 响应报文后,抽取出 Web 页面内容,之后进行渲染,显示 Web 页面。

comments powered by Disqus