了解IP。 所请求的URL不在此服务器上找到(Understanding IP . The re

2019-10-19 10:50发布

我是一名学生,我想了解IP地址背后的想法。 我了解到,键入URL是一样的键入相应的IP地址 - 无论哪种方式,我们将指向同一个网页。

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

The requested URL was not found on this server.

为什么? 我试着用同样的google.com的IP,它工作得很好。

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

Answer 1:

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的Web服务器上。 但是,这是可能的,有可能是在198.252.206.140托管以及其他网站。

这就是为什么我们有Host在HTTP协议中的命令。 浏览器发出的80端口到Web服务器的连接后,浏览器将host命令,以表明它正在尝试连接到该网站上的Web服务器上。 见http://blog.tonycode.com/tech-stuff/http-notes/making-http-requests-via-telnet关于如何工作的一个很好的教程。 下面复制是198.252.206.140,其中HTTP连接由telnet会话,并且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>


Answer 2:

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

但是HTTP/1.1协议指定该客户端(浏览器),必须通过主机名作为一个报头,如在:

Host: www.howstuffworks.com

这是非常有用的,因为它允许多个网站要在同一台服务器上托管,或者反正是来自同一个IP地址访问。

你可以发现这一点,使用工具命令curl

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

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



Answer 3:

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

ping命令选择来ping当主机名具有多个地址的一个地址。 在Windows系统中ping可以同时用于IPv4和IPv6。 在类Unix系统中,你必须使用ping6 IPv6的。

如果你想看看是什么在DNS你必须使用为这一目的做出这样的工具hostdig或(在类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()


文章来源: Understanding IP . The requested URL was not found on this server
标签: ip ipv6 ipv4