标题
[quic/udp/tcp]Google 的 QUIC 协议
clq
浏览(248) +
2023-10-27 13:08:34 发表
编辑
关键字:
[2023-10-27 17:01:42 最后更新]
[quic/udp/tcp]Google 的 QUIC 协议
QUIC(Quick UDP Internet Connection)是谷歌制定的一种互联网传输层协议,它基于UDP传输层协议,同时兼具TCP、TLS、HTTP/2等协议的可靠性与安全性。
--------------------------------------------------------
有一个和它很相似的,据说主要用于区块链。libp2p
libp2p的golang语言实现go-libp2p库
“长安链P2P网络技术介绍(2):初识LibP2P”
https://cloud.tencent.com/developer/article/1988253
“go-libp2p 入门 example”
https://studygolang.com/articles/14268
--------------------------------------------------------
https://zhuanlan.zhihu.com/p/620142900
golang网络编程之UDP可靠传输协议QUIC
golang知识分享
golang知识分享
Golang是一种高效、简洁的编程语言,在网络编程中,Golang通过其强大的标准库支持QUIC协议的UDP可靠传输。
QUIC(Quick UDP Internet Connections)是一个基于UDP协议的可靠传输协议,它通过使用TLS 1.3实现了端到端加密。在Golang中,我们可以使用quic-go包来实现QUIC协议的UDP可靠传输。下面是一个简单的例子:
package main
import (
"crypto/tls"
"fmt"
quic "github.com/lucas-clemente/quic-go"
"io"
)
func main() {
addr := "localhost:8080"
listener, err := quic.ListenAddr(addr, generateTLSConfig(), nil)
if err != nil {
panic(err)
}
defer listener.Close()
for {
session, err := listener.Accept()
if err != nil {
panic(err)
}
go handleSession(session)
}
}
func handleSession(session quic.Session) {
stream, err := session.AcceptStream()
if err != nil {
panic(err)
}
defer stream.Close()
buf := make([]byte, 1024)
n, err := io.ReadFull(stream, buf)
if err != nil {
panic(err)
}
fmt.Printf("Received message: %s\n", string(buf[:n]))
}
func generateTLSConfig() *tls.Config {
cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
if err != nil {
panic(err)
}
config := &tls.Config{Certificates: []tls.Certificate{cert}}
config.NextProtos = append(config.NextProtos, quic.Version1Draft29)
return config
}
上述代码中,我们使用quic-go包中的ListenAddr函数监听本机IP为localhost,端口号为8080的QUIC端口,并在handleSession函数中处理从其他主机发送过来的消息。需要注意的是,我们还需要生成TLS证书和私钥,并使用generateTLSConfig函数将其加载到TLS配置中。
除了监听QUIC端口外,我们还可以使用quic-go包中的DialAddr函数向其他主机建立QUIC连接并发送数据:
package main
import (
"crypto/tls"
"fmt"
quic "github.com/lucas-clemente/quic-go"
"io"
)
func main() {
addr := "localhost:8080"
session, err := quic.DialAddr(addr, &tls.Config{InsecureSkipVerify: true}, nil)
if err != nil {
panic(err)
}
defer session.Close()
stream, err := session.OpenStreamSync()
if err != nil {
panic(err)
}
defer stream.Close()
fmt.Fprintf(stream, "Hello, server!")
buf := make([]byte, 1024)
n, err := io.ReadFull(stream, buf)
if err != nil {
panic(err)
}
fmt.Printf("Received message: %s\n", string(buf[:n]))
}
上述代码中,我们使用quic-go包中的DialAddr函数向IP为localhost,端口号为8080的主机建立QUIC连接,并向其发送了一条消息"Hello, server!"。
需要注意的是,在QUIC编程中,我们使用的不再是net包中的Conn对象,而是quic.Session和quic.Stream对象。另外,由于QUIC使用了TLS加密,因此我们需要加载TLS证书和私钥,并在DialAddr函数中将InsecureSkipVerify参数设置为true来跳过证书校验。
总结来说,Golang通过其强大的quic-go包支持QUIC协议的UDP可靠传输,使得QUIC编程变得简单易用。通过掌握相关函数和知识点,我们可以轻松地完成基于QUIC协议的网络编程任务。
发布于 2023-04-07 15:13・IP 属地湖南
clq
2023-10-27 16:44:25 发表
编辑
浏览器支持情况
Chrome和Opera都支持gQUIC和iQUIC。
2021年5月,Firefox在Firefox Nightly版本中开始支持QUIC。
2020年4月,APPle在WebKit引擎进行了试验性的QUIC支持,并正式在macOS Big Sur和iOS 14上的Safari 14中支持,但是需要手动打开HTTP/3。
https://www.bilibili.com/read/cv16018386/
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.