2014-02-28 225 views
1

我是一名学生,我试图理解IP地址背后的想法。我知道,输入网址与输入相应的IP地址相同 - 无论哪种方式,我们都会被引导到同一个网页。了解IP。在此服务器上找不到请求的URL

我用ping命令查找howstuffworks.com的IP地址。然后我在浏览器中输入IP地址(谷歌浏览器),但得到了这个错误:

The requested URL was not found on this server. 

为什么?我试着与google.com IP一样,并且它工作正常。

此外,我使用ping命令发现的IP地址是IPv4(对于谷歌来说,它是173.194.40.80)。为什么它没有显示IPv6地址?

+0

IP地址与URL一样好的描述性假设仅适用于某些Web服务器配置。显然这不是真的。 –

+0

可能的重复http://stackoverflow.com/questions/5142030/why-does-the-resolved-ip-of-youtube-com-direct-to-google-com –

回答

2

FQDN(例如www.stackoverflow.com)和IP地址(例如198.252.206.140)之间的关系不一定是一对一的关系。例如,如果我为www.stackoverflow.com进行DNS查找,则得到198.252.206.140。所以,www.stackoverflow.com网站托管在一个IP地址为198.252.206.140的网络服务器上。但是,可能有其他的网站也可能在198.252.206.140上托管。

这就是为什么我们在http协议中有Host命令。浏览器在端口80上连接到Web服务器后,浏览器会发送host命令以指示它正试图连接到Web服务器上的哪个站点。请参阅http://blog.tonycode.com/tech-stuff/http-notes/making-http-requests-via-telnet以获得有关如何工作的良好教程。下面复制的是一个与198.252.206.140的telnet会话,在这个会话中建立http连接,并发出host命令来选择www.stackoverflow.com,并返回www.stackoverflow.com的默认响应(在本例中为301重定向到stackoverflow.com):

$ telnet 198.252.206.140 80 
Trying 198.252.206.140... 
Connected to 198.252.206.140. 
Escape character is '^]'. 
GET/HTTP/1.1 
Host: www.stackoverflow.com 

HTTP/1.1 301 Moved Permanently 
Content-Type: text/html; charset=UTF-8 
Location: http://stackoverflow.com/ 
Date: Tue, 04 Mar 2014 10:58:36 GMT 
Content-Length: 148 

<head><title>Document Moved</title></head> 
<body><h1>Object Moved</h1>This document may be found <a 
HREF="http://stackoverflow.com/">here</a></body> 
1

主机名称大致相当于您的浏览器到达远程服务器时的IP地址。

HTTP/1.1协议指定客户端(浏览器)必须通过主机名称作为标题,如:

Host: www.howstuffworks.com 

这是非常有用的,因为它允许多个网站要对托管相同的服务器,或无论如何可以从相同的IP地址访问。

您可以使用该实用程序的命令curl发现了这一点:

curl -v http://54.236.73.243/ -H 'Host: www.howstuffworks.com' 

或使用你的浏览器有一些插件,允许设置自定义头。

1

为了回答你问题的第二部分:

ping命令选择地址的一个来ping时,主机有多个地址。在Windows系统上,ping可用于IPv4和IPv6。在类Unix系统上,您必须使用ping6来支持IPv6。

如果你想看看你必须使用一个支持此目的的一种工具是什么在DNS如host或(在类Unix系统上),或者nslookup(当在Windows系统上) 。例如:

$ dig google.com any 

; <<>> DiG 9.8.3-P1 <<>> google.com any 
;; global options: +cmd 
;; Got answer: 
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42780 
;; flags: qr rd ra; QUERY: 1, ANSWER: 19, AUTHORITY: 0, ADDITIONAL: 0 

;; QUESTION SECTION: 
;google.com.   IN ANY 

;; ANSWER SECTION: 
google.com.  299 IN A 173.194.65.138 
google.com.  299 IN A 173.194.65.100 
google.com.  299 IN A 173.194.65.101 
google.com.  299 IN A 173.194.65.113 
google.com.  299 IN A 173.194.65.139 
google.com.  299 IN A 173.194.65.102 
google.com.  299 IN AAAA 2a00:1450:4013:c00::8b 
google.com.  599 IN MX 10 aspmx.l.google.com. 
google.com.  599 IN MX 20 alt1.aspmx.l.google.com. 
google.com.  599 IN MX 30 alt2.aspmx.l.google.com. 
google.com.  599 IN MX 40 alt3.aspmx.l.google.com. 
google.com.  599 IN MX 50 alt4.aspmx.l.google.com. 
google.com.  21599 IN NS ns1.google.com. 
google.com.  21599 IN NS ns2.google.com. 
google.com.  21599 IN NS ns3.google.com. 
google.com.  21599 IN NS ns4.google.com. 
google.com.  3599 IN TXT "v=spf1 include:_spf.google.com ip4:216.73.93.70/31 ip4:216.73.93.72/31 ~all" 
google.com.  21599 IN SOA ns1.google.com. dns-admin.google.com. 2014021800 7200 1800 1209600 300 
google.com.  21599 IN TYPE257 \# 19 0005697373756573796D616E7465632E636F6D 

;; Query time: 27 msec 
;; SERVER: 8.8.8.8#53(8.8.8.8) 
;; WHEN: Fri Feb 28 23:53:29 2014 
;; MSG SIZE rcvd: 497 

正如你可以看到有更多的DNS比AAAAA记录:-)

而为了让这个答案至少有一点上,话题的StackOverflow,这里是如何您可以正确处理在双栈环境中解析名称。编写代码的方式可以自动使用任何可用的协议。这是Python中的一个示例:

#!/usr/bin/python 
import sys, socket 

# Get the hostname from the command line 
if len(sys.argv) == 2: 
    host = sys.argv[1] 
else: 
    print("Usage: {} <hostname>".format(sys.argv[0])) 
    sys.exit(1) 

# Set the parameters for the getaddrinfo call 
service = "http" 
family = socket.AF_UNSPEC 
socktype = socket.SOCK_STREAM 
protocol = socket.SOL_TCP 
flags = 0 

# Call getaddrinfo, it will give back a list of possible parameter-sets 
try: 
    resultset = socket.getaddrinfo(host, service, family, socktype, protocol, flags) 
except socket.error: 
    print("I'm sorry, but {} doesn't seem to exist".format(host)) 
    sys.exit(1) 

# Now try to connect to them one by one 
sock = None 
for family, socktype, protocol, canonname, sockaddr in resultset: 
    print("Trying to connect to {}".format(sockaddr)) 

    try: 
     # Create a socket with the given parameters 
     sock = socket.socket(family, socktype, protocol) 
    except socket.error: 
     # Failed to create a socket, try the next one 
     continue 

    try: 
     # We have a socket, now use it to connect 
     sock.connect(sockaddr) 
    except socket.error: 
     # The connection failed, close the socket 
     sock.close() 
     sock = None 

     # And try the next one 
     continue 

    # Wonderful, we have a socket, and it is now connected! 
    # Stop retrying 
    break 

if sock is None: 
    print("None of the available addresses worked") 
    sys.exit(1) 

print("That one worked!") 
my_addr = sock.getsockname() 
remote_addr = sock.getpeername() 
print("There is now a connection from {} to {}".format(my_addr, remote_addr)) 

# And close the connection nicely 
sock.close() 
相关问题