首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拼接时c- Loadbalancer.Modify http报头?

拼接时c- Loadbalancer.Modify http报头?
EN

Stack Overflow用户
提问于 2014-08-26 21:28:07
回答 1查看 97关注 0票数 0

更新:

我对我的问题进行了修改,使其更多地集中在问题上。

上下文

了解负载均衡工作原理的编码。Debian 64位。

负载均衡器127.0.0.1:36001后端127.0.0.1:36000

curl在负载均衡器上调用(36001)。

问题

我使用此代码来创建我的套接字socket code

我创建了一个非常简单的负载均衡器,一个服务器,我有一个对负载均衡器的curl请求。我的问题是,我不知道如何将客户端端口/ip传递到后端,以便在拼接时直接使用curl。

代码

curl请求

curl localhost:36001 -d“敬礼”

负载均衡器

代码语言:javascript
复制
        static int pool_of_conn[2],
                   pool_of_pipes[2][2];
        int sentinel , efd;
        struct epoll_event event;
        struct epoll_event *events;
        ...

        off64_t offset = 0;

        pipe(pool_of_pipes[0]);
        
        /* This splice works but sends the loadbalancer ip and port. How to put the client's here ? How to alter events[i].data.fd ? */
        bytes = splice(events[i].data.fd, NULL, pool_of_pipes[0][1], NULL, 4096, SPLICE_F_MOVE);
        if (bytes == 0)
          break;
        splice(pool_of_pipes[0][0], NULL, pool_of_conn[0], NULL, bytes, SPLICE_F_MOVE);

你能帮我个忙吗?

EN

回答 1

Stack Overflow用户

发布于 2014-08-27 16:43:35

您的问题的根本问题是HTTP通过TCP,这是一种面向连接的协议。因此,即使您可以使到后端的连接看起来来自客户端IP地址,也会在负载均衡器和后端之间建立TCP连接。因此,返回的TCP数据包也使用该连接。要以某种方式解决此问题,您需要让HTTP对请求和回复使用不同的TCP连接,并操纵本地IP路由以使后端回复仍然发送到实际的客户端。

如果你打算做一个HTTP负载均衡器,最简单的解决方案可能是在应用程序协议(即HTTP)级别。您可以使用HTTP重定向或其他更复杂的方法,比如在转发客户端请求之前将其包装在一些头中。我相信现有的HTTP负载均衡器提供了大量的例子和想法。

也就是说,如果您想要在TCP连接级别上解决这个问题,并且对应用程序协议是透明的,这是可行的,但它确实需要相当多的额外代码。此外,后端回复仍然通过负载均衡器。我的建议是研究IP选项IP_TRANSPARENT。它将允许您的负载均衡器在连接到后端时使用客户端IP地址作为源。(请注意,返回的流量也会通过负载均衡器,因此您的splice()会派上用场)

这是一个关于IP_TRANSPARENT Transparent proxying - how to pass socket to local server without modification?的老问题

下面是它的Linux内核文档https://www.kernel.org/doc/Documentation/networking/tproxy.txt

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25507062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档