目录
直接进入主题,用户态和内核态其实都是一个大类,只是作为抽象概念大体介绍一下两台主机在网络上的连接。
先看图:

在这里明确一个概念,用户态也好,内核态也好都只是内存的不同区域
我们从一台主机的用户态的某个进程A出发,把内存的数据复制给本机的内核态,然后通过网卡,将数字信号转化为物理信号,经过光纤,再通过另一台主机的网卡把物理信号转化为数字信号,一步步到达进程B。

简单来说,三个步骤:
1.将数据装入网卡:数据复制
2.扣动扳机发射数据:fire();
3.发送就要进行数据信号到物理信号的转变

首先,这样传播有可能出现信号衰退和信号差错的问题。
当我们的数据从网线到达另一张网卡时,网卡需要将数据传递到另一台主机的CPU中,此时我们则需要采取CPU中断操作:
首先让CPU停止当前循环去执行一段代码,这个过程叫做中断处理流程
然后,再将数据从网卡对应的位置复制到内核态的内存。

这里说的是TCP/IP 5层协议
完成数据通信其实是一个非常复杂的过程,所以为了解决这个复杂的问题,最好的方式就是分层进行,各司其职,完成自己对应的任务,然后交给下一层来处理。
现在我用一张图来简单表示一下两个进程间的通信:

那么每一层的具体作用到底是什么捏?
硬件角度保证数据转换/网络介质的传播
在同一个LAN(局域网) 中 ,一台主机的任意进程 —— 另一台主机的任意进程间的通信
在实现数据路由的功能基础上,跨LAN的主机到主机的通信。
实现主机上任意进程 —— 另一台主机任意进程的通信 , 每一台主机都可以相互通信
实现应用自己的业务问题(具体协议取决于业务要求)
LAN内部就是带有一定拓扑的局域网,两台主机之间的连接。

那么拓扑如何进行传递呢,这个时候就需要用到集线器进行组网。
集线器有两个特点:
1.可以有效解决网络拓扑中的数据传递问题
2.工作在物理层(复制数据,信号放大)

如上图所示,所有主机都在用同一条线路(信道),但是信道的信号承载量可不是无限的,所以当信号过多时,信号就会在信道发生冲突。
当我们使用集线器进行组网,那么就会处于一个冲突域中,这是由集线器的工作原理所导致的
交给数据链路层的冲突避免算法,例如:发现冲突就静默一段时间再发送
但这样还是无法很好地解决冲突问题。
解决冲突域问题的根本在于:
1.冲突域的主机不能太多
2.尽量减少冲突域的出现
因此,我们引出交换机的概念来减少冲突域
交换机工作在数据链路层,通过解析数据链路层放入的目标地址,决定把数据直接传递给谁
也就是说,我们只根据数据的目标地址,把数据发送给对应的目标,所以我们也可以通过交换机组建局域网。

交换机可以把冲突域划分起来,甚至可以让一个主机自己一个冲突域,那自然永远不会发生冲突。
MAC地址(物理地址)是数据链路层的地址,有48位,通常为12个16进制数,全世界网卡的MAC地址都是不会冲突的,因为网卡生产自带,可以理解为出生的人类DNA肯定不相同
这个其实很容易理解,就是把发送数据的目标地址,从一个改成很多个,可以同时广播到不同的主机上。

网络层实现跨LAN的主机到主机之间的通信
路由器工作在网络层,至少连接两个局域网,所以至少有两张网卡
路由就是一个寻址的过程,寻找正确的地址,才能实现跨LAN的主机到主机
IP地址是网络层地址,是一个32位2进制数,通常分割为4个 “8位二进制数”
一般用点分十进制表示 如 : 114.114.114.114
IP地址是软件地址
IP地址会随时变化,且同一个网络内的IP地址不该重复。
在命令行使用nslookup 可以查到目标网址的对应IP
如:

经过网络层,主机已经相互连接了
传输层实现了主机进程到主机进程间的相互通信
但这里的进程,还可以再深入说,是进程的端口和进程的端口连接。
一个端口对应一个进程,一个进程可以有多个端口。
我们把主机比作城市,进程比作房屋。
那每个房子里都有几个人住,这每个人就是一个端口。
这几个人都属于这个房子,而这个房子对应这些人。
一个进程可以有多个端口,不会发生冲突。
一个端口只能分配给一个人,不可以重复。
Sir,这里我就直接导图了


数据传输一定是从应用层 到 应用层的。


我们先将应用层数据打包好,然后一层层进行数据的封装,具体步骤是:
从应用层到传输层 放入 payload(负荷),也就是内容信息。
然后从传输层开始,每层都需要打包该层协议相关的控制信息,如端口,IP地址,MAC地址等,自身的和目标的都要打包好,放入header(首部)。
当我们走到物理层,数据已经封装好了,发送方的任务完成。
接收方将物理层传输过来的信息一步步解包,分用。
根据一层层解包,我们可以得到最终要传输的数据。
通过分用,我们可以从header中得到控制信息,数据从何而来,要传递给上层的谁,因此进行分用操作。

跨LAN的通信和同LAN差不多,但要注意长期目标和短期目标的区别。
一般,我们先寻找到短期目标,然后重新根据长期目标计算短期目标。
这里的短期目标指:同LAN内的目标
长期目标也就是最终目标
在这个过程中,我们会不断拆开数据链路层看一看,是不是我们要寻找的目标,如果是短期目标我们肯定是重新计算下一个短期目标,把数据再装回去发送,如果不是,我们就直接装回去寻找我们的目标。
其实这些数据通过路由器传达,因为路由器看得懂长期目标,而且可以动态计算下一个短期目标。
我觉得老师举的例子很好,我就直接套用了
