全网最详解计算机网络协议——通信协议综述( 三 )


当然网络包的格式很复杂 , 这个程序也很复杂 , 复杂的程序都要分层 , 这是程序设计的要求 。
2.2 浏览点击请求过程
浏览点击请求过程如下所示:

全网最详解计算机网络协议——通信协议综述

文章插图
 

全网最详解计算机网络协议——通信协议综述

文章插图
 
假设你发现这个包的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地址 。反正要填一个 , 不能空着;
2.3 揭秘层与层之间的关系
现实生活中 , 往往是员工说一句 , 组长补充两句 , 然后经理补充两句 , 最后总经理再补充两句 。但是在网络世界 , 应该是总经理说话 , 经理补充两句 , 组长补充两句 , 员工再补充两句 。
TCP在三次握手时 , TCP每一个消息都会带着IP层和MAC层 。因为 , TCP每次发送一个消息 , IP层和MAC层的所有机制都要重新运行一次 , 所以TCP在三次握手时 , IP和MAC也运行了好久 。
只要是在网络上跑的包 , 都是完整的 。可以有下层没上层 , 绝对不可能有上层没下层;如果一个HTTP协议的包跑在网络上 , 它一定是完整的 。无论这个包经过哪些设备 , 它都是完整的 。所谓的二层设备、三层设备只是跑在设备上的程序不同;
二层设备:只把MAC头摘下来 , 看看到底是丢弃、转发 , 还是自己留着;
三层设备:把MAC头摘下来之后 , 再把IP头摘下来 , 看看到底是丢弃、转发 , 还是自己留着;
三、ifconfig 命令行的由来
ifconfig是linux系统中查询ip地址的一个命令 , windows是ipconfig;
3.1 ip地址
IP地址是一个网卡在网络世界的通讯地址 , 相当于我们现实世界的门牌号 。


推荐阅读