Http SecureSocket中支持哪些协议?
查看的文档时,我看到方法Http SecureSocket中支持哪些协议?,http,websocket,dart,Http,Websocket,Dart,查看的文档时,我看到方法secure/connect/secureServer中有一个参数称为supportedProtocols 这是什么 可能的价值是什么 订单重要吗 历史上未加密的应用程序协议通常分配自己的端口(例如http的80,smtp的25) ALPN:如今,大多数流量都是通过TLS加密的,TLS是一种安全的传输协议。任何应用程序协议都可以使用它。没有为应用程序协议使用新的端口号,而是提供了一种不同的解决方案:TLS支持称为ALPN(应用程序级协议协商)的扩展,该扩展允许客户端/服
secure
/connect
/secureServer
中有一个参数称为supportedProtocols
- 这是什么
- 可能的价值是什么
- 订单重要吗
http
的80
,smtp的25
)
ALPN:如今,大多数流量都是通过TLS加密的,TLS是一种安全的传输协议。任何应用程序协议都可以使用它。没有为应用程序协议使用新的端口号,而是提供了一种不同的解决方案:TLS支持称为ALPN(应用程序级协议协商)的扩展,该扩展允许客户端/服务器告诉对等方他们支持哪些协议以及他们喜欢什么(可能有一个由端口号推断出的协议的回退——这对向后兼容性很好)
(旁注:还有一个称为NPN“下一个协议协商”的前体TLS扩展,用于类似目的,但由于各种原因被弃用)
最常见的用例是http/2:服务器在端口443
上侦听,并提供讲话http/1.1
,http/2
,比如说spdy
。浏览器将建立到服务器端口443
的TCP连接,让服务器知道它支持哪些协议。然后服务器将选择哪个协议otocol说话(基于客户端发送的列表和服务器应用程序支持的内容)。为了向后兼容,如果没有协商协议,客户端/浏览器将退回到http/1.1
谈判和优先权有3种情况:
- 客户端或服务器不支持ALPN扩展:未协商任何协议
- 客户端和服务器支持ALPN,但没有通用协议:没有协议
- 客户端和服务器支持ALPN,并且有一个或多个协议都支持:采用具有最高优先级的协议
supportedProtocols
的可选参数将其公开给
- 客户部分
- 对于服务器部分
selectedProtocol
将null
supportedProtocols
中的协议以递减优先顺序指定(将选择列表中服务器/客户端之间通用的第一个协议)
ALPN标识符协议标识符没有实际限制。您的应用程序可以使用自己的标识符。尽管对于公共协议,RFC通常会建议使用哪些标识符,例如,在:
字符串“h2”标识HTTP/2使用传输层安全性(TLS)的协议
自己检查它:如果您非常好奇,您可以使用网络数据包检查器(如较新版本的)来检查TLS流量,并查看提供了哪些ALPN协议
“http/1.1”
)
TLS
有一个扩展名为ALPN
,它(顾名思义)用于协商用于安全通信的应用层协议
在ALPN
中,使用上面指定的格式识别协议
SecureSocket
实现TLS
,因此必须接收要在ALPN
阶段使用的协议列表参数
除非您的服务器和客户端正在实现自定义通信协议,否则我建议您只使用“http/1.1”
更多信息:
我可以在Dart源中找到的传递给SecureServer
的协议列表的唯一文档位于SecurityContext.\u protocolstolengtencoding
(io/security\u context.Dart:190
):
以及:
“标识序列”是以ASCII字节表示的协议标识符。它是在协商阶段通过套接字发送的原始数据
有趣的事实:在Dart中,SecurityContext.\u protocolstolengtencoding
方法将协议标识符从字符串编码为字节
希望这有帮助
/// Encodes a set of supported protocols for ALPN/NPN usage.
///
/// The `protocols` list is expected to contain protocols in descending order
/// of preference.
///
/// See RFC 7301 (https://tools.ietf.org/html/rfc7301) for the encoding of
/// `List<String> protocols`:
/// opaque ProtocolName<1..2^8-1>;
///
/// struct {
/// ProtocolName protocol_name_list<2..2^16-1>
/// } ProtocolNameList;
///
/// The encoding of the opaque `ProtocolName<lower..upper>` vector is
/// described in RFC 2246: 4.3 Vectors.
///
/// Note: Even though this encoding scheme would allow a total
/// `ProtocolNameList` length of 65535, this limit cannot be reached. Testing
/// showed that more than ~ 2^14 bytes will fail to negotiate a protocol.
/// We will be conservative and support only messages up to (1<<13)-1 bytes.
"ProtocolNameList" contains the list of protocols advertised by the
client, in descending order of preference. Protocols are named by
IANA-registered, opaque, non-empty byte strings, as described further
in Section 6 ("IANA Considerations") of this document.
Protocol: HTTP/1.1
Identification Sequence:
0x68 0x74 0x74 0x70 0x2f 0x31 0x2e 0x31 ("http/1.1")
Reference: [RFC7230]
Protocol: SPDY/1
Identification Sequence:
0x73 0x70 0x64 0x79 0x2f 0x31 ("spdy/1")
Reference:
http://dev.chromium.org/spdy/spdy-protocol/spdy-protocol-draft1
Protocol: SPDY/2
Identification Sequence:
0x73 0x70 0x64 0x79 0x2f 0x32 ("spdy/2")
Reference:
http://dev.chromium.org/spdy/spdy-protocol/spdy-protocol-draft2