客户端如何知道在 accept() 之后发送数据到哪个端口
How does a client know which port to send data after accept()
假设我们有一台可以接受多个客户端的服务器。首先,它必须创建一个套接字,然后将其与端口和 IP 绑定,最后监听来自客户端的连接请求。在 accept()
与客户端建立连接后,服务器会创建一个新套接字来与特定客户端通信。我的问题是客户端是否会将其数据发送到它发送初始请求的同一端口,如果不是,它如何知道将数据发送到哪里?
客户端使用源 IP 和端口连接到具有目标 IP 和端口的服务器。接受完全相同的IP和端口后,继续使用双方进行数据交换,建立连接。
一般每种都有一个默认端口分配communication.Operating系统可能会保持打开或关闭,可以查看。
假设对于 FTP 连接,有一个单独的端口分配给握手,无论请求多少个新的 FTP 连接,所有新连接都将转到相同的端口port ,一旦握手完成,数据交换就通过另一个端口完成,即使我们没有指定端口。如果网络管理器之前有端口列表条目,它将请求相同的端口。
SSH 示例
如果您请求
ssh -X <IP>
即使您不提及端口,您的系统也知道要请求哪个端口,并且在服务器端总会有一些端口打开,它会监听您的请求,并根据您在握手时发送的数据继续进行倾听或阻止你。
好处是您可以在服务器端打开您的自定义端口,服务器端将侦听您的请求。 TCP 实现默认声明哪个端口将用于哪种通信。
套接字连接由 [Protocol, Local IP, Local Port, Peer IP, Peer Port]
.
的元组唯一标识
一个 TCP 服务器用 [TCP, Listen IP, Listen Port, 0, 0]
的元组创建一个 listening 套接字。当客户端请求连接到服务器时,网络将请求路由到指定的 IP/Port。然后接收设备将请求路由到匹配的侦听套接字,与客户端执行 3 次握手,并将其放入队列中。稍后,当调用 accept()
时,它会从队列中提取下一个待处理的客户端和 returns 一个用 [TCP, Listen IP, Listen Port, Client IP, Client Port]
元组标识的新套接字。因此,单个侦听套接字可以接受来自不同客户端 IP/Port 组合的多个客户端。
一个 TCP 客户端使用 [TCP, Local IP, Local Port, 0, 0]
的元组创建一个 connecting 套接字。 3 次握手完成后,套接字的元组更新为 [TCP, Local IP, Local Port, Server IP, Server Port]
。因此,客户端可以将不同的套接字连接到不同服务器的不同服务器 IP/Port 组合。
所有后续数据交换都使用这些元组。
从客户端的连接套接字发出的数据将被发送到关联的服务器IP/Port并存储在接受的服务器套接字的缓冲区中,其元组与客户端和服务器都匹配。
从服务器的侦听套接字发出的数据将被忽略,因为没有关联的客户端。
从接受的服务器套接字发出的数据将被发送到关联的客户端IP/Port并存储在元组与客户端和服务器匹配的已连接客户端套接字的缓冲区中。
假设我们有一台可以接受多个客户端的服务器。首先,它必须创建一个套接字,然后将其与端口和 IP 绑定,最后监听来自客户端的连接请求。在 accept()
与客户端建立连接后,服务器会创建一个新套接字来与特定客户端通信。我的问题是客户端是否会将其数据发送到它发送初始请求的同一端口,如果不是,它如何知道将数据发送到哪里?
客户端使用源 IP 和端口连接到具有目标 IP 和端口的服务器。接受完全相同的IP和端口后,继续使用双方进行数据交换,建立连接。
一般每种都有一个默认端口分配communication.Operating系统可能会保持打开或关闭,可以查看。
假设对于 FTP 连接,有一个单独的端口分配给握手,无论请求多少个新的 FTP 连接,所有新连接都将转到相同的端口port ,一旦握手完成,数据交换就通过另一个端口完成,即使我们没有指定端口。如果网络管理器之前有端口列表条目,它将请求相同的端口。
SSH 示例 如果您请求
ssh -X <IP>
即使您不提及端口,您的系统也知道要请求哪个端口,并且在服务器端总会有一些端口打开,它会监听您的请求,并根据您在握手时发送的数据继续进行倾听或阻止你。
好处是您可以在服务器端打开您的自定义端口,服务器端将侦听您的请求。 TCP 实现默认声明哪个端口将用于哪种通信。
套接字连接由 [Protocol, Local IP, Local Port, Peer IP, Peer Port]
.
一个 TCP 服务器用 [TCP, Listen IP, Listen Port, 0, 0]
的元组创建一个 listening 套接字。当客户端请求连接到服务器时,网络将请求路由到指定的 IP/Port。然后接收设备将请求路由到匹配的侦听套接字,与客户端执行 3 次握手,并将其放入队列中。稍后,当调用 accept()
时,它会从队列中提取下一个待处理的客户端和 returns 一个用 [TCP, Listen IP, Listen Port, Client IP, Client Port]
元组标识的新套接字。因此,单个侦听套接字可以接受来自不同客户端 IP/Port 组合的多个客户端。
一个 TCP 客户端使用 [TCP, Local IP, Local Port, 0, 0]
的元组创建一个 connecting 套接字。 3 次握手完成后,套接字的元组更新为 [TCP, Local IP, Local Port, Server IP, Server Port]
。因此,客户端可以将不同的套接字连接到不同服务器的不同服务器 IP/Port 组合。
所有后续数据交换都使用这些元组。
从客户端的连接套接字发出的数据将被发送到关联的服务器IP/Port并存储在接受的服务器套接字的缓冲区中,其元组与客户端和服务器都匹配。
从服务器的侦听套接字发出的数据将被忽略,因为没有关联的客户端。
从接受的服务器套接字发出的数据将被发送到关联的客户端IP/Port并存储在元组与客户端和服务器匹配的已连接客户端套接字的缓冲区中。