带有python套接字的端口,它们是随机的吗?

带有python套接字的端口,它们是随机的吗?,python,sockets,port,Python,Sockets,Port,我正在尝试学习python套接字,但对网站()中示例代码的结果感到非常困惑 我所做的唯一修改是将服务器中的socket.gethostname()替换为服务器的本地IP,以允许我在两台计算机上运行此操作 当我连接时,尝试连接端口12345(如示例所示),我得到以下输出: 从('10.0.1.10',37492)获得连接 这使我相信它正在连接端口37492。我希望它连接到我告诉它的端口,这样我就可以向前移植。是我误解了,还是有额外的命令来指定它 编辑:我正在上载我的代码: Client.py #!

我正在尝试学习python套接字,但对网站()中示例代码的结果感到非常困惑

我所做的唯一修改是将服务器中的
socket.gethostname()
替换为服务器的本地IP,以允许我在两台计算机上运行此操作

当我连接时,尝试连接端口12345(如示例所示),我得到以下输出:

从('10.0.1.10',37492)获得连接

这使我相信它正在连接端口37492。我希望它连接到我告诉它的端口,这样我就可以向前移植。是我误解了,还是有额外的命令来指定它

编辑:我正在上载我的代码:

Client.py

#!/usr/bin/python           # This is client.py file

import socket               # Import socket module

s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.

s.connect(("10.0.1.42", port))
print s.recv(1024)
s.close                     # Close the socket when done
Server.py

import socket

s = socket.socket()         # Create a socket object
host = "10.0.1.42"          # Get local machine name
port = 12345                # Reserve a port for your service.
s.bind((host, port))        # Bind to the port

s.listen(5)                 # Now wait for client connection.
while True:
        c, addr = s.accept()     # Establish connection with client.
        print 'Got connection from', addr
        c.send('Thank you for connecting')
        c.close()                # Close the connection

关键字是“from”。这是客户端连接的端口,12345是服务器正在侦听的端口,客户端正在连接到该端口。

在输出中获得的端口是源端口。客户机程序通过您选择的端口(在本例中为12345)发送到服务器,但它也需要一个端口来接收服务器发送的数据,因此它随机选择一个源端口并将其告知服务器


我建议您阅读更多关于和的信息。

出现的消息来自服务器。它只提供从客户端的端口37492建立连接的信息

事情就是这样:
您的服务器(server.py)正在端口12345上侦听。您的客户端(client.py)连接到服务器的端口12345。TCP连接始终在两个端口(源端口和目标端口)之间建立。 因此,从客户端应用程序的角度来看,12345是目标端口,37492是源端口。换句话说,客户端建立从其本地端口37492到远程服务器端口12345的连接


如果您想设置端口转发,您仍然可以这样做,因为服务器侦听的端口是众所周知的(12345),在这种情况下,客户端的源端口并不重要。

您已经达到了网络生活中需要了解协议多路复用的程度。对你有好处

想想TCP/IP协议栈。应用程序通过将应用程序层数据传递到传输(端到端)层与远程应用程序通信,传输(端到端)层将数据传递到网络层(网络间层),网络层在没有保证的情况下尝试,使数据包通过由协作路由器确定的一系列跃点到达IP目标主机,协作路由器通过与连接的路由器对话动态更新其路由表。每个路由器会话都经过某种物理传输(ISDN、以太网、PPP——在TCP/IP中,创建数据包和传输适当比特流的任务被视为一个“子网”层,但当OSI物理层(第1层)之间需要区分时,这一层最终被分成两层数据链路层(第2层)用于DHCP等协议

在设计TCP和UDP时,设计人员设想每台服务器都会侦听特定的端口。这通常有一个固有的限制,即端口只能处理一个版本的服务协议(虽然HTTP等协议注意向后兼容,以便旧服务器/客户端通常可以与新服务器/客户端进行互操作)。通常在端口111上运行一个名为portmapper的服务,该服务允许服务器注册正在运行的端口号,而客户端则通过服务(程序)查询已注册的服务器编号和协议版本。这是Sun设计的RPC协议的一部分,旨在将侦听端口的范围扩展到标准预先分配的端口之外。因为预先分配的端口编号从1到1023,并且这些端口通常(在合理的操作系统上)需要高级别的特权,RPC还启用了非特权服务器进程,并允许服务器响应多个版本的网络应用程序协议,如NFS

然而,服务器端工作,事实上,网络层必须有某种方式来决定哪一个TCP连接(或UDP侦听器)来传送特定的包。同样地,对于传输层(我只考虑TCP,因为它是面向连接的——UDP是相似的,但不介意丢失数据包)。。假设我是一个服务器,在同一台计算机上从两个不同的客户端进程获得两个连接。如果客户端使用相同协议的相同版本,或者如果服务仅侦听单个端口,则目标(IP地址、端口号)将相同

服务器的网络层查看传入的IP数据报,并发现它被寻址到特定的服务器端口。因此,它将其交给传输层(网络层之上的层)中的该端口。服务器是一个流行的目的地,在同一台计算机上可能有来自不同客户端进程的多个连接。这就是短暂端口的魔力所在

当客户端请求一个用于连接服务的端口时,TCP层保证在客户端进程继续使用该端口号的同时,该机器上的任何其他进程(从技术上讲,该接口,因为不同的接口具有唯一的IP地址,但这是一个细节)都不会被分配相同的端口号

因此,协议多路复用和解多路复用依赖于五条信息:

(发送方IP、发送方端口、协议、接收方IP、接收方端口)

协议是IP报头中的一个字段,源和目标IP地址也是。发送和接收端口号位于传输层段报头中

当传入数据包到达时,来自同一客户端(端点)的不同临时端口的保证唯一性允许传输层区分来自同一客户端到同一服务器IP地址的不同连接