通常情况下,服务端通过端口号来判断客户端请求的协议。根据在 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 协议。