• 【网络是怎么连接的】第二章(中):一个网络包的发出


    1. 关于网络包的基本知识

    一个网络包是由头部和数据两部分组成的。头部里放着目的地址等控制信息,数据则就是我们要传送的东西。如图所示
    在这里插入图片描述
    控制信息(头部)用来在传输过程中告诉转发设备们,我要去往哪里。这就类似于快递包裹上的快递单一样。

    2. 网络包传输的过程

    对于一个TCP/IP协议产生的网络包,结构也是如此,具体长这样在这里插入图片描述

    其中TCP头部我们在上一节讲过了,是由协议栈中的TCP模块加上去的。图中的IP头部和MAC头部则是由TCP下层的IP协议模块加上去的。

    IP协议在在添加头部的过程中,会将要访问的服务器的IP地址写入IP头部中,这样IP协议(路由器)就可以根据这个知道包的传输方向;IP协议也会将下一个路由器的以太网地址(MAC地址)写入MAC头部中,这样以太网协议(集线器)也就知道要把包发到哪个路由器上了。

    网络中的转发设备有路由器和集线器这两种,路由器是按照IP协议传输包的设备,集线器是按照以太网协议传输包的设备。路由器会根据目标地址判断下一个路由器的位置,集线器则会在子网中将网络包传输到下一个路由。

    所以网络包传输的大致过程就是,包往MAC头部记载的路由器地址方向传输,到达目标路由器后,由路由器查看IP头部,对照子自己的IP表修改MAC头部中下一个路由器的地址然后将包转发出去。而集线器则通过查看MAC头部,对照自己的以太网表,将包往目标路由器传输。如此反复,直到到达最终目标服务器。

    在这里插入图片描述

    3. IP头部

    IP头部的格式长这样

    在这里插入图片描述

    其中IP模块最重要的就是接收方的IP地址,这个地址由TCP模块告知IP模块,而TCP模块又是由应用程序告知的IP地址。

    除此之外,还有发送方的IP地址需要填写在IP头部。对于多网卡计算机来说,IP模块需要查一下路由表,看看目标IP地址对应哪个网卡,将那个网卡的IP地址填写上去就好了。路由器里也有这张表格,原理和这里一样。

    路由表可以用route print命令来查看,如图

    在这里插入图片描述

    图中第一列Network Destination就是目的IP地址对应的表,最后一列Interface为当前计算机所对应的网卡的IP地址。IP头部的接受方和发送方就填这俩就行。如果目的地址IP没有匹配到,默认使用第一行10.10.1.16所在的网卡发送数据。

    顺带一提,Gateway表示下一个路由器的IP地址,将包发给这个IP,该地址对应的路由器就会将包转发到目标地址。MAC头部里会将Gateway的IP地址转成到对应的MAC地址存在里边。

    4. MAC头部

    MAC头部长这样
    在这里插入图片描述

    可以看出IP模块生成MAC头部的时候,要填写发送方的MAC地址和接收方的MAC地址。

    发送方MAC地址还好办,直接查发送的那个网卡的ROM就知道了。接收方的IP地址就有点棘手了。

    IP模块会根据路由表中的Gateway那一列的内容判断将包发给哪个转发路由器,发给谁就要找到这个IP地址对应的MAC地址。

    那这个MAC地址谁知道呢?肯定是目标路由器才会知道自己的MAC地址是多少呀。所以我们需要广播一次,向同一以太网的所有设备都发一个包,这个包就是问“XXX.XXX.XX.XX这个IP地址是谁的?告诉我你的MAC地址”,然后目标路由器就会回答说“嗷,这是我的IP,我的MAC地址是……”然后IP模块收到了这个MAC地址,将这个地址填写到MAC模块中。大功告成。

    这个广播的方法就是ARP,Address Resolution Protocol,地址解析协议。

    当然不可能每次发包都得广播一遍,那不得累死,计算机在查询后会保存一个表叫做ARP缓存表,类似于DNS解析的缓存表,用于更快地查询到MAC地址。
    想看这个表,输入arp -a。

    在这里插入图片描述
    至此,IP模块已经完成了它的包封装任务,现在是时候将数据交给网卡了。

    5. 网卡所做的工作

    网卡将协议栈处理好的数据包从内存复制到自己的网卡内缓冲区中,然后向网卡内部的MAC模块发送发送包的命令,然后MAC模块就要开始工作了。

    MAC模块会将包的开头加上报头和起始帧分节符,然后在末尾加上用于检测错误的FCS(桢校验序列),加上后,网络包如图

    在这里插入图片描述

    报头里是用于同步波形的时钟,有了它,接收方才知道如何正确读取接下来的数据。而起始帧分节符则用于提醒接收方,这里之后就是数据本体了,你要注意接收。大致内容如图,意会即可
    在这里插入图片描述

    结尾的FCS是用来检查包传输过程中数据有没有损坏的,FCS里边有一个很复杂的公式,类似于CRC错误校验。如果数据包有出错,计算出来的东西就会不一样。这样接收方就可以判断传输的数据有没有错误。

    加完这些头部后,MAC模块就将数据包转换成通用电信号,然后由PHY(MAU)模块转换成可在网线中传输的形式,然后通过网线发出去。至此,一个网络包终于发出去了。

  • 相关阅读:
    【java学习—九】面向对象内容总结(8)
    「驱动安装」HighPoint RocketRAID R2722 磁盘阵列卡 驱动安装教程
    【angular】实现简单的angular国际化(i18n)
    QProgressDialog自动弹出的问题
    7-4 BCD解密 (10分)
    通过宏定义解决编程难题
    交易履约之结算平台实践 | 京东云技术团队
    C++使用高斯模糊处理图像
    (附源码)app校园购物网站 毕业设计 041037
    黑马-Jenkins篇
  • 原文地址:https://blog.csdn.net/Currybeefer/article/details/125457648