移动端 IP 优选方案

摘要: 无论是从 Local DNS 解析域名,获取到 IP 列表,还是从第三方的 DNS 解析服务中,获取到域名对应的 IP 列表。我们获得多个 IP 后,总是想选取一个最优的 IP 使用,本文主要探讨如何在客户端探测 IP 的连接性以及连接速度,保证返回可用性最好的IP,以达到“IP优选”的目的。

移动端 IP 优选方案
1. IP 优选目的
无论是从 Local DNS 解析域名,获取到 IP 列表,还是从第三方的 DNS 解析服务中,获取到域名对应的 IP 列表。我们获得多个 IP 后,总是想选取一个最优的 IP 使用,本文主要探讨如何在客户端探测 IP 的连接性以及连接速度,保证返回可用性最好的IP,以达到“IP优选”的目的。

2. 新浪开源的 httpdns 的 sdk 里的测速逻辑
新浪开源一个 HTTPDNSLib ,里面包含了测速逻辑,GitHub地址如下:

《HTTPDNSLib-for-iOS》
《HTTPDNSLib》
我们以该 sdk 里的测速逻辑为例进行原理解析。

3. IP 测试实现原理
使用 linux socket connect 和 select 函数实现的。 基于以下原理:

即使套接口是非阻塞的。如果连接的服务器在同一台主机上,那么在调用connect 建立连接时,连接通常会立即建立成功,我们必须处理这种情况。
源自Berkeley的实现(和Posix.1g)有两条与select 和非阻塞IO相关的规则:
A. 当连接建立成功时,套接口描述符变成可写;
B. 当连接出错时,套接口描述符变成既可读又可写。

详细的测速实现如下,原理参考注释:

以 iOS 实现为例:

- (int)testSpeedOf:(NSString *)ip port:(int16_t)port {NSString *oldIp = ip;//request time outfloat rtt = 0.0;//sock:将要被设置或者获取选项的套接字。int s = 0;struct sockaddr_in saddr;saddr.sin_family = AF_INET;// MARK: - 设置端口,这里需要根据需要自定义,默认是80端口。saddr.sin_port = htons(port);saddr.sin_addr.s_addr = inet_addr([ip UTF8String]);//saddr.sin_addr.s_addr = inet_addr("1.1.1.123");if( (s=socket(AF_INET, SOCK_STREAM, 0)) < 0) {NSLog(@"ERROR:%s:%d, create socket failed.",__FUNCTION__,__LINE__);return 0;}NSDate *startTime = [NSDate date];NSDate *endTime;//为了设置connect超时 把socket设置称为非阻塞int flags = fcntl(s, F_GETFL,0);fcntl(s,F_SETFL, flags | O_NONBLOCK);//对于阻塞式套接字,调用connect函数将激发TCP的三次握手过程,而且仅在连接建立成功或者出错时才返回;//对于非阻塞式套接字,如果调用connect函数会之间返回-1(表示出错),且错误为EINPROGRESS,表示连接建立,建立启动但是尚未完成;//如果返回0,则表示连接已经建立,这通常是在服务器和客户在同一台主机上时发生。int i = connect(s,(struct sockaddr*)&saddr, sizeof(saddr));if(i == 0) {//建立连接成功,返回rtt时间。 因为connect是非阻塞,所以这个时间就是一个函数执行的时间,毫秒级,没必要再测速了。close(s);return 1;}struct timeval tv;int valopt;socklen_t lon;tv.tv_sec = HTTPDNS_SOCKET_CONNECT_TIMEOUT;tv.tv_usec = 0;fd_set myset;FD_ZERO(&myset);FD_SET(s, &myset);// MARK: - 使用select函数,对套接字的IO操作设置超时。/**select函数select是一种IO多路复用机制,它允许进程指示内核等待多个事件的任何一个发生,并且在有一个或者多个事件发生或者经历一段指定的时间后才唤醒它。connect本身并不具有设置超时功能,如果想对套接字的IO操作设置超时,可使用select函数。**/int maxfdp = s+1;int j = select(maxfdp, NULL, &myset, NULL, &tv);if (j == 0) {NSLog(@"INFO:%s:%d, test rtt of (%@) timeout.",__FUNCTION__,__LINE__, oldIp);rtt = HTTPDNS_SOCKET_CONNECT_TIMEOUT_RTT;close(s);return rtt;}if (j < 0) {NSLog(@"ERROR:%s:%d, select function error.",__FUNCTION__,__LINE__);rtt = 0;close(s);return rtt;}/**对于select和非阻塞connect,注意两点:[1] 当连接成功建立时,描述符变成可写; [2] 当连接建立遇到错误时,描述符变为即可读,也可写,遇到这种情况,可调用getsockopt函数。**/lon = sizeof(int);//valopt 表示错误信息。// MARK: - 测试核心逻辑,连接后,获取错误信息,如果没有错误信息就是访问成功/*!* //getsockopt函数可获取影响套接字的选项,比如SOCKET的出错信息* (get socket option)*/getsockopt(s, SOL_SOCKET, SO_ERROR, (void*)(&valopt), &lon);//如果有错误信息:if (valopt) {NSLog(@"ERROR:%s:%d, select function error.",__FUNCTION__,__LINE__);rtt = 0;} else {endTime = [NSDate date];rtt = [endTime timeIntervalSinceDate:startTime] * 1000;}close(s);return rtt;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523058.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决“Failure to find com.oracle:ojdbc6:jar”,手动安装ojdbc的jar包到maven私仓

在使用mvn进行编译的时候&#xff0c;遇到如下错误&#xff1a; Could not resolve dependencies for project com.bairong.platform:auth:jar:3.0: Failure to find com.oracle:ojdbc6:jar:11.2.0.1.0 in http://maven.aliyun.com /nexus/content/groups/public/ was cached …

2017双11技术揭秘—阿里数据库进入全网秒级实时监控时代

摘要&#xff1a; 2017双11再次创下了32.5万笔/秒交易创建的纪录&#xff0c;在这个数字后面&#xff0c;更是每秒多达几千万次的数据库写入&#xff0c;如何大规模进行自动化操作、保证数据库的稳定性、快速发现问题是一个巨大的难题&#xff0c; 这也是数据库管控平台要完成的…

混合云发展之路:前景广阔,巨头混战

戳蓝字“CSDN云计算”关注我们哦&#xff01;知名云管理服务商RightScale(目前已经被Flexera公司收购) 每年都会对企业使用云的情况进行调查&#xff0c;以此分析全球企业云的采用情况。RightScale 发布的2019年全球云计算市场调查显示&#xff0c;在众多云平台中&#xff0c;混…

2017双11技术揭秘—阿里数据库计算存储分离与离在线混布

摘要&#xff1a; 随着阿里集团电商、物流、大文娱等业务的蓬勃发展&#xff0c;数据库实例以及数据存储规模不断增长&#xff0c;在传统基于单机的运维以及管理模式下&#xff0c;遇到诸多如成本&#xff0c;调度效率等问题&#xff0c;因此&#xff0c;2017年首次对数据库实现…

unoconv 在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件功能环境搭建

接上一篇&#xff1a; SpringBoot 在线预览 doc&#xff0c;doxc&#xff0c;xls&#xff0c;xlsx&#xff0c;ppt&#xff0c;pptx 文件 https://blog.csdn.net/weixin_40816738/article/details/102847228 文章目录服务器环境为linux1.切换到root用户&#xff1a;2.执行unoco…

CAD自控lisp_基于AutoLisp的AutoCAD二次开发自动生成系统图

基于AutoLisp的AutoCAD二次开发自动生成系统图【摘要】本文主要阐述了应用autolisp语言二次开发autocad自动生成系统图的实现方案。【关键词】autocad&#xff1b;autolisp&#xff1b;二次开发&#xff1b;系统图0引言水汽集中取样分析装置主要应用于发电厂水汽系统化学分析样…

2017双11技术揭秘—阿里巴巴数据库技术架构演进

摘要&#xff1a; 每年电商双11大促对阿里技术人都是一次大考&#xff0c;对阿里数据库团队更是如此。经过9年的发展&#xff0c;双11单日交易额从2009年的0.5亿一路攀升到2017年的1682亿&#xff0c;秒级交易创建峰值达到了32.5万笔/秒。支撑这一切业务指标的背后&#xff0c;…

SpringBoot 使用unoconv 在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件

接上一篇&#xff1a;linux环境源码安装unoconv Linux环境_源码安装Unoconv实现文件在线预览doc&#xff0c;doxc&#xff0c;xls&#xff0c;xlsx&#xff0c;ppt&#xff0c;pptx 文件 https://gblfy.blog.csdn.net/article/details/103540694 接上一篇&#xff1a;linux环境…

重磅!AWS任命张文翊女士为全球副总裁及大中华区执行董事!

2019年7月11日&#xff0c;北京&#xff0c;亚马逊&#xff08;NASDAQ&#xff1a;AMZN&#xff09;旗下公司Amazon Web Services, Inc. (AWS) 今天宣布&#xff0c;任命现任亚马逊全球副总裁及亚马逊中国总裁张文翊为AWS全球副总裁及大中华区执行董事&#xff0c;现任AWS全球副…

解码2017双11:全球狂欢新记录背后的阿里云存储

摘要&#xff1a; 2017天猫双11再次刷新纪录&#xff0c;这背后是大数据的支撑和阿里云计算的能力的体现。手淘、天猫APP主站的所有图片和视频都存储在阿里云对象存储OSS之上&#xff0c;全球数以亿计的消费者&#xff0c;对这些商品的访问的流量和并发次数&#xff0c;比成交笔…

maven的网易镜像

<mirror><id>nexus-163</id><mirrorOf>*</mirrorOf><name>Nexus 163</name><url>http://mirrors.163.com/maven/repository/maven-public/</url></mirror>

开发者,什么是你真正关心的问题?| AI ProCon 2019

2018 年&#xff0c;上千名开发者与上百名技术专家齐聚一堂&#xff0c;在 CSDN 2018 AI开发者大会上以“AI技术与应用”为核心&#xff0c;深度聚焦人工智能的技术创新与行业应用&#xff0c;真正做到了“只讲技术&#xff0c;拒绝空谈”。今年&#xff0c;在产业智能化的浪潮…

最大值_Leetcode2 | 滑动窗口最大值(Q239)

:)Sliding Window MaximumQ 239今天也是好心情Problem Description DifficultyYou are given an array of integers nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the w…

PCDN实现flash无延时直播的技术原理与优点

摘要&#xff1a; PCDN是以P2P技术为基础&#xff0c;通过挖掘利用边缘网络海量碎片化闲置资源而构建的内容分发网络&#xff0c;它具有低成本、高品质的特点&#xff0c;十分适用于视频直播这一业务场景。针对直播中延时的情况&#xff0c;PCDN也进行了一系列优化&#xff0c;…

CDN新品发布:阿里云SCDN安全加速开放公测

摘要&#xff1a; SCDN(SecureCDN)安全加速产品是CDN推出的一款集合安全能力的内容加速服务&#xff0c;用户就近取得所需内容解决因分布、带宽、服务器性能带来的访问延迟问题&#xff0c;提升网站访问速度。同时防护DDoS&#xff0c;CC&#xff0c;Web应用攻击&#xff0c;恶…

Centos7 查看/关闭/启动防火墙

CentOS 7.0默认使用的是firewall作为防火墙 查看防火墙的状态systemctl status firewalld关闭防火墙(临时,重启失效)systemctl stop firewalld启动防火墙systemctl start firewalld重启防火墙firewall-cmd --reload开机启动防火墙systemctl enable firewalldreboot 永久关闭防…

美企调查华为设备安全性,华为发长文质疑;摩根大通预计苹果2020年将推5G iPhone;谷歌拟联手Dish成立美国第四大运营商...

戳蓝字“CSDN云计算”关注我们哦&#xff01;嗨&#xff0c;大家好&#xff0c;重磅君带来的【云重磅】特别栏目&#xff0c;如期而至&#xff0c;每周五第一时间为大家带来重磅新闻。把握技术风向标&#xff0c;了解行业应用与实践&#xff0c;就交给我重磅君吧&#xff01;重…

阿里云数据传输服务低价不低质,服务再升级

摘要&#xff1a; 为了释放更多技术红利&#xff0c;进一步普惠广大客户和开发者&#xff0c;阿里云于12月下旬宣布&#xff0c;数据传输服务(Data Transmission Service) DTS将全面降价&#xff0c;并于当月生效。 此次价格调整涉及多项服务和功能&#xff0c;国内地区数据订阅…

实现mvcc_MySQL 的多版本并发控制(MVCC) 是干啥的?

点击蓝色“架构文摘”关注我哟加个“星标”&#xff0c;每天上午 09:25&#xff0c;干货推送&#xff01;来源&#xff1a;https://segmentfault.com/a/1190000037557620作者&#xff1a;白菜1031一、什么是多版本并发控制多版本并发控制 技术的英文全称是 Multiversion Concur…

网站访问速度提升200%以上,阿里云虚拟主机支持PHP最新版本

摘要&#xff1a; 日前&#xff0c;阿里云虚拟主机推出了新功能&#xff0c;支持PHP的最新版本 7.0和7.1&#xff0c;并支持用户在多个不同PHP版本之间切换。 PHP 作为最好的Web编程语言&#xff0c;最新版本已经更新到了7.0和7.1。阿里云作为国内虚拟主机的领头羊&#xff0c;…