signed

QiShunwang

“诚信为本、客户至上”

Java基础系列:网络协议

2021/3/21 8:41:57   来源:

俗世游子:专注技术研究的程序猿

说在前面的话

上一节聊了聊计算机网络方面的相关基础知识,仔细想了想感觉不是一般得水啊,所以这段时间又复习了一下相关的知识,所以今天我们只聊两个东西

  • 下一跳机制
  • ARP协议

这两个东西我能和大家聊明白了,我觉得我也很厉害了,O(∩_∩)O哈哈~

TCP协议发送消息

我们先来回顾一下TCP协议

  • 应用层处于操作系统用户态,而 传输控制层网络层数据链路层物理层 都处于操作系统内核态

  • 比如上面的例子,上面是一个通过TCP协议互聊的一个小例子:想要将消息发送出去的时候,应用层会调用传输控制层建立连接

  • 当传输控制层接收到信号之后,会通过三次握手建立通信连接,连接建立完成之后就会通知应用层建立线程,创建对象,开辟内存空间等等的操作

  • 然后在调用其他层将数据包发送出去

也就是说,首先传输控制层发送握手包, 那么:传输控制层怎么知道将这个握手包发送到哪里?

实际上,当传输控制层调用网络层的时候,传输控制层就就进入了阻塞状态等待网络层帮它将网络疏通清楚,到链路层知道下一个节点的位置,通过物理层进行二进制编码将握手包发送出去(来回接收)

网络层如何疏通网络就是我们下面要聊的重点

下一跳机制

基本方案

有网络存在,必然存在互联网,互联网上存在N多的设备,我们如何能够缩小这个范围就成了网络层所要做的事情。

就像我们生活中发快递,我们只有把具体省市区,详细地址,姓名电话等信息填写清楚,这样快递才能正确的到达

因此,我们当前设备中都包含以下三个因素:

  • IP

分为ipv4ipv6两种

  • 掩码

将IP和掩码做按位与操作,得到当前IP的网络号。

  • 网关

网络实际出口地址

在当时存在这么两种方案来解决数据包传输问题:

  1. 每个设备中将整个互联网中除本身之外的所有设备,网络拓扑,链接方式等等都存储起来,然后如果该设备想要找其中的某一个点,那么只需要通过在图中进行计算就可以得到最近的路线

这种方案肯定不行,互联网设备多多啊。所以出了这么一种方案,然后通过实际实验征服了大家,也就是下一跳机制

  1. 每个设备中只存储自身网络中的节点,这样通过各种方式的比对,每次都得到离自己最近的一个节点。也就是这样的:

网络存储点

也就是说,设备1只需要保存交换机1的地址,路由器只需要保存交换机1, 交换机2,交换机3等的地址,不需要存储其他的信息

路由表

那么,如何对比就成了问题的关键。所以每个设备中,都存在这么一张表叫路由表:

route

那么,我们将要通信的IP路由表中的条目掩码分别做按位与计算,然后和前面的网络号进行比对,如果能够比对上的话,那么当前条目所对应的网关地址就是下一跳地址

而且,通过比对,和路由表中其他条目都匹配不到,但是唯独可以和0.0.0.0的条目匹配到,那么这个条目的网关就是默认网关

还是比如:ping www.baidu.com

路由比对

通过比对,下一跳的地址就是192.168.87.2,这是当前机器会封装一个数据包出来,主要就包括:

  • 源IP地址 – 目标IP地址
  • 源端口号 – 目标端口号

网络层也只是找到了下一跳,下面就到了数据链路层的工作了

ARP协议

如何得到下一跳的MAC地址

在这一层,会把网络层传输过来的数据包外层再套一层,包含下一跳设备的MAC地址,这里就用到了arp表

区别于DNS,DNS是用来确定域名和IP之间的关系,而ARP是用来确定IP和MAC地址之间的关系,并且受限于局域网

我们先来看看arp表是什么样子的

arp表

图中展示了所有的对应关系,结合路由表可以确定,192.168.87.2所对应的mac地址是不写了,看图

但其实,设备是全新的或者刚开机,arp表中是空的,这里没有对应的mac地址了。这时计算机会发送一个arp的数据包,包括:

  • 源mac地址:设备1地址
  • 目标mac地址:FF:FF:FF:FF:FF:FF:FF
  • 目标ip地址:192.168.87.2

arp广播消息

目标mac地址全是F的时候,会成为广播消息,通过交换机发送到当前网络中的所有设备,如果当前网络中的设备匹配不到ip地址,那么就会将这条消息丢弃,如果匹配到,那么就会给设备返回响应,这是响应的数据包就是这样的:

  • 源mac地址:路由器mac地址
  • 目标mac地址:设备1的mac
  • 目标ip地址:192.168.87.139

这样设备1就得到了下一跳的mac地址。

这里插入一个点,交换机将消息发送过来之后,如何返回

交换机自身带有port->mac的学习功能,当设备1将广播消息发送过来之后,会在交换机中保存一条信息:

  • 1: -> 192.168.87.139@mac

当路由器返回的时候,会在这里比对,然后找到设备1,并会记录新的一条信息

  • 2: -> 192.168.87.2@mac

数据包传输过程

结合现在已知的知识点,我们通过一张图尝试还原如何ping www.baidu.com

假设arp上都包含了各个ip所对应的mac地址,

如果没有就按照上面的流程发送广播消息等待对应设备的接收,然后返回

数据传输过程

这里数据包中源mac地址和目标mac地址会根据不同的下一跳不断的变化

arp不能跨网络

NAT转换协议

我们家里的网络一般都是这样的:

  • 路由器,对外接入运营商网络,让我们能够上网,存在一个外网地址,对内为我们提供了上网的网络,存在局域网地址

如图

NAT网络模型

现在,设备1和设备2分别通过浏览器要访问百度,这时:

  • 设备1随机申请到端口:192.168.1.3:11211
  • 设备2随机申请到端口:192.168.1.4:11211

可申请端口有65535个,两台不同的设备申请到同样的端口是非常有可能的

两台设备将请求全部到路由器层面,这是路由器会发生如下操作:

  • 将设备1的地址转换:6.6.6.6:11211
  • 将设备2的地址转换:6.6.6.6:11211

路由器转换地址之后,将请求通过互联网发送到百度的服务器,然后百度那边给路由器返回请求结果,最终呈现的效果是这样的:

NAT返回

这样子在路由层就不知道该怎么返回,所以我们将基于某种手段可以识别到这种请求的方式称为:源地址转换协议(S-NAT),也就是这样的:

解决方案

请求到路由器之后,路由器在其中随机申请端口,并记录请求地址,然后再替换请求端口,这样当服务端返回的时候就可以区分请求,并且通过比对路由器中的表,就能够将请求结果返回到对应的设备中

还有一种是:目标地址转换协议(D-NAT),其实就是通过负载均衡服务替换目标地址的过程,这里在负载服务的时候再详聊

最后的话

聊到这里网络基本概念性的东西就完了,我们下一节进入实战编码过程,看看Java中Socket的使用

口,并记录请求地址,然后再替换请求端口,这样当服务端返回的时候就可以区分请求,并且通过比对路由器中的表,就能够将请求结果返回到对应的设备中

还有一种是:目标地址转换协议(D-NAT),其实就是通过负载均衡服务替换目标地址的过程,这里在负载服务的时候再详聊

最后的话

聊到这里网络基本概念性的东西就完了,我们下一节进入实战编码过程,看看Java中Socket的使用