HTTP协议路由转发小结

news2024/9/30 0:23:41

问题介绍:个人电脑 hosts 文件配置如下:

xx.xx.xx.243 xxx.domain.com

其中 xx.xx.xx.243 是里约网关的服务器ip,而应用部署在 xx.xx.xx.93 上,但最终请求为何会转发到93这台服务器上呢?

原因是里约网关配置了转发规则,当网关接收到的请求host是 xxx.domain.com 时,就将请求转发到 93 这台服务器上。这种就是典型的HTTP(7层)转发规则,对应的有TCP(4层)转发,感兴趣的可以了解对比下。那网关是如何转发请求的呢?

先从HTTP协议说起

就以我们政务开放平台系统为例说明,上述条件依旧成立即:里约部署在243服务器上,开放平台部署在93上,我本地开发机配置hosts:

xx.xx.xx.243 xxx.domain.com

浏览器访问 http://xxx1.domain.com/api/corp/personal/user_info,我们先用Wireshark抓包看下http请求(注意抓包时,选择wifi网卡,设置条件 http && ip.addr == xx.xx.xx.243过滤)。下面是我的抓包内容。

GET /api/corp/personal/user_info HTTP/1.1 #请求方法 PATH路径 http版本号
Host: xxx.domain.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en,zh-CN;q=0.9,zh;q=0.8,zh-TW;q=0.7,und;q=0.6

HTTP/1.1 200 OK # 版本号 返回状态码 对应信息
x-proxy-by: Tif-accessgate
Date: Fri, 04 Dec 2020 11:56:17 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 357
Connection: keep-alive
Reqid: UMMIoNR7NfTQfCBeqY9E
x-forwarded-for: 9.*.*.*,127.0.0.1
set-cookie: x_host_key=xxxxx-0a17a7b28b3787e551b18xxxa4f96a3fa47ca6ae72e; path=/; domain=.woa.com; HttpOnly

{"code":0,"message":"success","data":{"user_id":1,"account":"admin","name":"admin","phone":"","email":"admin@kfpt.com","corp_name":"............","uuid":"1d985beb-b975-4abe-923e-8cac2c53a3a2","groups":[{"corp_type":4,"rio_group_name":"...............","rio_group_code":"admin_admin","rio_group_id":"40ced61f-2b59-4f5a-8c08-de8140838a38","description":""}]}}

可以看到http 协议请求的组成:首部、请求头、请求体,响应的组成:首部、响应头、响应体。

第1行:方法、请求路径、协议版本
第2~9行:请求头
如果是Post 请求后面还会有请求体。
第11行:版本号 返回状态码 对应状态码说明
第12~19行:响应头
第21行: 响应体。

HTTP的协议和网关的转发到底有什么关系呢?前面我们提到里约支持HTTP 7层转发和4层转发,这里的7和4都是指OSI参考模型,如下图:
在这里插入图片描述

7层表示最上层应用层,4表示传输出层,如果是7层的话一般就是指应用层协议转发,最常用的就是HTTP协议转发啦,应用层转规则可以更丰富,可以用的条件很多。例如上面的http包格式,可以根据应用层的首部路径,请求头内容、请求体内容、还有请求的来源ip&端口,目的ip、端口等众多条件进行转发。那最开始的host问题就是这么来的,浏览器请求 http://xxx.domain.com/api/corp/personal/user_info 时,有如下步骤:

  1. 先查询域名对应的IP地址,正常来说是请求DNS服务器返回域名对应的ip地址,但是我们配置了域名hosts对应的ip,会查到网关的ip地址;
  2. 建立远程ip的连接,即与网关建立连接,http协议是建立在tcp协议之上的;
  3. 发送http包数据,发送的数据格式就是前面的抓包内容。

网关这边收数据之后知道是HTTP协议 ,命中到了里约网关的RouteRule规则(专门处理HTTP协议),由于我们之前在网关配置了一条类似这样的规则:

[
  {
    "appName":"openplatform-web",
    "path":"^/api", # 匹配首部path,即:/api/corp/personal/user_info
    "targetPath":"/", # path替换的目标path后:/corp/personal/user_info
    "host":"^xxx.domain.com$", # 匹配请求头:Host: xxx.domain.com
    "targetHost": "9.*.*:15000" # 目标ip和端口
  }
]

上面的规则会命中我们抓包的请求,然后将请求转发到开发平台的ip 和 nginx 监听的端口上,nginx 的配置如下:

upstream backendcrop {
        server xx.xx.xx.xx.93:15240;
    } 
server {
    listen       15000 default_server;
    listen       [::]:15000 default_server;
    server_name  xxx.domain.com;
    root         /usr/share/nginx/html;

    location / {
        return 404;
    }
    location /crop { ##命中目录/corp/personal/user_info,负载到backendcrop
        proxy_pass http://backendcrop;
    }
    ... 省略

上面命中了 nginx location规则 /crop 后负载到backendcrop,转发到最终的服务IP和端口,到此我相信差不多说清楚 hosts 域名配置到网关和最终服务的网络链路了。还有一个问题是 nginx 配置的server_name xxx.domain.com; 是干嘛用的?这个可以其实就类似我们前面说得匹配请求头host 的能力。

server {
    listen      80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      80;
    server_name example.net www.example.net;
    ...
}

server {
    listen      80;
    server_name example.com www.example.com;
    ...
}

如果我们nginx配置了3个server,那么就会根据server_name 配置的域名来匹配host来命中server, 那为什么我们开放平台 server_name 去掉也可以命中呢? 是因为我们有这么配置:

listen [::]:15000 default_server;
上面就是说如果没有server_name命中,就默认命中该server。

最后在说一下我上面抓的HTTP包里面没有目标IP+端口,源IP+端口,那是客户端是怎么找到服务器ip端口建立连接的呢?那是因为上面的包是在建立连接之后的HTTP协议包,我给一下我抓到TCP包,红框的部分就是网络其他层协议的数据,TCP协议是有源ip目的ip源端口目的端口的。感兴趣的可以自己抓包看下。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JM8wrXbb-1676095692371)(/img/image-1607084776819.png)]

总结

到此我相信大家对开放平台的转发规则不会有大多疑问了,如果有欢迎和我交流讨论。下面我盗了一张经典的网络层图。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rGSEJ8ss-1676095692371)(/img/image-1607080895179.png)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/338558.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【hello, world】计算机系统漫游

文章目录hello程序信息就是位 上下文程序被其他程序翻译成不同的格式预处理阶段编译阶段汇编阶段链接阶段了解编译系统如何工作是大有益处的优化程序性能理解链接时出现的错误避免安全漏洞处理器读并解释储存在内存中的指令系统的硬件组成总线I/O设备主存处理器运行hello程序高…

web3:区块链共识机制系列-POS(Proof of Stake)股权证明算法

web3相关学习一并收录至该博客:web3学习博客目录大全 前情衔接:web3:区块链常见的几大共识机制及优缺点 目录前言算法公式与原理算法公式运作原理以Peer Coin为例缺陷优点缺点特点分类发展历程casper协议1.什么是无成本利益关系问题2.引入casper协议解决…

力扣33.搜索旋转排序数组

文章目录力扣33.搜索旋转排序数组题目描述方法1&#xff1a;二分查找力扣33.搜索旋转排序数组 题目描述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&…

Android框架WiFi架构

同学,别退出呀,我可是全网最牛逼的 WIFI/BT/GPS/NFC分析博主,我写了上百篇文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦。 一、wpa_supplicant:wpa_supplicant本身开源项目源码,被谷歌收购之后加入Android移…

Python中的类和对象(4)

1. 构造函数 &#xff08;_ init _(self[,……])&#xff09; 在类中定义 _init _() 方法&#xff0c;可以实现在实例化对象的时候进行个性化定制&#xff1a; >>> class C: ... def __init__(self, x, y): ... self.x x ... self.y y ... …

离散数学 课时二 命题逻辑等值演算

等值式(等值联结词) 1、设A、B是两个命题公式,若A、B构成的等价式 A等价于B 为重言式,那么称A与B是等值的 2、常用等值式&#xff1a; 注意&#xff1a; 1 双否定律 2 幂等律 3 交换律 4 结合律 5 吸收律 6 德摩根律 7 同一律 8 零律 9 矛盾律 10 排中律 11 蕴含表达式 12 …

十分钟带你体验一下什么是分布式事务

我们经常在网上看到很多人发关于分布式事务的理论&#xff0c;但是讲实战的却非常少&#xff0c;所以我今天想通过一个案例&#xff0c;来让小伙伴们都感受一下什么是分布式事务&#xff0c;这篇文章理论偏少&#xff0c;请文明观看。咱们今天的主角是 Seata&#xff01; 分布…

Django项目开发

一.认识NoSQL 1.SQL 关系型数据库 结构化: 定义主键&#xff0c;无符号型数据等关联的&#xff1a;结构化表和表之间的关系通过外键进行关联&#xff0c;节省存储空间SQL查询&#xff1a;语法固定 SELECT id,name,age FROM tb_user WHERE id1 ACID 2.NoSQL 非关系型数据库 Re…

通过实例告诉你lua中ipairs到底是怎么遍历的!

这个的文章挺多的&#xff0c;但是有好几种说法并且不全。有人说是忽略手动设定值&#xff0c;有人说是从1开始数&#xff0c;直到序号断开&#xff0c;还有人给出结果&#xff0c;但是和我实机测试的效果不一样&#xff0c; 所以我自己总结一篇。经过我的测试和总结得到以下结…

【2023】Prometheus-Alertmanager高可用集群

本次实验准备了三个节点&#xff0c;分别为laert-01~03 目录1.安装Alertmanager2.配置启动文件3.验证集群4.关于集群的配置项1.安装Alertmanager 这部分内容在三个节点上都要执行 下载安装包&#xff0c;将安装包解压至/data目录下 wget https://github.com/prometheus/aler…

javassm高校学生评教系统的设计与实现idea msyql

伴随着社会以及科学技术的发展&#xff0c;互联网已经渗透在人们的身边&#xff0c;网络慢慢的变成了人们的生活必不可少的一部分&#xff0c;紧接着网络飞速的发展&#xff0c;管理系统这一名词已不陌生&#xff0c;越来越多的学校、公司等机构都会定制一款属于自己个性化的管…

Scout:一款功能强大的轻量级URL模糊测试与爬取工具

关于Scout Scout是一款功能强大的轻量级URL模糊测试与爬取工具&#xff0c;可以帮助广大研究人员进行URL模糊测试&#xff0c;并爬取目标Web服务器中难以扫描发现的VHSOT、文件和目录等资源。 项目中包含了一个完整的字典文件&#xff0c;并尽可能地提供了更多的便携性&#…

【寻人启事】达坦科技持续招人ing

​​​​​​​ ❤️一起来探索前沿科技&#xff0c;做有意思的事情~ 我们是谁 达坦科技&#xff08;DatenLord&#xff09;专注于打造新一代开源跨云存储平台。通过软硬件深度融合的方式打通云云壁垒&#xff0c;实现无限制跨云存储、跨云联通&#xff0c;建立海量异地、异构…

活动星投票在时间的河流上造园分组怎么设置如何进行分组报名

“在时间的河流上造园”网络评选投票_免费小程序运行系统_企业有关的投票_微信投票的应用小程序投票活动如何做&#xff1f;很多企业在运营当中&#xff0c;都会通过投票活动来进行推广&#xff0c;从而达到吸粉、增加用户粘度等效果。而此类投票活动&#xff0c;通过小程序就可…

雅思经验(十一)

写作&#xff1a;WRITINGTASK 2Governments should spend money on railways rather than roads.To what extent do you agree or disagree with this statement?Give reasons for your answer and include any relevant examples from your own knowledge or experience.思路…

【性能优化】MySql查询性能优化必知必会

文章目录分析查询SQL查询优化器查询优化器的两种优化方式数据库存储结构数据库中的存储结构是怎样的数据页内的结构是怎样的索引索引是什么索引好坏的评价标准索引的数据结构B树B树B树是如何进行记录检索的&#xff1f;索引维护索引组织表二级索引索引设计覆盖索引函数索引前缀…

服务器如何下载百度网盘文件?Linux服务器如何在百度网盘中连接、上传下载;在Linux服务器上下载百度云盘中的资料

前言 百度云提供Python包bypy进行远程服务器的对接然后下载&#xff1a; https://github.com/houtianze/bypy 可以通过pip直接下载&#xff0c;授权本人的百度云账号后&#xff0c;就可以直接使Linux电脑本地文件与百度网盘的apps&#xff08;我的应用数据&#xff09;/bypy目…

【c语言】二叉树

主页&#xff1a;114514的代码大冒险 qq:2188956112&#xff08;欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ &#xff09; Gitee&#xff1a;庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 引入 我们之前已经学过线性数据结构&#xff0c;今天我们将介绍非线性数据结构----树 树是一种非线性的…

Element UI框架学习篇(五)

Element UI框架学习篇(五) 1 准备工作 1.1 在zlz包下创建数据传输对象类EmpDTO package com.zlz.dto;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;//根据前台来的 Data public class EmpDTO {private String name;private Stri…

SpringBoot的配置与使用

SpringBoot简介 我们的Spring是包含了众多工具的IoC容器&#xff0c;而SpringBoot则是Spring的加强版&#xff0c;可以更加方便快捷的使用 如果Spring是手动挡的车&#xff0c;那么SpringBoot就是自动挡的车&#xff0c;让我们的驾驶体验变得更好 SpringBoot具有一下几种特征…