| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 【网络是怎么连接的】第二章(中):一个网络包的发出 -> 正文阅读 |
|
[系统运维]【网络是怎么连接的】第二章(中):一个网络包的发出 |
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地址。
5. 网卡所做的工作 网卡将协议栈处理好的数据包从内存复制到自己的网卡内缓冲区中,然后向网卡内部的MAC模块发送发送包的命令,然后MAC模块就要开始工作了。 MAC模块会将包的开头加上报头和起始帧分节符,然后在末尾加上用于检测错误的FCS(桢校验序列),加上后,网络包如图 报头里是用于同步波形的时钟,有了它,接收方才知道如何正确读取接下来的数据。而起始帧分节符则用于提醒接收方,这里之后就是数据本体了,你要注意接收。大致内容如图,意会即可 结尾的FCS是用来检查包传输过程中数据有没有损坏的,FCS里边有一个很复杂的公式,类似于CRC错误校验。如果数据包有出错,计算出来的东西就会不一样。这样接收方就可以判断传输的数据有没有错误。 加完这些头部后,MAC模块就将数据包转换成通用电信号,然后由PHY(MAU)模块转换成可在网线中传输的形式,然后通过网线发出去。至此,一个网络包终于发出去了。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 11:35:41- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |