Домой Edit me on GitHub

2019-06-19

Каналы передачи данных | Сетевое программирование | Базы данных | Основы Веб-программирования

DNS

В сети используются системы доменных имен (DNS), для преобразования имени сайта (например lectureswww.readthedocs.org) в серии из 4-х цифр (для IPv4). Первое что нужно сделать программисту это преобразовать доменное имя в IP адрес. В языке программирования Python это можно сделать при помощи модуля socket.

Переводим имя хоста в IP адрес

import socket

# результат из hosts файла
print(socket.gethostbyname('localhost'))

# ваша ОС отправит запрос на удаленный DNS сервер
print(socket.gethostbyname('google.com'))
127.0.0.1
213.180.204.3

Расширенное представление:

import socket
print(socket.gethostbyname_ex("localhost"))
print(socket.gethostbyname_ex("google.com"))
print(socket.gethostbyname_ex("www.google.com"))
print(socket.gethostbyname_ex("www.python.org"))

Вернет (hostname, aliaslist, ipaddrlist) где hostname основное имя хоста по этому IP, aliaslist список (может быть пустым) альтернативных имен на этом IP, ipaddrlist список IPv4 адресов прикрепленных к этому домену (часто не множество IP).

('localhost', [], ['127.0.0.1'])
('google.com', [], ['213.180.204.3'])
('www.google.com', [], ['195.64.213.53', '195.64.213.42', '195.64.213.44', '195.64.213.59', '195.64.213.49', '195.64.213.38', '195.64.213.29', '195.64.213.27', '195.64.213.23', '195.64.213.15', '195.64.213.19', '195.64.213.34', '195.64.213.45', '195.64.213.30', '195.64.213.57'])
('python.map.fastly.net', ['www.python.org'], ['23.235.43.223'])

В реальных программах нужно использовать перехват исключений:

import socket
name = "www.python.org"
try:
    host = socket.gethostbyname(name)
    print(host)
except socket.gaierror as err:
    print("cannot resolve hostname: %s %s" % (name, err))

Пример DNS обращений к текущим лекциям (lectureswww.readthedocs.org)

>>> print(socket.gethostbyname('lectureswww.readthedocs.org'))
162.209.114.75

>>> print(socket.gethostbyname_ex('lectureswww.readthedocs.org'))
('lectureswww.readthedocs.org', [], ['162.209.114.75'])

>>> print(socket.gethostbyaddr('162.209.114.75'))
('readthedocs.org', [], ['162.209.114.75'])

Локальное имя машины

import socket
print(socket.gethostname())
my-laptop

Получаем fqdn (fully qualified domain name)

>>> import socket

>>> print(socket.getfqdn("8.8.8.8"))
google-public-dns-a.google.com

>>> print(socket.getfqdn("193.107.218.31"))
193.107.218.31

>>> print(socket.getfqdn("127.0.0.1"))
localhost

>>> print(socket.getfqdn("8.8.4.4"))
google-public-dns-b.google.com
Previous: Стек протоколов TCP/IP Next: HTTP