【学习笔记】iOS IP 直连原理剖析

本文为学习笔记,并非原创。原文链接,原文发表于2018-02-13

移动互联网的网络状况是十分复杂的,三大运营商、3G、4G、Wi-Fi、地点等任何一个状态的改变都会导致网络状况的变化,并且运营商、代理商们还可能在其中搞一些小破坏,比如经常会有用户反馈说某个页面访问不了或者返回结果不正确等问题,这种状况一般都是发生了域名劫持,通用的解决方案就是使用 IP 直连,跨过运营商 LocalDNS 服务器解析过程,从而达到降低延迟、避免劫持的效果。

为什么直接用IP

  1. 防劫持,可以绕过运营商 LocalDNS 解析过程,避免域名劫持,提高网络访问成功率。
  2. 降低延迟,DNS 解析是一个相对耗时的工作,跳过这个过程可以降低一定的延迟。
  3. 精准调度,运营商解析返回的节点不一定是最优的,自己获取 IP 可以基于自己的策略来获取最精准的、最优的节点。

如何获取IP:

  1. 直接接入腾讯或者阿里的 HTTPDNS 服务。
  2. 内置 Server IP,可以在启动等阶段由服务端下发域名和 IP 的对应列表,客户端来进行缓存 …
more ...

【学习笔记】iOS网络缓存扫盲篇--使用两行代码就能完成80%的缓存需求

本文为学习笔记,并非原创。原文链接,原文发表于2016-01-21

GET网络请求缓存

POST请求不能被缓存,只有 GET 请求能被缓存。因为从数学的角度来讲,GET 的结果是幂等 的,而 POST 不幂等 。缓存的思路就是将查询的参数组成的值作为 key ,对应结果作为value。

NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];
[NSURLCache setSharedURLCache:urlCache];

控制缓存的有效性

服务器的文件存贮,大多采用资源变动后就重新生成一个链接的做法。而且如果你的文件存储采用的是第三方的服务,比如七牛、青云等服务,则一定是如此。

链接不变的情况下,要求资源改了,缓存就要更新,该如何做?

文件缓存 …

more ...

【学习笔记】全面理解DNS及HTTPDNS

本文为学习笔记,并非原创。原文链接,原文发表于2019-11-05

背景

移动场景下DNS解析开销是整个网络请求中不可忽略的一部分。在弱网环境下,基于UDP的LocalDNS解析非常容易出现解析超时的问题,并且即使解析成功会消耗数百毫秒乃至更甚。

DNS

iOS 10之后,apple提供的原生HTTP请求方法能返回HTTP请求各个阶段的时间指标,其中就包含DNS解析时间。

iOS-10-HTTP-phases

DNS相关概念

DNS是一种分层结构,在整个互联网中组成一个树状系统,顶层是系统的根域名,下层为TLD以及二级域名,叶子就构成了所谓的FQDN(Fully Qualified Domain Names),根域名通常使用"."来表示,其实际上也是由域名组成,全世界目前有13组域名根节点,由少数几个国家进行管理,而国内仅有几台根节点镜像。

DNS-level

权威DNS:权威DNS是经过上一级授权对域名进行解析的服务器,同时它可以把解析授权转授给其他人,如COM顶级服务器可以授权xxorg.com这个域名的的权威服务器为NS.ABC.COM,同时NS.ABC.COM还可以把授权转授给NS.DDD.COM,这样NS.DDD.COM就成了ABC.COM实际上的权威服务器了。平时我们解析域名的结果都源自权威DNS。

递归DNS:又称为Local DNS …

more ...

【学习笔记】TCP/IP三次握手四次挥手

本文为学习笔记,并非原创。原文链接

TCP 报文头部结构

TCP Header

需重点关注的字段:

  1. seq序号。用来标识从TCP源端向目的端发送的字节流。
  2. ack确认序号。只有ACK标致为1时,ack序号才有效。
  3. 标志位,共六个:

    • ACK:确认序号ack有效。确认方ack=发起方seq + 1
    • FIN:释放一个连接。
    • PSH:接收方应尽快将此报文交给给应用层。
    • RST:重置连接。
    • SYN:发起一个新连接。
    • URG:紧急指针有效。

三次握手

three-way handshake

为什么 TCP 连接是三次握手?两次不可以吗?

因为丢包会造成服务端空等。如果只握手两次,第二次握手时如果服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数据(可以理解为服务端已经连接成功),而客户端一直没收到服务端的确认报文,所以客户端就不知道服务端是否已经准备好了(可以理解为客户端未连接成功),这种情况下客户端不会给服务端发数据,也会忽略服务端发过来的数据。

如果是三次握手,即便发生丢包也不会有问题。如果第三次握手客户端发的确认报文丢失,服务端在一段时间内没有收到确认报文的话就会重新进行第二次握手,也就是服务端会重发 SYN 报文段 …

more ...