Озадаченный о `telnet localhost` и` telnet 0.0.0.0` - PullRequest
0 голосов
/ 30 апреля 2018

Я написал простую программу GO, которая слушает 0.0.0.0:9999 и 127.0.0.1:9999:

func main() {
    go bind("0.0.0.0:9999", "111 ")
    go func() {
        time.Sleep(2 * time.Second)
        bind("127.0.0.1:9999", "222 ")
    }()

    time.Sleep(time.Hour)
}

func bind(address string, content string) {
    fmt.Println("-------------", address, "-----------------")
    listener, err := net.Listen("tcp", address)
    if err != nil {
        panic(err)
        return
    }
    fmt.Println(listener.Addr().String())

    conn, _ := listener.Accept()
    for {
        _, err := conn.Write([]byte(content))
        if err != nil {
            panic(err)
        }
        time.Sleep(1 * time.Second)
    }
}

Значение кода:

Он связывает два адреса и дает разные ответы клиентам из них

  1. привязка "0.0.0.0:9999": отправит клиенту повтор "111"
  2. привязка "127.0.0.1:9999": отправит повтор "222" клиенту

А потом я использую telnet, чтобы попробовать разные адреса, и ответы:

  • telnet 127.0.0.1 9999: 222 (ОК)
  • telnet localhost 9999: 111 (ПОЧЕМУ?!)
  • telnet 0.0.0.0 9999: 222 (ПОЧЕМУ?!)
  • telnet <my-internal-ip> 9999: 111 (ОК)

Я смущен некоторыми из них:

  • telnet localhost 9999: 111 (ПОЧЕМУ?!)

    localhost должно указывать на 127.0.0.1, поэтому я думаю, что это то же самое, что и telnet 127.0.0.1 9999, и ответ должен быть 222, но фактический - 111

  • telnet 0.0.0.0 9999: 222 (ПОЧЕМУ?!)

    Я думаю 0.0.0.0 не то же самое, что 127.0.0.1, я ожидаю получить ответ 111, но получу 222

У меня также есть демонстрационный проект: https://github.com/golang-demos/go-bind-0.0.0.0-127.0.0.1-demo


Обновление: моя ОС - OSX

1 Ответ

0 голосов
/ 30 апреля 2018

Обе localhost и 0.0.0.0 разрешены в 127.0.0.1 ОС

$ ping 0.0.0.0

PING 0.0.0.0 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.024 ms

$ping localhost

PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.035 ms`

localhost может разрешить что-то другое в зависимости от файла /etc/hosts.

Отличное объяснение поведения Linux ping 0.0.0.0 здесь .

...