Frank Chen 在版块 Coding 中回复了话题 远程请求数据Get 和post区别 2年前
cURL 的 ipv6、ipv4 选择策略
1> cURL 对ipv4、ipv6是这样一个处理过程:
解析被请求的域名,通常会获得一个ip地址列表,同时包含了ipv4和ipv6地址;
cURL会首先发起连接ipv6地址,如果200ms内连接成功,则直接使用此地址;
如果200ms未连接成功ipv6地址,cURL会对列表中地址并发发起连接;
最后等待第一个成功建立的连接,将作为后续cURL传输地址。从上面流程可以看出几点:ipv6优先机制、快乐眼球(Happy Eyeballs)机制(也叫快速回退Fast Fallback机制)、轮询调度机制(Round-robin DNS)。
2> Happy Eyeballs 是什么?
“快乐眼球”是客户端的一个算法,它叫这么个名字,是想表达这个算法是用在互联网中的用户端(客户端)而不是服务器端。这里有一个比较好的文章。cURL的实现不是简单的执行:getaddrinfo() -> 遍历每个ip地址然后并发发起 connect()。它的做法将全部地址分开到一个ipv4专用和一个ipv6专用的两个线程队列,然后再并发发起连接,最先收到回复的连接作为最终使用的连接。
这个算法的提出是在2011年 World IPv6 Day,为了避免 ipv6 起步阶段网络环境不理想。
除了cURL,目前支持 Happy Eyeballs 其它软件包括 Chrome 浏览器, Opera 浏览器, Firefox 13+, 苹果操作系统 OS X 等。
3>为 cURL 指定 ipv4,ipv6
通过命令行参数 –ipv4 或 -4 强制使用 ipv4 协议:% time curl –ipv4 https://example.org/
可以显示ipv4连接过程和连接的时间
% curl –ipv4 https://example.org/
复制代码
通过命令行参数 –ipv6 或 -6 强制使用 ipv6 协议:% curl –ipv6 https://example.org/
复制代码
加上参数 -v 可以看到连接的过程:% curl -v http://example.org/ ~
* Trying 192.168.199.217…
* TCP_NODELAY set
* Connection failed
* connect to 192.168.199.217 port 80 failed: Connection refused
* Trying 2001::1…
* TCP_NODELAY set
* Connected to example.org (2001::1) port 80 (#0)
> GET / HTTP/1.1
> Host: example.org
> User-Agent: curl/7.64.1
> Accept: */*
>4>nslookup 做 DNS 解析
# type 和 query、querytype 三个相同作用的参数,用于设置查询类型,默认值为 A
% nslookup -type=A example.test
Server: 192.168.199.1
Address: 192.168.199.1#53Name: example.test
Address: 192.168.199.169% nslookup -type=AAAA example.test
Server: 192.168.199.1
Address: 192.168.199.1#53example.test has AAAA address 2001::2
5>dig 解析 DNS
# 同时解析 ipv4 和 ipv6
% dig example.test AAAA example.test A +short2001::2
192.168.199.169# @域名服务器在前面表示全球服务器
% dig @8.8.8.8 tv.ipv6.edu.cn AAAA; <<>> DiG 9.10.6 <<>> @8.8.8.8 tv.ipv6.edu.cn AAAA
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 84
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0;; QUESTION SECTION:
;tv.ipv6.edu.cn. IN AAAA;; ANSWER SECTION:
tv.ipv6.edu.cn. 3600 IN AAAA 2001:da8:217:1::234;; Query time: 158 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Sep 28 09:11:02 CST 2020
;; MSG SIZE rcvd: 60# @域名服务器在后面表示本地服务器
% dig wikimedia.org MX @ns0.wikimedia.org
; <<>> DiG 9.6.1 <<>> wikimedia.org MX @ns0.wikimedia.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61144
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2
;; WARNING: recursion requested but not available;; QUESTION SECTION:
;wikimedia.org. IN MX;; ANSWER SECTION:
wikimedia.org. 3600 IN MX 10 mchenry.wikimedia.org.
wikimedia.org. 3600 IN MX 50 lists.wikimedia.org.;; ADDITIONAL SECTION:
mchenry.wikimedia.org. 3600 IN A 208.80.152.186
lists.wikimedia.org. 3600 IN A 91.198.174.5;; Query time: 73 msec
;; SERVER: 208.80.152.130#53(208.80.152.130)
;; WHEN: Wed Aug 12 11:51:03 2009
;; MSG SIZE rcvd: 109
最后在线: 活跃于 3周, 2天前
评论: 7
获赞: 0
文章: 0
粉丝: 68
关注: 68
好友: 18
User Rating: ( vote)