通常情况下,服务端通过端口号来判断客户端请求的协议。根据在 IANA 注册的知名服务端口号,HTTP 使用 80 端口,HTTPS 使用 443 端口。但是当我们不使用默认端口,或使用同一个端口号时,如何判断客户端请求的是 HTTP 服务还是 HTTPS 服务?本文通过分析 HTTP 协议和 HTTPS 协议的特点,给出一种根据首字节来判断的方法。

HTTP 协议的请求头为 ASCII 文本方式传输,通过读取建立 TCP 连接后的第一个 byte 应该为 32~127。

HTTPS 协议需要客户端发送 clientHello,因此第一个 byte 应该为 0x16 也就是十进制的 22。

故监听同一个端口创建 conn 后,可以通过 peak 第一个字节来判断协议。当 byte == 22 是 HTTPS 协议,当 byte > 32 && byte <127 时是 HTTP 协议。

最后修改:2021 年 04 月 23 日
如果觉得我的文章对你有用,请随意赞赏