java 网关怎么判断转发到哪个服务 网关是怎么转发请求的_服务器

 

1.网关:Gateway

  • 位于不同网络之间的主机需要通信,必须将数据包交给网关 (默认路由)
  • 网关是一台具备路由功能的设备(路由器、三层交换机、防火墙、服务器)
  • 网关地址与设备的接口地址是处于同个网络

 

主机经过与计算得出目的地址是否在同个网段:

同一个网段直接封装目的的MAC转发

不同网段封装网关的MAC,网关帮忙转发 

java 网关怎么判断转发到哪个服务 网关是怎么转发请求的_java 网关怎么判断转发到哪个服务_02

 

 

数据包转发的过程中IP地址和MAC地址:

在同一个网段内的源MAC地址是不会变化,非同一个网段的源MAC地址会变化

IP地址一般不会变化,除使用NAT技术

java 网关怎么判断转发到哪个服务 网关是怎么转发请求的_IP_03

上图中A-R4-R2-B

假设有数据帧X,传输过程中:

A到R4:MAC地址(存在的话)源地址是A,目的地址是R4;

R4到R2:MAC地址(存在的话)源地址是R4,目的地址是R2;

R2到B:MAC地址(存在的话)源地址是R2,目的地址是B;

 

在没有经过NAT情况下,源IP地址和目的IP地址在整个传输过程是不能改变的。

A到R4:IP地址 源地址是A,目的地址是R4;

R4到R2:IP地址 源地址是A,目的地址是R4;

R2到B:IP地址 源地址是A,目的地址是R4; 

 

 

网关其实就是一条缺省默认路由;

如果要去的目标ip地址不在同一个网段,那就要先找到网关

java 网关怎么判断转发到哪个服务 网关是怎么转发请求的_java 网关怎么判断转发到哪个服务_04

 

 

2.数据转发过程

主机A的网关是路由器A,需要通过Http访问服务器A;服务器A的网关是路由器B;

java 网关怎么判断转发到哪个服务 网关是怎么转发请求的_封装_05

 

1)传输层封装

应用层通过http协议封装,然后到下一层的传输层; 

传输层使用TCP协议封装数据;

TCP协议封装需要知道:源端口号、目标端口号;

源端口号由系统随机分配,目标端口号(http服务器的端口号默认是80);

TCP协议在建立连接前需要经过三次握手:

    1】客户端给服务端发同步请求,随机的序列号seqA,标识同步位SYN置1;

    2】服务端收到消息后,给服务端回应,同时给客户端发送同步请求:随机的序列号seqB,确认号arkB=seqA+1,标识位ARK和SYN置1;

    3】客户端给服务端发送确认请求:seqA=arkB相当于seqA加了1,确认号arkA=seqB+1,标识位ARK置1;

java 网关怎么判断转发到哪个服务 网关是怎么转发请求的_IP_06

 

2)网络层

数据经过传输层的TCP协议封装后,到网络层,需要通过ip协议封装;

ip协议需要知道:源ip地址(自己的ip),目标ip地址;

如果是通过域名访问,首先要通过dns服务器拿到目标ip;

java 网关怎么判断转发到哪个服务 网关是怎么转发请求的_封装_07

封装源IP目的IP地址,并进行与计算

 

3)网关

因为主机A和主机B的ip地址不在同一个网段,需要使用网关;

主机A如果配了网关,会将数据包发送给网关;

就像寄快递时将包裹交给当地的快递员;

java 网关怎么判断转发到哪个服务 网关是怎么转发请求的_java 网关怎么判断转发到哪个服务_08

不在同一网段,交给网关

 

4)网关的MAC

数据发送给网关,需要知道网关的MAC地址(数据链路层的以太网协议封装时需要目标mac)

如果主机A的缓存中没有网关的mac地址,就会发arp请求得到;

java 网关怎么判断转发到哪个服务 网关是怎么转发请求的_java 网关怎么判断转发到哪个服务_09

 

5)数据链路层封装

数据链路层使用以太网协议;

以太网协议需要知道:源mac(主机A的mac)、目标mac(网关的mac)

java 网关怎么判断转发到哪个服务 网关是怎么转发请求的_IP_10

6)物理层 

最终以光信号、电信号发送出去

 

7)网关对数据帧转发

网关收到数据后需要进行FCS帧校验检测,看数据是否有误;

还要检测数据目的MAC地址,看是否是网关自己,(目标mac封装在以太网头中)

java 网关怎么判断转发到哪个服务 网关是怎么转发请求的_java 网关怎么判断转发到哪个服务_11

 

数据链路层(二层)的校验通过后,开始需解封装,去掉二层的头部;

发现目的IP地址不是网关自身的地址,就是说不是给网关的,查找路由表看有没有到达目标ip的路由;

发现有路由,则需要重新打包,因为二层前面的数据都被解封装剥离掉了;

封装新的二层帧头和帧尾,并进行转发;

重新添加的以太网包头的源mac就是网关的mac;

java 网关怎么判断转发到哪个服务 网关是怎么转发请求的_服务器_12

 

路由器以服务器A的MAC地址作为目的MAC地址继续转发

服务器A收到,进行FCS检测,通过检测目的MAC是我的MAC,继续交给上层处理(网络层解封装) 

java 网关怎么判断转发到哪个服务 网关是怎么转发请求的_java 网关怎么判断转发到哪个服务_13

 

 

检测目的IP地址是我,检测协议号为TCP,交给TCP

TCP检测目的端口交给HTTP

java 网关怎么判断转发到哪个服务 网关是怎么转发请求的_java 网关怎么判断转发到哪个服务_14

 

逐层解封装得到数据;

 

java 网关怎么判断转发到哪个服务 网关是怎么转发请求的_服务器_15

 

3.http请求实例 

打开 浏览器,输入www.baidu.com ,回车将会发生什么事情,哪些协议,顺序如何?

封装:

HTTP->TCP->ip (目的MAC地址未知,需要DNS解析)

DNS->UDP->ip (目标DNS服务器IP地址不同网段,寻找网关) ->Ethernet II (查看ARP缓存,不存在网关MAC)

ARP->Ethernet II(请求网关MAC)

网关经过路由找到DNS服务器

HTTP->TCP->ip(需要网关)->Ethernet

java 网关怎么判断转发到哪个服务 网关是怎么转发请求的_封装_16

 

 

4.总结

  • 数据在进行二层和三层封装之前,主机需要了解那哪些信息?

A:源MAC 目的MAC 源IP 目的IP

 

  • 当数据帧发送到非目的主机时,非目的主机将会进行什么处理?

A:检测FCS,通过检测MAC发现不是我的MAC丢弃

 

  • 传输层如何准确的将数据交给特定的应用?

A:根据目的端口

 

  • 当两台主机同时访问服务器的HTTP服务,该服务器如何区分数据属于哪个会话?

A: 不同网络时,检测目的IP地址和MAC地址

       同一网络时,检测目的端口号