当前位置:网站首页>【网络是怎么连接的】第二章(中):一个网络包的发出
【网络是怎么连接的】第二章(中):一个网络包的发出
2022-06-26 12:37:00 【Currybeefer】
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)模块转换成可在网线中传输的形式,然后通过网线发出去。至此,一个网络包终于发出去了。
边栏推荐
- Iframe usage and contentwindow, parent and PostMessage communication methods
- TP5 thinkphp5 report serialization of'closure'is not allowed
- Websocket and socket IO case practice
- Microservice governance (nocas)
- Tiger DAO VC产品正式上线,Seektiger生态的有力补充
- Laravel uses find_ IN_ The set() native MySQL statement accurately queries whether a special string exists in the specified string to solve the problem that like cannot be accurately matched. (resolve
- guacamole安装
- 由错误<note: candidate expects 1 argument, 0 provided>引发的思考
- PHP unit conversion
- Operation analysis and investment prospect research report of China's organic chemical raw material manufacturing industry 2022-2028
猜你喜欢

深度解析当贝盒子B3、腾讯极光5S、小米盒子4S之间的区别

Spark-day03-core programming RDD operator

不到40行代码手撸一个BlocProvider

Configuring Apache digest authentication

Laravel+gatewayworker completes the im instant messaging and file transfer functions (Chapter 4: server debugging errors)

Comparison of latest mobile phone processors in 2020 (with mobile phone CPU ladder diagram)

手把手带你学会Odoo OWL组件开发(7):OWL项目实战使用

Scala-day06- pattern matching - Generic

Examples of how laravel uses with preload (eager to load) and nested query
![[esp32-C3][RT-THREAD] 基于ESP32C3运行RT-THREAD bsp最小系统](/img/4a/503240b332e3279047c438f1d9845e.png)
[esp32-C3][RT-THREAD] 基于ESP32C3运行RT-THREAD bsp最小系统
随机推荐
EasyGBS如何解决对讲功能使用异常?
PHP unit conversion
PHP returns false when calling redis method decrby less than 0
PHP generate order number
国标GB28181协议EasyGBS级联宇视平台,保活消息出现403该如何处理?
nvm安装教程
Learning directory
KITTI Detection dataset whose format is letf_top_right_bottom to JDE normalied xc_yc_w_h
Redis learning - 05 node JS client operation redis and pipeline pipeline
power designer - 自定义注释按钮
Tiger DAO VC产品正式上线,Seektiger生态的有力补充
2022 edition of China's energy and chemical industry market in-depth investigation and investment feasibility analysis report
班主任让开股票账户,在挖财理财开户安全吗?
Wechat applet wx Request request encapsulation
Installing MySQL under Linux (RPM package installation)
New routing file in laravel framework
老司机总结的12条 SQL 优化方案(非常实用)
详细实操分享,下班刷了两小时的搞笑视频,一个月收益7000多
SQL injection in Pikachu shooting range
guacamole安装