登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> CLQ工作室开源代码 >> 主题: [quic/udp/tcp]Google 的 QUIC 协议     [回主站]     [分站链接]
标题
[quic/udp/tcp]Google 的 QUIC 协议
clq
浏览(119) + 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/




总数:1 页次:1/1 首页 尾页  
总数:1 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1