重庆免费注册推广网站,无锡公司做网站,做网站的windowlcd,重庆建设工程安全协会网站复杂的程序都要分层#xff0c;这是程序设计的要求。比如#xff0c;复杂的电商还会分数据库层、缓存层、Compose 层、Controller 层和接入层#xff0c;每一层专注做本层的事情。 当一个网络包从一个网口经过的时候#xff0c;你看到了#xff0c;首先先看看要不要请进来…复杂的程序都要分层这是程序设计的要求。比如复杂的电商还会分数据库层、缓存层、Compose 层、Controller 层和接入层每一层专注做本层的事情。 当一个网络包从一个网口经过的时候你看到了首先先看看要不要请进来处理一把。有的网口配置了混杂模式凡是经过的全部拿进来。
拿进来以后就要交给一段程序来处理。于是你调用 process_layer2(buffer)。当然这是一个假的函数。但是你明白其中的意思知道肯定是有这么个函数的。那这个函数是干什么的呢从 Buffer 中摘掉二层的头看一看应该根据头里面的内容做什么操作。
假设你发现这个包的 MAC 地址和你的相符那说明就是发给你的于是需要调用 process_layer3(buffer)。这个时候Buffer 里面往往就没有二层的头了因为已经在上一个函数的处理过程中拿掉了或者将开始的偏移量移动了一下。在这个函数里面摘掉三层的头看看到底是发送给自己的还是希望自己转发出去的。
如何判断呢如果 IP 地址不是自己的那就应该转发出去如果 IP 地址是自己的那就是发给自己的。根据 IP 头里面的标示拿掉三层的头进行下一层的处理到底是调用 process_tcp(buffer) 呢还是调用 process_udp(buffer) 呢
假设这个地址是 TCP 的则会调用 process_tcp(buffer)。这时候Buffer 里面没有三层的头就需要查看四层的头看这是一个发起还是一个应答又或者是一个正常的数据包然后分别由不同的逻辑进行处理。如果是发起或者应答接下来可能要发送一个回复包如果是一个正常的数据包就需要交给上层了。交给谁呢是不是有 process_http(buffer) 函数呢
没有的如果你是一个网络包处理程序你不需要有 process_http(buffer)而是应该交给应用去处理。交给哪个应用呢在四层的头里面有端口号不同的应用监听不同的端口号。如果发现浏览器应用在监听这个端口那你发给浏览器就行了。至于浏览器怎么处理和你没有关系。
浏览器自然是解析 HTML显示出页面来。电脑的主人看到页面很开心就点了鼠标。点击鼠标的动作被浏览器捕获。浏览器知道又要发起另一个 HTTP 请求了于是使用端口号将请求发给了你。
你应该调用 send_tcp(buffer)。不用说Buffer 里面就是 HTTP 请求的内容。这个函数里面加一个 TCP 的头记录下源端口号。浏览器会给你目的端口号一般为 80 端口。
然后调用 send_layer3(buffer)。Buffer 里面已经有了 HTTP 的头和内容以及 TCP 的头。在这个函数里面加一个 IP 的头记录下源 IP 的地址和目标 IP 的地址。
然后调用 send_layer2(buffer)。Buffer 里面已经有了 HTTP 的头和内容、TCP 的头以及 IP 的头。这个函数里面要加一下 MAC 的头记录下源 MAC 地址得到的就是本机器的 MAC 地址和目标的 MAC 地址。不过这个还要看当前知道不知道知道就直接加上不知道的话就要通过一定的协议处理过程找到 MAC 地址。反正要填一个不能空着。
万事俱备只要 Buffer 里面的内容完整就可以从网口发出去了你作为一个程序的任务就算告一段落了。
只要是在网络上跑的包都是完整的。可以有下层没上层绝对不可能有上层没下层。所以对 TCP 协议来说三次握手也好重试也好只要想发出去包就要有 IP 层和 MAC 层不然是发不出去的。
什么叫二层设备呀就是只把 MAC 头摘下来看看到底是丢弃、转发还是自己留着。那什么叫三层设备呢就是把 MAC 头摘下来之后再把 IP 头摘下来看看到底是丢弃、转发还是自己留着。 此文章为9月Day2学习笔记内容来源于极客时间《趣谈网络协议》推荐该课程。