为什么要对网络进行分层,为什么要有什么二层设备,三层设备,四层LB和七层LB,对这些所谓的层,其对应的协议和其的工作是什么?

对于分层中,不同的沟通和不同的层次工作的时候,其各自都在做什么呢?

假设一个网络对应着一家公司,一个公司可以分为总经理,经理,组长,员工,总经理之间具有对应的沟通方式,经理之间也有,员工也有

那么,在经理沟通的时候,员工在做什么,对应着,TCP三次握手的时候,IP和MAC都在做些什么?

第三层就是IP协议层,其中包含着目标地址和源地址,第三层还会学习路由协议,路由就像是中转站,可以从地址A到地址D,中间经过两个中转站 A > B > C > D

那么这个 A > D 的路径是怎么知道呢?

也就是在此过程中 A到B,B怎么把C的地址放进去的呢?

那么,还有就是第二层中,对应着是MAC层,那么我发送一个在第七层工作的包,也就是HTTP的包,那么需不需要经过二层设备,二层设备中处理的包,有没有HTTP层的内容呢?

就是对于一个综合的问题,我们去打开一个电商的网站,需要经过哪些的过程呢?

接下来我们会讲解这三个问题

1,为什么要分层,因为不分层,就显得网络处理过度的复杂了

我们可以理解网络包就是一段Buffer,或者一段内存,是由格式,想象自己是处理网络包的程序,这个程序可以跑在电脑上,跑在服务器上,跑在交换机上,跑在路由器上,想想自己有很多的网口,每个网口都可以拿进来网络包,让自己的程序处理一下,然后从别的网口发送出去

我们简化一下我们这个程序的处理过程

图片

当一个网络包经过了一个网口的时候,我们需要判断是不是要进来处理的,当然,有的网口配置导致了其只要是经过的,都会进来处理

拿进来了之后,要进行对应的处理,首先是我们的process_layer2,去处理第二层,也就是Mac层,这个过程中,如果这个时候处理发现这个包的Mac地址和自己的相符,就说明是发给自己的,直接调用下一层,process_layer3(buffer)这时候第二层的头已经被拿掉了,只有第三层了,然后判断ip地址是不是自己的,如果是自己的,继续下一步,不是的话,转发出去,

是自己的话,调用下一层,是调用process_tcp(buffer)呢?还是调用process_udp(buffer)呢?

假设这个地址是TCP的,会调用process_tcp(buffer),这个时候,已经没有三层的头,就需要看四层的头,看是发起,还是应答,还是一个简简单单的数据包,然后不同的处理,接下来这个流程就走完了

下面也没有process_http(buffer)了,因为在第四层中,会包含着端口号,不同的应用监听着不同的端口号,如果发现了有应用监听这个端口号,那么直接发给这个端口让对应应用处理就可以了

这样的一套流程走完,那么显式页面的工作就昨晚了,用户当然看到了页面,皆大欢喜,然后点击搜索了商品,调用了一个Http请求,调用了send_tcp(buffer),buffer其中就是请求的内容,这个函数中应该加一个TCP的头,记录一个源端口和目的端口,

然后走到send_layer3(buffer),在HTTP头的基础上,加上了IP头,记录了源IP和目的IP

然后走到send_layer2(buffer),Buffer中已经有了HTTP头和内容,TCP的头以及IP头,这里面加上了MAC的头,记录了源MAC地址,得到了本机器的MAC地址和目标的MAC地址

如果不知道目标的MAC地址,也需要通过一些协议处理后,找到MAC地址,必须填一个

2.对于层之间工作关系,依赖

首先是分层的比喻,在网络世界,往往和现实世界不一致,网络世界中,总经理会被经理随身带着,经理会被组长随身带着,组长会被员工随身带着,而且往往总经理讲话,经理补充两句,组长讲话,员工补充两句

所以TCP三次握手,每一次的握手发送的消息,都会让IP层和MAC层走一遍,

总结下,

所有的网络通信都是分层的,可以有下层没有上层,但不能没有下层只有上层

那么值钱说的,为什么有了IP协议,还需要MAC地址呢?说到底还是因为整个协议的分层和上下层的依赖关系,一个网络的通信,必然先走二层设备,在其中会摘下来MAC头,然后看看是丢弃还是转发

本章总结

1.对于网络协议的理解,我们需要想象自己是一个处理网络包的程序,如何去拿到的包,如何去处理的,如何发了出去

2.对于网络层中的发送,必须是完整的,可以有下层没上层,但不可以没下层有上层

课后思考

1.对于总经理和员工的不恰当比喻,有更好的吗

2.如何查看IP协议呢?

1.通信协议就像没有天桥的双子楼,要从A座的24层到达B座24层就得先下楼梯再上楼梯,其他协议也是如此,比如4G

1.我觉得用快递去描述更加方便,可以有小哥,但没包裹,但只有包裹没有小哥,是没办法发送的

图片

2.去使用ipconfig或者ifconfig吧

3.为什么要分层

其实这是一个架构的通用问题,不仅仅是网络协议的问题,因为对于软件需求的变动,我们通常都会使用分层来解决问题

我们将所有的代码放在一起的话,会导致一点的修改而动全身,于是我们抽离了代码,放在基础服务层,API层只能调用基础服务层的api,不能访问数据库

不同的层级做不同的事情,同样,不同的层级的处理,交给了不同设备去做

比如应用层,交给计算机来处理,网络层交给路由器来处理

4.层级之间的调用是什么样的

其实在网络协议的调用汇总

下层的协议是知道上层协议的,在每一层的包头里面,都说明了上一层有着说明协议,所以在传递的时候,并非回调函数,而是直接找对应的处理函数处理

比如一个UDP发送

首先是发送UDP的函数

int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4)

然后UDP调用IP

int ip_send_skb(struct net *net, struct sk_buff *skb)

然后进行ARP查找MAC层,获取MAC地址

int neigh_output(struct neighbour *n, struct sk_buff *skb)

接受的时候也是如此

统一调用如下的函数

int netif_receive_skb(struct sk_buff *skb)

然后根据IP或者ARP,调用不同的函数,如果是IP就是这里的函数

int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)

然后路由判断

int ip_local_deliver(struct sk_buff *skb)

然后根据IP头的协议,选择性TCP或者UDP

int udp_rcv(struct sk_buff *skb)

5.什么时候只有下层没上层?

比如ping,就是一个没有传输层的协议,直接使用ICMP的协议

发表评论

邮箱地址不会被公开。 必填项已用*标注