WebSocket 协议
WebSocketWebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
连接握手WebSocket 客户端发起基于 HTTP 握手的数据
12345678GET / HTTP/1.1Host: 127.0.0.1:8000Connection: UpgradeUpgrade: websocketOrigin: http://127.0.0.1:8000Sec-WebSocket-Version: 13Sec-WebSocket-Key: Bt4+Nfq12qxyxHslV2iFFg==Sec-WebSocket-Protocol: chat
WebSocket 服务端响应握手的数据
1234HTTP/1.1 101 Switching ProtocolsSec-WebSocket-Accept: MK6YmuGMF81B+0zEjhayzUlnqxg=Connection: UpgradeUpgrade: websocket
基础帧协议12345678910111213141516171819 0 1 ...
Go http 标准库的 SNI 修改
SNI 阻断SNI (Server Name Indication),为 TLS 连接中客户端发起的第一个握手包 Client Hello 中的即将访问的域名信息数据的字段。该字段是为了解决某些服务器同时含有多个域名站点,在加密传输之前,它需要知道客户端访问的是哪个域名。因此某些防火墙能对报文中的 SNI 识别并进行阻断。
SNI 修改本文以 P站 (https://pixiv.net) 为例,示例如何修改 Go http 标准库 请求中的 SNI 字段数据。造成 P站 无法访问的原因有两方面,一方面是 DNS 污染,本文不多加叙述,另一个则为 SNI 阻断。因为 P站 服务器无需 SNI 字段即可正常访问,因此我们可以通过修改其 SNI 字段的值防止 TLS 连接被阻断。
通过 WireShark 抓包能看见 Server Name 字段的值为 pixiv.net
123456789Extension: server_name (len=14) Type: server_name (0) Length: 14 Server Name Indication exten ...