okhttp中涉及到的网络基础知识

1,061 阅读6分钟

基本都是摘抄其他文章:

域名解析,一个域名可以对应多个IP地址(基于DNS的负载均衡)

一个ip地址可以对应多个域名吗

为什么一个主机IP地址可以对应多个域名

在分析okhttp源码时, 如果网络基础知识储备的不够, 分析起来是非常吃力且常常会一脸懵逼, 属于仅仅停留在okhttp缓存、责任链这个层面的分析, 而对于okhttp里面几个关键的类RealConnection, Route这些根本无从下手.

这里记录okhttp中涉及到的网络基础知识.

1. IP地址
2. DNS域名解析
3. DNS负载均衡
4. 重定向
5. HTTP1.0与HTTP2.0

一、IP地址

  • 1、IP地址并非是根据主机台数来配置的, 而是每一台主机上的每一块网络(NIC)都得设置IP地址.

  • 2、在访问Web站点和发送、接收电子邮件时, 我们通常会直接输入Web网站的地址或电子邮件地址等那些由应用层提供的地址, 而不会使用由十进制数字组成的某个IP地址.
1.1 主机识别码
  • 识别方式是指为每台计算机赋以唯一的主机名, 在进行网络通信时可以直接使用主机名称而无需输入一大长串的IP地址. 并且此时, 系统必须自动将主机名转换为具体的IP地址.
1.2 IP地址与域名的关系

  一个IP可以多域名, 一个域名不可以多IP. 一个IP地址代表一台主机. 如果一个域名对应多个IP地址, 那么输入网址的时候域名不知道该指向哪台主机, 相反如果一个主机的IP地址对应多个域名的话, 不管你输入哪个网址, 指向的都是同一台主机, 显示的都是同样的内容.

二、主机名、域名、URL

2.1 mail.163.com/index.html
  • 1、http:// -----> 这个是协议, HTTP超文本传输协议, 也就是网页在网上传输的协议.
  • 2、mail -----> 这个是服务器名, 代表着一个邮箱服务器, 所以是mail.
  • 3、163.com -----> 这个是域名, 是用来定位网站的独一无二的名字.
  • 4、mail.163.com ->这个是主机名(网站名), 由服务器名 + 域名组成.
  • 5、/ -----> 这个是根目录, 也就是说, 通过网站名找到服务器, 然后在服务器存放网页的根目录.
  • 6、mail.163.com/index.html -----> url, 统一资源定位符, 全球性地址, 用于定位网上的资源.

三、代理服务器

3.1 工作流程

  当代理服务器收到对Internet资源的请求时, 它会查找以前页面的本地缓存. 如果找到该页面, 则会将其返回给用户, 而无需将请求转发到Internet. 如果页面不在缓存中, 则代表用户充当客户端的代理服务器使用其自己的IP地址之一从Internet上的服务器请求该页面. 返回页面时, 代理服务器将其与原始请求相关联, 并将其转发给用户.

四、DNS

4.1 DNS定义

  DNS(Domain Name System)是因特网的一项服务, 它作为域名和IP地址相互映射的一个分布式数据库, 能够使人更方便的访问互联网.

4.2 DNS解析域名

  1、域名解析是把域名指向网站空间IP, 让人们通过注册的域名可以方便地访问到网站的一种服务. IP地址是网络上标识站点的数字地址, 为了方便记忆, 采用域名来代替IP地址标识站点地址. 域名解析就是域名到IP地址的转换过程. 域名的解析工作由DNS服务器完成.

  2、通过浏览器访问网站时只需要记住网站的域名即可, 而不需要记住那些不太容易理解的IP地址, 在DNS系统中有一个比较重要的资源类型叫做主机记录也称为A记录, A记录是用于名称解析的重要记录, 它将特定的主机名称映射到对应主机的IP地址上. 如果你有一个自己的域名, 那么要想别人能访问到你的网站, 你需要到特定的DNS解析服务商的服务器上填写A记录, 过一段时间后, 别人就能通过你的域名访问你的网站了.

当一个用户在地址栏输入www.taobao.com时, DNS解析有大致十个过程:

  • 1、浏览器先检查自身缓存中有没有被解析过的这个域名对应的IP地址, 如果有, 解析结束. 同时域名被缓存的时间也可通过TTL属性来设置.
  • 2、如果浏览器缓存中没有(专业点叫还没命中), 浏览器会检查操作系统缓存中有没有对应的已解析过的结果. 而操作系统也有一个域名解析的过程. 在windows中可通过C盘里一个叫hosts的文件来设置, 如果你在这里指定了一个域名对应的IP地址, 那浏览器会首先使用这个IP地址.
  • 3、如果至此还没有命中域名, 才会真正的请求本地域名服务器(LDNS)来解析这个域名, 这台服务器一般在你的城市某个角落, 距离你不会很远, 并且这台服务器性能很好, 一般都会缓存域名解析结果, 大约80%的域名解析到这里就完成了.
  • 4、如果LDNS仍然没有命中, 就直接跳到Root Server域名服务器请求解析.
  • 5、根域名服务器返回给LDNS一个所查询域的主域名服务器(gTLD Server)地址.
  • 6、此时LDNS再发送请求给上一步返回的gTLD.
  • 7、接受请求的gTLD查找并返回这个域名对应的Name Server的地址. 这个Name Server就是网站注册的域名服务器.
  • 8、Name Server根据映射关系表找到目标IP返回给LDNS.
  • 9、LDNS缓存这个域名和对应的IP.
  • 10、LDNS把解析的结果返回给用户, 用户根据TTL值缓存到本地系统缓存中, 域名解析过程至此结束.
4.3 负载均衡

  DNS除了能解析域名之外还具有负载均衡的功能, 下面是利用DNS工作原理处理负载均衡的工作原理.

由上图可以看出, 在DNS服务器中应该配置了多个A记录, 如:

1. www.apusapp.com IN A 114.100.20.201;
2. www.apusapp.com IN A 114.100.20.202;
3. www.apusapp.com IN A 114.100.20.203;

  因此每次域名解析请求都会根据对应的负载均衡算法计算出一个不同的IP地址并返回, 这样A记录中配置多个服务器就可以构成一个集群, 并可以实现负载均衡. 上图中, 用户请求www.apusapp.com, DNS根据A记录和负载均衡算法得到一个IP地址114.100.20.203, 并返回给浏览器, 浏览器根据该IP地址, 访问真实的物理服务器114.100.20.203.