标签归档:udp

为网站开启QUIC的几点注意事项

QUIC的文章比较多了,但是开启起来仍然是件困扰人的事。本文简要记录一下为网站开启QUIC的几点注意事项。

一 QUIC对比现有HTTP2的主要优势:

  • 显著减少连接建立时间
  • 改进的拥塞控制
  • 无对头阻塞的多路复用
  • 前向纠错
  • 连接迁移

二 开启QUIC的注意事项主要有以下几点:

Caddy的13f9c34已经支持QUIC 44、43、39,运行参数中加入-quic

编译caddy时,需要为主分支的quic-go打一个补丁:
cd $GOPATH/src/github.com/mholt/caddy/vendor/github.com/lucas-clemente/quic-go/

vi quic.patch

quic.pathch的内容如下:

From 20719a7c50c1f97ff0f2272010cda5710794c1d0 Mon Sep 17 00:00:00 2001
From: Marten Seemann <martenseemann@gmail.com>
Date: Thu, 29 Nov 2018 20:33:02 +0700
Subject: [PATCH] use the original tls.Config if tls.Config.GetConfigForClient
 returns nil

---
 internal/crypto/cert_chain.go      | 15 ++++++++++-----
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/internal/crypto/cert_chain.go b/internal/crypto/cert_chain.go
index 0c728fd25..45af2952d 100644
--- a/internal/crypto/cert_chain.go
+++ b/internal/crypto/cert_chain.go
@@ -56,8 +56,7 @@ func (c *certChain) GetLeafCert(sni string) ([]byte, error) {
 }
 
 func (c *certChain) getCertForSNI(sni string) (*tls.Certificate, error) {
-	conf := c.config
-	conf, err := maybeGetConfigForClient(conf, sni)
+	conf, err := maybeGetConfigForClient(c.config, sni)
 	if err != nil {
 		return nil, err
 	}
@@ -107,7 +106,13 @@ func maybeGetConfigForClient(c *tls.Config, sni string) (*tls.Config, error) {
 	if c.GetConfigForClient == nil {
 		return c, nil
 	}
-	return c.GetConfigForClient(&tls.ClientHelloInfo{
-		ServerName: sni,
-	})
+	confForClient, err := c.GetConfigForClient(&tls.ClientHelloInfo{ServerName: sni})
+	if err != nil {
+		return nil, err
+	}
+	// if GetConfigForClient returns nil, use the original config
+	if confForClient == nil {
+		return c, nil
+	}
+	return confForClient, nil
 }

patch -p1 < quic.patch

之后再进入caddy目录进行下一步的编译:

cd $GOPATH/src/github.com/mholt/caddy

请升级到目前的最新版 1.11。

  • 在防火墙中为443端口开启udp

          Firewalld:

sudo firewall-cmd --zone=public --add-port=443/udp --permanent

          iptables:

sudo iptables -A INPUT -p udp --dport 443 -j ACCEPT
  • 将Chrome升级到最新版

在chrome://flags/#enable-quic中启用QUIC支持。

三 一个查看QUIC支持情况的命令

curl -I https://www.coldawn.com we get
HTTP/1.1 200 OK
Alt-Svc: quic=":443"; ma=2592000; v="44,43,39"
Cache-Control: max-age=8640000
Content-Type: text/html; charset=UTF-8
Link: <https://www.coldawn.com/wp-json/>; rel="https://api.w.org/"
Server: Caddy
Strict-Transport-Security: max-age=31536000;
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-Powered-By: PHP/7.2.10
X-Xss-Protection: 1; mode=block
Date: Fri, 28 Sep 2018 04:29:41 GMT

使用qBittorrent时遇Kernel Power 事件 ID 41 错误致windows 10 重启一例

1 问题描述

环境:windows 10 64位操作系统,博通ac网卡
之前用IDM下载文件,看电影等任何操作,一切正常。但使用qBittorrent下载种子时,短则几秒,长也不到一分钟,电脑就直接黑屏重启。且没有蓝屏错误代码出现。

2 问题分析

简要说一下排除步骤吧。

2.1 事件查看器(Event Viewer)

因为没有蓝屏代码,首先查看Windows X 系统自带的事件查看器,在Windows 日志 > 系统下,可以看到一条红色叹号图标的“关键(Critical)”错误,类似如下:

系统已在未先正常关机的情况下重新启动。如果系统停止响应、发生崩溃或意外断电,则可能会导致此错误。
The system has rebooted without cleanly shutting down first. This error could be caused if the system stopped responding, crashed, or lost power unexpectedly.
…
来源(s):       Kernel-Power
事件 ID(E):    41
级别(L):       关键

按照Kernel-Power 41 检索,发现微软有一篇技术文档来说明此问题,有点符合场景三的描述:Scenario 3: The system randomly restarts and no Stop error BugcheckCode is listed, or the computer is completely unresponsive (hard hang)。系统随机重启,且未列出关机的相关错误代码,或者电脑完全没有反应(硬件故障)。可能原因是:超频,内存问题,电源问题,过热。显然都不太是。
此外有人建议更新声卡驱动来解决这个问题,经测试无效。

2.2 Windows 10 调试工具(Debugging Tools for Windows (WinDbg, KD, CDB, NTSD))

微软提供了一个新的诊断工具:Windows 调试器 (WinDbg),我们按方法三来安装一个独立运行的版本,在安装Windows 10 SDK时仅勾选 Debugging Tools for Windows来安装。
微软该技术文档,将系统错误日志Minidump(位置在“C:\Windows\Minidump\”文件夹中)复制到桌面,打开WinDbg,在其菜单栏依次点击File > Open Crash Dump…来打开dmp文件。
待出现Bugcheck Analysis信息后,点击 !analyze -v来进一步分析错误原因。可以看到比较可疑的地方:

…
Probably caused by : bcmwl63a.sys ( bcmwl63a+8ef6f )
…
6: kd> .trap 0xffff8f805fd6a5d0
NOTE: The trap frame does not contain all registers.
Some register values may be zeroed or incorrect.
…

看起来是wifi驱动bcmwl63a.sys导致的问题,这是一个老生常谈的问题了。

2.3 更新WIFI驱动

出问题的Wifi网卡是博通的ac网卡BCM4352,驱动是Windows 10自带的:

驱动提供商:     Broadcom
驱动日期:       7/6/2015
驱动版本:       7.35.290.0

找到比较新的是联想提供的这个版本:

WLAN Driver (Atheros, Realtek, Broadcom) for Windows 7 (64-bit) - Lenovo B41-35, B51-35

Document ID: DS103113
Release Date: 12/28/2017

下载7gb301wf.exe并双击释放到c盘后,通过在设备管理器中右键更新驱动,并指向该文件夹来更新驱动,升级后的驱动是如下版本:

驱动提供商:     Broadcom
驱动日期:       7/20/2015
驱动版本:       7.35.295.2

打开qbittorrent测试,真的是好了一会会,没有一打开几秒钟就崩溃。但是一个多小时后问题又出现了,还是这个bcmwl63a.sys的错误。

2.4 禁用tereto(IPv6)

网上有使用bittorrent时出现该问题的情况,但更新Wifi驱动或者使用旧版驱动后问题依旧。不过在回帖中technonymous提到禁止teredo (ipv6)可解决该问题,以管理员方式运行命令行提示符,输入如下命令:

netsh interface teredo set state disabledok.

暂时正常,仍在观察中。
原因可能是因为qbittorrent等bt软件需要发送接收大量udp包,与tereto隧道兼容不好所致,尽管根本没有IPv6。微软有一篇文档提到:因为操作系统无法分配足够的堆栈空间为 UDP 数据包有许多内核过滤器 driversinstalled 时,将出现此问题。该文档中有一句:UNEXPECTED_KERNEL_MODE_TRAP,而在我的WinDbg中也有一行:6: kd> .trap 0xffff8f805fd6a5d0,不知是否有关。