2016-03-13 45 views

回答

0

这取决于协议的一些光,这取决于代理,它依赖于透明度是否是一个目标。详尽地解决所有这些问题将会花费很长时间,所以让我们考虑一个简单的案例。

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

struct proxy_session { 
    int client_fd; 
    int server_fd; 
} 

这是裸最低要求。

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

一旦我们选择了一个后端(无论是通过解析协议还是通过做出一些表单路由决定),我们都会启动一个连接。简单地说,代理(作为中介)只是在客户端和服务器之间转发数据包。

我们可以使用任意数量的接口将这两件事绑在一起。例如,在Linux上,epoll(2)允许我们将指针关联到文件描述符上的事件。我们可以为它提供一个指向我们的proxy_session结构的指针,用于客户端和服务器端。当数据进入这些文件描述符时,我们知道在哪里映射它。我们必须有一种区分连接句柄的手段(不管它们是文件描述符,指针还是其他表示形式),因此缺少这样的接口是不够的。然后,我们可以使用像散列表这样的结构来查找句柄的目的地。通过简单地区分彼此之间的连接,并保持一些将两个连接“粘合”在一起的状态,就可以找到解决方案。

+0

感谢您的详细信息。所以基本上这意味着,对于每个传入客户端连接代理,它将打开一个到后端服务器的新连接并保持一对一映射。如果它打开到后端的单个连接,那么除了检查数据包本身外,没有办法区分。 – Sammy

+0

如果您多路复用,代理协议必须提供一些区分手段。请求序列化就是这样的一种方法。 – dho