Назад | Перейти на главную страницу

Почему порт меняется при отправке данных TCP на localhost

Я новичок в сетевом программировании и начинаю с простого. У меня есть 2 простых скрипта Python, которые работают на моем компьютере, сервер и клиент, клиент отправляет некоторые данные через порт 80, а сервер прослушивает порт 80, печатает данные и отвечает простым «ACK», и он работает. Но когда сервер получает данные, он получает их из случайного порта. Однако, если я изменю порт отправки на клиенте или порт прослушивания на сервере, он перестанет работать. Я не понимаю, как это работает.

Это клиентский скрипт

import socket
c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
c.connect(("127.0.0.1",80))
c.send("TEST Message".encode())
r = c.recv(200)
print (r.decode())


А это сервер

import socket


server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("0.0.0.0",80))
server.listen(5)


# this is our client-handling thread
def handle_client(client_socket):
    # print out what the client sends
    request = client_socket.recv(1024)
    print ("[*] Received: %s" % request.decode())
    # send back a packet
    client_socket.send("ACK!".encode())
    client_socket.close()

while True:
    client,addr = server.accept()
    print ("[*] Accepted connection from: %s:%d" % (addr[0],addr[1]))
    # handle incoming data
    handle_client(client)

и это ответ сервера при запуске клиента

[*] Accepted connection from: 127.0.0.1:56400
[*] Received: TEST Message

Все TCP / IP для связи используются два отдельных порта.

Когда устройство или клиент отправляет данные, они используют Эфемерный порт (обычно больше 1024, но обычно даже больше) для порта источника, но предназначен для порта обслуживания. В вашем примере порт службы - это службы HTTP на порту 80, поэтому весь TCP-трафик, предназначенный для этой службы, идет на порт 80. Но когда клиент ОТПРАВЛЯЕТ данные, он использует что-то высокое, в данном случае 56400. Транзакция TCP здесь может можно описать как соединение WXYZ: 56400 <--> SRVR: 80. Это позволяет серверу отправлять данные обратно клиенту на этом Эфемерный порт (56400 в данном случае)

Это лишь часть того, как TCP / IP работает.