网络是一个 复杂的程序,分层是必须的!
计算机网络:想象网络包是一个buffer或者一块内存,是有格式的。它可以运行在本地客户端,运行在交换机,运行在路由器或者运行在服务器。而你是处理该buffer的程序。从某个网口拿出,然后由另一个网口发出。
我们可以把处理网络包的过程看成是一个函数,尽管并非是上图描述的函数!
当网络包经过二层的时候,process_layer2会拆下MAC头,查看里面的MAC是不是自己,如果是则接受该网络包,并将剩下的buffer传递给下一层(三层)
当网络包经过三层的时候,process_layer3会拆下IP头,查看里面的IP是不是自己的,如果是则接受该网络包,并将剩下的buffer传递给下一层(四层/TCP层)
当网络包经过四层的时候,那么到底是使用process_tcp还是process_udp呢,是由地址决定的。这个包是发送还是应答呢,又或者是一个正常的数据包。如果是前者这时候,就需要回复一个包信息,否则,直接将其交给应用层。这时候需要process_http吗?
答案是:不需要。因为应用层的处理过程是不是这个网络包的程序负责的,是由浏览器处理的。至于发给哪个应用,这是由四层里面的端口号决定的,然后直接发给它就OK。浏览器肯定会解析html,返回一个页面。
如果你点击了鼠标,这个时候,浏览器又发起了一个请求。
这个时候,你需要调用send_tcp函数,在原先包上加上端口号,发送给三层;
三层接收到后,调用send_layer3函数,加上ip信息,发送给二层;
二层接收到后,调用seng_layer2函数,加上MAC信息,组成完整的buffer,这时候就可以从网口发出了。
以上就是一个网络包从某个网口进,然后从某个网口出的“程序”。
层与层之间的关系:
TCP三层握手的时候,IP层与MAC层实际也是有动作的。因为它们肯定是存在的。
只要在网络上跑的包,可以下层没有上层,但是不能有上层没下层。
问题1:既然我都知道了它的那台机器的IP地址了,为什么还需要目标的MAC信息。
那是因为没有MAC信息,这个包是没办法发出去。
所谓的二层设备、三层设备,都是在网络上跑的程序不一样罢了。
一个HTTP协议,经过二层设备的时候,二层设备收到的包包含:HTTP/TCP/IP/MAC。二层设备将MAC头拆下来的网络包,发给三层设备,三层设备收到包包含:HTTP/TCP/IP,三层设备将IP头拆下来,看到底是丢弃、转发还是保留。
理解网络协议的工作模式:始终想象自己是一个处理网络包的程序,从网口拿到网络包后,根据规则对包进行处理,然后再将其从另一个网口发出去。