为什么还要在python套接字请求中包含主机?

2024-05-12 12:32:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我看到一些例子,人们从主机和端口创建socket对象,然后还发送GET请求,并在http请求中包含主机头

import socket

HOST = 'daring.cwi.nl'
PORT = 80

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall("GET / HTTP/1.1\r\n\r\nHost: daring.cwi.nl")
    data = s.recv(1024)
print('Received', repr(data))

为什么我们需要提供一次主机来创建socket对象,然后再发送请求


Tags: 对象端口importhttphostdatagetport
2条回答

首先,如果您只使用一个普通的tcp连接,您可以发送任何您想要的东西,您可以s.sendall("HAHAHA")

其次,在您的代码中,它模拟了一个Gethttp请求。要发送参数,只需在url之后连接它们/?parameter1=value1&parameter2=value2

最后,为什么我们需要再次包含Host?假设您正在将此请求发送到负载平衡服务器,如果您不显式地发送它,应用程序服务器将无法获得真正的Host

Host头是HTTP标准(至少版本1.1)所必需的,即定义与web服务器所说协议的标准。这样做的原因是,您可以让多个域共享同一IP地址,因此web服务器需要找出您要访问的域。由于较低层(即TCP)不包含此信息,而只包含在应用层(即HTTP)提供此信息所需的IP地址

至于在connect中使用主机名:这实际上是不需要的,您也可以在那里提供IP地址。当提供主机名而不是IP时,它所做的就是查找主机的IP地址并连接到该主机

相关问题 更多 >