4 深入理解netty,网络篇,粗谈网络分层

概况

​  在网络编程中,网络协议的选型是尤其重要,比如在物联网领域中,我们可能会选择UDP或者是MQTT,大多数的微服务间的通信中,我们多数会选择基于tcp的rpc协议。所以选择一个合适的协议很重要。

​  这篇文章会分享一些我觉得跟我们开发有直接关联的一些知识。文章内容分为两分部。

​  第一部分是 简单理解 TCP/IP 四层模型

​  第二部分是 网络包在公网上是怎么传输的



简单理解TCP/IP四层模型

 下面是我用wireshark监听我本地电脑网卡截的一幅图,我们就以这幅图为例,来描述一下TCP/IP四层模型
在这里插入图片描述




我们来简单看看上面数据包的意思:

 1 先建立连接

 2 发送和响应post请求

 3 最后断开连接



我们再来从warkshark数据包看网络分层:

在这里插入图片描述



 1 物理层(Frame):物理层的数据帧概况。


 2 数据链路层(Ethernet ll):以太网头部的信息,一般是记录相邻两个设备的MAC。

 3 网络层( Internet Protocol Version 4):在这个包中,本层的主要任务是把TCP层传下来的数据加上目标地址和源地址。有了目标地址,数据才可能送达接收方;而有了源地址,接收方才知道发送方是谁。

 4 传输层(Transmission Control Protocol):这一层用到了TCP协议。应用层所产生的数据就是由TCP来控制传输的。点开TCP层前的 “+”号,我们可以看到Seq号和Ack号等一系列信息,它们用于网络包的排序,重传,流量控制等。

 5 应用层(Hypertext Transfer Protocol):此处是HTTP协议

 在上面的例子中,我们可以看到网络分层就像是有序的分工。每一层都有自己的责任范围,上层协议完成工作后就交给下一层,最终形成一个完整的网络包。



生活中的例子:

​  我们一起来看一个寄信的场景,这个过程和网络包在网络上传输是极为相似的。

​  1 首先寄件人写好信,放入到信封,并填写收件人信息,如收件人姓名,地址等。这个过程就好比我们在应用层加上Data数据(信的内容),传输层加上端口(收件人姓名),网络层加上IP那样(收件人地址)。

 ​ 2 然后邮递员过来手信,检查内容没问题后,就会用相应的交通工具送往目的地(这个过程对应数据链路层和物理层)。

在这里插入图片描述



浏览器访问网站的通信过程

 ​ 这部分内容,是同步至我之前写的一篇文章,为了方便大家观看,我将他复制到这部分内容来。

 ​ 当浏览器访问一个网站时,浏览器会使用DNS协议去查找他具体的地址。知道了目标地址,浏览器就开始打包它的请求。对于普通的浏览请求,往往会使用HTTP协议;DNS,HTTP,HTTPS所在的层我们称为应用层。

​  经过应用层封装后,浏览器会将应用层的包交给下一层去完成,通过socket编程来实现,我们称为传输层。传输层有两种协议,一种是无连接的协议UDP,一种是面向连接的协议TCP。TCP协议里面会有两个端口,一个是浏览器监听的端口,一个是电商的服务器监听的端口。操作系统往往通过端口来判断,它得到的包应该给哪个进程

​  传输层封装完毕后,浏览器会将包交给操作系统的网络层。网络层的协议是IP协议。在IP协议里面会有源IP地址,即浏览器所在机器的IP地址和目标IP地址,也即电商网站所在服务器的IP地址

客户端电脑MAC:192.168.1.101的MAC 网关的MAC:192.168.1.1的MACMAC头
客户端电脑IP: 192.168.1.101 网站服务器IP:106.114.138.24IP头
浏览器端口 : 123456 网站应用端口:443TCP头
POST.URL,HTTP1.1 正文格式jsonHTTP头



客户端:

 ​ 操作系统既然知道了目标IP地址,就开始想如何根据这个门牌号找到目标机器。操作系统会判断,这个目标IP地址是不是本地人。如果是外地人就要去网关。而操作系统启动的时候,就会被DHCP协议配置IP地址,以及默认的网关IP地址192.168.1.1
 ​ 操作系统通过ARP广播协议,获取到网关的MAC地址,于是操作系统将IP包交给MAC层,将客户端电脑MAC,网关的MAC打包进去。网卡再将包发出去。由于这个包里面有MAC地址,因而它能够到达网关。


链路设备 :

 ​ 网关收到包之后,会根据自己的知识,判断下一步应该怎么走。网关往往是一个路由器,到某个IP地址应该怎么走,这个叫作路由表

 ​ 如果 用 的 是 家用 路由器,当我们 家里的包发出去 的 时候,源地址 都被家用 路由器NAT成为了 运营商地址

 ​ 路由器有点像玄奘西行路过的一个个国家的一个个城关。每个城关都连着两个国家,每个国家相当于一个局域网,在每个国家内部,都可以使用本地的地址MAC进行通信。城关与城关之间是一个国家,当网络包知道了下一步去哪个城关,还是要使用国家内部的MAC地址,通过下一个城关的MAC地址,找到下一个城关,然后再问下一步的路怎么走,一直到走出最后一个城关

 ​ 最后一个城关知道这个网络包要去的地方。就会使用ARP协议找到目标服务器的MAC地址。通过这个MAC地址就能找到目标服务器


服务器端:

 ​ 目标服务器发现MAC地址对上了,取下MAC头来,发送给操作系统的网络层。发现IP也对上了,就取下IP头。IP头里会写上一层封装的是TCP协议,然后将其交给传输层,即TCP层

 ​ 当网络包平安到达TCP层之后,TCP头中有目标端口号,通过这个端口号,可以找到网站的进程正在监听这个端口号,假设是一个tomcat,将这个包发给电商网站


该过程 的 数据包 封装 过程 如 下图




1 当到达了目标机器所在的网关时,网管会使用Arp协议发送广播来得到目标机器的mac地址。但是如果在这之前目标的IP地址就已经改变了,那会不会就有问题了

 ​ 对于IP层来讲,当包达到最后一跳的时候,原来的IP不存在了。比如网线拔掉了,或者服务器直接宕机了,则ARP就找不到了,所以这个包就会发送失败了。对于IP层的工作就结束了


 ​ 但是IP层之上还有TCP层,TCP会重试的,包还是会重新发送,但是如果服务器没有启动起来,超过一定的次数,最终放弃


 ​ 如果服务器重启了,IP还是原来的IP地址,这个时候TCP重新发送的一个包的时候,ARP是能够得到这个地址的,因而会发到这台机器上来,但是机器上面没有启动服务端监听那个端口,于是会发送ICMP端口不可达


 ​ 如果服务器重启了,服务端也重新启动了,也在监听那个端口了,这个时候TCP的服务端由于是新的,sequence number 根本对不上,说明不是原来的连接,会发送RST


 ​ 但是有一个 非常特殊的方式,就是虚拟机的热迁移,从一台物理机迁移到另外一个物理机,IP不变,MAC不变,内存也拷贝过去,sequence number 在内存里面也保持住了,在迁移的过程中会丢失一两个包,但是从TCP来看,最终还是能够连接成功的


2 IP地址和MAC地址的关系

 ​ IP 是有远程定位功能的,MAC是没有远程定位功能的,只能通过本地ARP的方式找到。IP和设备并不总是对应的,这对通信就产生了问题,但是MAC地址不同,MAC地址和设备起码在一个局域网内是唯一的。所以局域网使用MAC地址通信没有问题


3 MAC地址可以修改吗

  MAC地址,也叫硬件地址,长度是48比特,由16进制的数字组成,分为前24位和后24位。

​  前24位叫作组织唯一标志符,是由 IEEE的注册管理机构给不同厂家分配的代码,用于区分不同厂家。后24位时厂家自己分配 的,称为扩展标识符。同一个厂家产生的网卡中MAC地址后24位是不同的

​  也就是说,MAC本来设计为唯一性的,但是后来的设备越来越多,而且还有虚拟化的设备和网卡,有很多工具可以修改,就很难保证不冲突了。但是至少应该保持一个局域网内是唯一的

​  MAC的设计,使得即便不能保证绝对唯一,但是能保证一个局域网内出现冲突的概率很小。这样,一台机器启动的时候,就能够在没有IP地址的情况下,先用MAC地址进行通信,获得IP地址

 ​ 好在MAC地址是工作在一个局域网中的,因而即便出现了冲突,网络工程师也能够在自己的范围内很快定位并解决这个问题。这就像我们生成的UUID或者哈希值,大部分情况下是不会冲突的,但是如果碰巧出现冲突了,采取一定的机制解决冲突就好


4 当网络包到达一个城关的时候,可以通过路由表得到下一个城关的IP地址,直接通过IP地址找就可以了,为什么还要通过本地的MAC地址

 ​ 在网络包里,有源IP地址和目标IP地址,源MAC地址和目标MAC地址。从路由表中取得下一跳的的IP地址后,应该把这个地址放在哪里呢?如果放在目标IP地址里面,到了城关,谁知道最终的目标在哪里呢?所以要用MAC地址所谓的下一跳,看起来是IP地址,其实是通过ARP得到MAC地址,将下一跳的MAC地址放在目标MAC地址里面


5 为什么需要MAC地址

​  之所以需要MAC地址,是因为网络中用于连接各个设备的交换机使用了内容寻址寄存器(CAM). 这个表列出了它在每一个端口的所有连接设备的MAC地址。当交换机收到了一个指向特定MAC地址的流量,它会使用这个表,来确定应该使用哪一个端口发送流量。如果目标的MAC地址是未知的,这个传输设备会首先在它的缓存中查找这个地址,如果没有找到,那么这个地址就需要在网络上额外的通信来进行解析了


参考资源:

 wireshark网络分析

 极客时间 趣谈网络分析

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值