Proxy tcp代理会话详细信息包括什么?

Proxy tcp代理会话详细信息包括什么?,proxy,reverse-proxy,tcpserver,Proxy,Reverse Proxy,Tcpserver,假设TCP代理已将请求转发回后端服务器。当它从后端服务器收到回复时,它如何知道要回复哪个客户端。代理存储哪些确切的会话信息 谁能解释一下这一点吗?这取决于协议,取决于代理,也取决于透明性是否是一个目标。彻底地解决所有这些问题将是永恒的,所以让我们考虑一个简单化的例子。 软件中的网络连接通常由某种句柄(无论是文件描述符还是其他资源)表示。在POSIX系统上的C程序中,我们可以简单地保持两个文件描述符相互关联: struct proxy_session { int client_fd;

假设TCP代理已将请求转发回后端服务器。当它从后端服务器收到回复时,它如何知道要回复哪个客户端。代理存储哪些确切的会话信息


谁能解释一下这一点吗?这取决于协议,取决于代理,也取决于透明性是否是一个目标。彻底地解决所有这些问题将是永恒的,所以让我们考虑一个简单化的例子。

软件中的网络连接通常由某种句柄(无论是文件描述符还是其他资源)表示。在POSIX系统上的C程序中,我们可以简单地保持两个文件描述符相互关联:

struct proxy_session {
    int client_fd;
    int server_fd;
}
这是最低要求

当客户端连接时,我们分配其中一个结构。可能有一个协议让我们知道应该使用什么后端,或者我们自己可能正在进行负载平衡和挑选后端

一旦我们选择了一个后端(通过解析协议或者通过做出某种形式的路由决定),我们就会启动到它的连接。简单地说,代理(作为中介)只是在客户端和服务器之间转发数据包

我们可以使用任意数量的接口将这两个东西连接在一起。例如,在Linux上,
epoll(2)
允许我们将指向文件描述符上事件的指针关联起来。我们可以为它提供一个指向客户端和服务器端的
proxy\u会话
结构的指针。当数据进入这些文件描述符中的任何一个时,我们知道在哪里映射它


缺少这样的接口,我们就必须有一种区分连接句柄的方法(无论它们是文件描述符、指针还是其他表示)。然后,我们可以使用类似哈希表的结构来查找句柄的目标。解决方法很简单,只要能够区分彼此之间的连接,并保持某种状态,将两个连接“粘合”在一起。

这取决于协议,取决于代理,也取决于透明性是否是目标。彻底地解决所有这些问题将是永恒的,所以让我们考虑一个简单化的例子。

软件中的网络连接通常由某种句柄(无论是文件描述符还是其他资源)表示。在POSIX系统上的C程序中,我们可以简单地保持两个文件描述符相互关联:

struct proxy_session {
    int client_fd;
    int server_fd;
}
这是最低要求

当客户端连接时,我们分配其中一个结构。可能有一个协议让我们知道应该使用什么后端,或者我们自己可能正在进行负载平衡和挑选后端

一旦我们选择了一个后端(通过解析协议或者通过做出某种形式的路由决定),我们就会启动到它的连接。简单地说,代理(作为中介)只是在客户端和服务器之间转发数据包

我们可以使用任意数量的接口将这两个东西连接在一起。例如,在Linux上,
epoll(2)
允许我们将指向文件描述符上事件的指针关联起来。我们可以为它提供一个指向客户端和服务器端的
proxy\u会话
结构的指针。当数据进入这些文件描述符中的任何一个时,我们知道在哪里映射它


缺少这样的接口,我们就必须有一种区分连接句柄的方法(无论它们是文件描述符、指针还是其他表示)。然后,我们可以使用类似哈希表的结构来查找句柄的目标。解决方法很简单,只要能够区分彼此之间的连接,并保持某种状态,将两个连接“粘合”在一起。

谢谢您提供的详细信息。所以基本上这意味着,对于每个传入到代理的客户端连接,它将打开一个到后端服务器的新连接,并保持一对一的映射。如果它打开了一个到后端的连接,那么除了检查数据包本身之外,没有办法进行区分。如果您进行多路传输,代理协议必须提供一些区分方法。请求序列化就是这样一种方法。感谢您提供的详细信息。所以基本上这意味着,对于每个传入到代理的客户端连接,它将打开一个到后端服务器的新连接,并保持一对一的映射。如果它打开了一个到后端的连接,那么除了检查数据包本身之外,没有办法进行区分。如果您进行多路传输,代理协议必须提供一些区分方法。请求序列化就是这样一种方法。