Как реализовать реализацию прокси-сервера HTTP по сравнению с внедрением веб-сервера HTTP, каковы различия? Есть ли окончательное руководство или RFC или полезная книга по этому вопросу?
Как HTTP-прокси использует протокол HTTP? прокси-RFC?
Ответ 1
Требования к HTTP-прокси-серверам указаны в RFC2616 - Протокол передачи гипертекста - HTTP/1.1.
Ответ 2
Заголовок, отправленный в прокси, отличается.
Например, вот что отправлено Google Chrome на сайт www.baidu.com через прокси-сервер:
GET http://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Proxy-Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
DNT: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Мы можем видеть, что это
GET http://www.baidu.com/ HTTP/1.1
вместо
GET / HTTP/1.1
и здесь
Proxy-Connection: keep-alive
и
Host: www.baidu.com
Поле хоста требуется для http-прокси.
Для прокси-сервера туннеля HTTPS:
CONNECT comet.zhihu.com:443 HTTP/1.1
Host: comet.zhihu.com:443
Proxy-Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Мы можем видеть, что
CONNECT comet.zhihu.com:443 HTTP/1.1
domain:443
вместо https://domain
.
Поле CONNECT превращает прокси-сервер в нечто вроде туннеля TCP, тогда протокол HTTPS
заменяется на порт :443
Для прокси-сервера socks5 все становится проще, потому что socks5 ничего не заботит о более высоком протоколе, вы просто указываете ему хост и порт.
Ответ 3
Прокси-сервер очень похож на сервер; единственное отличие состоит в том, что после разбора запроса он просто пересылает его и возвращает результат *, а не обрабатывает запрос. Поскольку прокси-сервер не должен выполнять такую же обработку, как обычный сервер, он часто может уйти с гораздо более минимальным анализом запросов, чем полнофункциональный сервер, но в остальном это та же идея.
* Некоторые прокси реализуют дополнительное кэширование. Некоторые также futz с ответом/запросом, но это злой вид прокси, который, надеюсь, вы не имеете в виду.