Я новичок в сетевом программировании и начинаю с простого. У меня есть 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 работает.