Port

為什麼在localhost上發送TCP數據時埠會改變

  • March 26, 2018

我是網路程式的新手,我開始很簡單。我在我的機器上執行了 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)

這是執行客戶端時伺服器的anwser

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

所有TCP/IP通信都使用兩個單獨的埠進行通信。

當設備或客戶端發送數據時,它使用臨時埠(通常大於 1024,但通常甚至更高)作為源埠,但目標埠是服務埠。在您的範例中,服務埠是埠 80 上的 HTTP 服務,因此所有發往該服務的 TCP 流量都流向埠 80。但是當客戶端發送數據時,它使用較高的值,在本例中為 56400。這裡的 TCP 事務可以被描述為連接 WXYZ:56400 <–> SRVR:80。這允許伺服器在該臨時埠(本例中為 56400)上將數據發送回客戶端

這只是TCP/IP工作原理的一部分。

引用自:https://serverfault.com/questions/904687