网络协议复习笔记(二)网络为什么要分层

想象自己是一个处理网络包的程序,而且这个程序可以跑在电脑上,可以跑在服务器上,可以跑在交换机上,也可以跑在路由器上。想象自己有很多网口,从某个口拿进一个网络包,自己处理下再从另一个网口发送出去。

因为程序会非常复杂,所以复杂的程序需要分层,这是程序设计的要求。

网络协议复习笔记(二)网络为什么要分层

当一个网络包从一个网口经过时,你首先看看要不要请进来处理一把。

precess_layer2(buffer)这个函数摘掉二层的头,看看头里面的内容。如果MAC地址相符,就说明是发给你的,就继续调用precess_layer3(buffer)。现在又摘掉三层的头,看看IP,如果IP不是自己的,就应该转发出去。

发现是自己的之后。接下来选择调用process_tcp(buffer)还是process_udp(buffer)。假设地址是TCP的,就会调用process_tcp(buffer)。这时候就摘掉四层的头,看是一个发起还是一个应答,又或是一个正常的数据包。然后由不同逻辑进行处理。如果是发起或应答,接下来可能要发送一个回复包。如果是正常的数据包,就交给上层。

如果你是一个网络包处理程序,不需要有process_http(buffer),而是应该交给应用去处理。在四层的头里有端口号,不同的应用监听不同的端口号。如果发现浏览器应用在监听这个端口,那你就发给浏览器。浏览器怎么处理,和你没有关系。

浏览器解析HTML,显示出页面。电脑主人看到页面后进行点击,动作被浏览器捕获,浏览器又要发送下一个HTTP请求了。于是使用端口号,将请求发给你。

你调用send_tcp(buffer)。buffer里已经有HTTP头和内容。这个函数里面会加一个TCP头,记录下源端口号。浏览器会给你目的端口号,一般为80端口。

然后你调用send_layer3(buffer)。在这里加入一个IP头。记录下源IP地址和目标IP地址。

然后send_layer2(buffer)。这个函数里面要加一下MAC的头,记录下源MAC地址。得到的就是本机器的MAC地址和目标MAC地址。如果不知道的话,就通过一定的协议处理过程,找到MAC地址。反正不能空着。

好了buffer的内容完整了,就可以从网口发出去了。作为一个程序的任务就结束了。

TCP在三次握手的时候,也会带上IP层和MAC层,因为TCP每发送一个信息,IP层和MAC层的所有机制都要运行一遍。

只要是在网络上跑的包,可以有下层没上层,绝不可能有上层没下层。

对TCP协议来说,三次握手也好,重试也好,只要想发出去包,就要有IP层和MAC层,不然发不出去。

所以如果一个HTTP协议的包跑在网络上,一定是完整的。无论经过哪些设备,都是完整的。

二层设备就是把MAC头摘下来,看看到底是丢弃还是转发,还是自己留着。三层设备就是,把MAC头摘下来后,再把IP头摘下来,看看到底是丢弃转发还是自己留着。