文档章节

Playing with QUIC

WolfCS
 WolfCS
发布于 2016/10/10 19:36
字数 906
阅读 384
收藏 1

选择一个QUIC代码源

下面的说明是用来基于chromium代码库编译QUIC代码。在Chrome支持的任何平台上,这里的说明都能保证是有效的,遇到问题时可以查看一些扩展的故障排查的文档。如果你不想checking out整个chrome,你可以尝试github上快速而干净的proto-quic库。这是chrome代码的一份克隆,但剔除了大多数不必要的依赖,因而它可以快得多的check out并编译,但不一定扩展了完整的chrome平台集,因而你选择的平台有可能无法编译。

编译QUIC 客户端和服务器

Chromium中提供了一个示例客户端和服务器实现。要使用这些东西,你首先应该已经checked out Chromium的源代码,然后构建二进制文件:

ninja -C out/Debug quic_server quic_client

从www.example.org准备测试数据

下载一份www.example.org的拷贝,它主要是使用quic_server来提供本地服务的:

mkdir /tmp/quic-data
cd /tmp/quic-data
wget -p --save-headers https://www.example.org

这里主要是要下载一个html文件,且保存文件的所有的HTTP header,当然也可以从其它的站点下载这个文件。

手动地编辑index.html,并调整如下的headers:

  • 移除(如果存在的话):"Transfer-Encoding: chunked"
  • 移除(如果存在的话):"Alternate-Protocol: ..."
  • 添加:X-Original-Url: https://www.example.org/

生成证书

为了运行服务器,你需要一个有效的证书,及一个pkcs8格式的私有key。如果你没有,则你可以使用一些脚本来产生它们:

cd net/tools/quic/certs
./generate-certs.sh
cd -

除了服务器的证书及public key,这个脚本也会产生一个CA证书 (net/tools/quic/certs/out/2048-sha256-root.pem),你需要把它添加到你的操作系统的根证书商店以便于在证书验证期间它被信任。要在linux上完成这一点,请参考这些说明

如果遗漏了这里的添加CA证书的步骤的话,后面在执行quic_client的时候会报出如下的证书验证错误:

$ ./out/Default/quic_client --host=127.0.0.1 --port=80 https://www.example.org/
[1008/164047:ERROR:cert_verify_proc_nss.cc(942)] CERT_PKIXVerifyCert for www.example.org failed err=-8179
[1008/164047:WARNING:proof_verifier_chromium.cc(466)] Failed to verify certificate chain: net::ERR_CERT_AUTHORITY_INVALID
Failed to connect to 127.0.0.1:80. Error: QUIC_PROOF_INVALID

运行QUIC服务器和客户端

运行quic_server:

./out/Default/quic_server \
  --quic_in_memory_cache_dir=/tmp/quic-data/www.example.org \
  --certificate_file=net/tools/quic/certs/out/leaf_cert.pem \
  --key_file=net/tools/quic/certs/out/leaf_cert.pkcs8

运行quic_server还可以通过--port参数指定监听的端口,及--v参数指定输出更多信息,如:

./out/Default/quic_server --certificate_file=/media/data/osprojects/proto-quic/src/net/tools/quic/certs/out/leaf_cert.pem --key_file=/media/data/osprojects/proto-quic/src/net/tools/quic/certs/out/leaf_cert.pkcs8 --quic_in_memory_cache_dir=/home/hanpfei0306/quic-data/www.example.com --port=32457 --v=1

然后你就可以成功地使用quic_client以QUIC协议请求文件了:

./out/Default/quic_client --host=127.0.0.1 --port=32457 https://www.example.org/

注意,如果你让服务器的端口默认为32457,则你必须指定客户端的端口,因为它默认是80。 此外,如果你的本地机器有多个loopback地址 (由于它同时使用IPv4 和 IPv6),你不得不选定一个地址。 目前还不确定后面的缺点是不是一个bug。

注意:client和server都主要是为了做集成测试的:它们都不能大规模使用。

要使用chrome来测试相同的下载过程,

chromium-browser \
  --user-data-dir=/tmp/chrome-profile \
  --no-proxy-server \
  --enable-quic \
  --origin-to-force-quic-on=www.example.org:443 \
  --host-resolver-rules='MAP www.example.org:443 127.0.0.1:32457' \
  https://www.example.org

故障排查

如果你在运行时遇到了问题,则可以以--v=1参数运行服务器或客户端。它将提升日志的verbosity,更多的日志常常可以帮助暴露底层的问题。

原文

© 著作权归作者所有

共有 人打赏支持
上一篇: JNI 技巧
WolfCS
粉丝 80
博文 147
码字总数 505184
作品 4
杭州
高级程序员
私信 提问
Google 的 QUIC 华丽转身成为下一代网络协议: HTTP/3.0

HTTP/2.0 还没有普及,HTTP/3.0 标准就要被制定了。 据 IETF 透露,HTTP-over-QUIC 实验协议将被重命名为 HTTP/3,并成为 HTTP 协议的第三个正式版本。 IETF 是 Internet Engineering Task ...

承香墨影
2018/11/15
0
0
下一代 HTTP 底层协议或将弃用 TCP 协议,改用 QUIC 协议

(给程序员的那些事加星标) 据 iThome.com.tw 报道,国际互联网工程任务组(Internet Engineering Task Force, IETF)将于近日商讨下一代 HTTP 底层协议,可能不再使用已经沿用多年的 TCP ...

程序员的那些事_
2018/11/15
0
0
Google QUIC 协议:从 TCP 到 UDP 的 Web 平台

QUIC(Quick UDP Internet Connections)协议是一种全新的基于UDP的web开发协议。 从TCP协议说起 当前,web平台的数据传输都基于TCP协议。TCP协议在创建连接之前需要进行三次握手(图1),如...

达尔文
2016/09/15
6.4K
5
QUIC 将会是 WebRTC 的未来么?

本文转载自WebRTC中文网 ,文章翻译自 Dr.Alex 的博客 QUIC 自从2013年为人所知,最近两年一直是讨论的热门话题。原因是,QUIC作为传输层协议发挥了TCP、UDP的优点,添加了加密,速度倍增,其...

Agora
2018/12/05
0
0
下一代 HTTP/3 协议将弃用 TCP 改用 QUIC

据国际互联网工程任务组(The Internet Engineering Task Force,简称 IETF )消息,HTTP-over-QUIC 实验性协议将被重命名为 HTTP/3,并有望成为 HTTP 协议的第三个正式版本。 QUIC (Quick...

王练
2018/11/17
7.2K
17

没有更多内容

加载失败,请刷新页面

加载更多

Coding and Paper Letter(四十五)

资源整理。 1 Coding: 1.Python库gempy,一种基于Python的开源三维结构地质建模软件,它允许从界面和方向数据隐式(即自动)创建复杂的地质模型。 它还支持随机建模以解决参数和模型的不确定...

胖胖雕
17分钟前
0
0
golang 声明一个指定长度的数组,用于后续添加

很多时候我们需要声明一个指定长度的数组,用于后续添加.在使用go的时候要注意,下面的第一个例子会有报错 "non-constant array bound",应该使用第二个例子. Length 是动态的值 有报错的例子 ...

漫步海边小路
20分钟前
0
0
Java NIO示例

Server端 /** * 《构建高性能的大型分布式Java应用》 * 书中的示例代码 * 版权所有 2008---2009 */package book.chapter1.tcpnio;import java.net.InetSocketAddress;i...

月下狼
26分钟前
0
0
发布xxl-job executor dotnet core 执行器的实现

DotXxlJob [github][https://github.com/xuanye/DotXxlJob] xxl-job的dotnet core 执行器实现,支持XXL-JOB 2.0+ 1 XXL-JOB概述 [XXL-JOB][1]是一个轻量级分布式任务调度平台,其核心设计目标...

假正经哥哥
今天
2
0
mysql 查询当天、本周,本月,上一个月的数据

今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1 近7天 SELECT * FROM 表名 wher......

BraveLN
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部