lvs01-网络协议原理
我们在学习,网络的模型的时候,经常出现OSI七层网络模型、五层网络模型,那么这七层、五层都分别是什么东西?在实现负载均衡的过程中,有三种模型,NAT DR TUU,这三种模型都分别是怎么产生,为什么这么做?接下来的文章,或许会对你有所帮助
首先,我们先看一张图,这张图在我们学习网络模型的时候经常出现,即我们熟知的osi七层模型,这七层网络模型构成了现代网络的基本单元。
在这个七层的网络模型中,我们要知道一个东西,那就是在我们实际的使用过程当中,例如。我们发送一个http请求出去,这些过程都分别是啥样?
先介绍一个东西,用户态与内核态,哪些是用户态哪些是内核态
有了这些前置知识之后,我们可以多osi模型进行精简,就出现了下述的五层网络模型:

我们根据用户态与内核态差异,总结出了,以上的五层网络模型,其中应用层属于用户态,剩下的四层属于内核态内容,通信过程中,1-4层其实是由内核kernel进行完成;
常见http协议:http ssh smtp
在linux中,万物皆文件,在通信过程中,在linux实际上也是以文件进行描述的,后续我也会出相应的文章来详细解释虚拟文件系统
使用ssh或者跳板机连接一台物理机,我们模拟一下这个过程:
cat /proc/$$/fd
在linux中代表标准输入、1代表标准输出,2代表错误输出,类比到java中,可以这么理解,system.in system.out system.error如果写过shell变成的话,会经常看到2>&1 ,就是将错误输出定向到标准输出,shell脚本的编程,如果时间允许的话,可能也会有一个简易的教程。
在上述中,我们打印了当前进程的文件描述符,我们进行接下来的操作:
exec 8<> /dev/tcp/www.baidu.com/80
创建的一个8的文件描述符,接收输入输出参数,指定向/dev/tcp目录下,这个目录是一个特殊的文件夹,有tcp链接时就会在这个目录下创建,我们与百度进行链接,注意:要指定端口,tcp连接是端口与端口间的通信,接下来回详细解释,这里先记住
我们发送一段http请求:
echo -e 'GET HTTP /1.1\n' >&8
echo是打印,-e是将\n变成换行符 指定http请求方式,这是一个最简易的http请求,注意后面的/。http协议的header与body必须要使用换行符来进行区分,这点要注意,将请求返回的值,作为标准输出到创建的文件描述符8上
cat 0<&8
打印之后关闭文件描述符
exec 8<& -
将文件描述符8的内容打印出来
以上,我们完成了一次完整的http请求,发送以及数据回收的过程
那么这些数据的走向到底是什么?
前提,我们发送http的前提是,tcp已经发生了链接,并且开辟了资源(假设是tcp链接的话)
tcp位于五层网络模型的第四层,数据传输层
常见的传输层的协议有:tcp udp
tcp的通信需要有三次握手--》数据传输--》四次分手的过程,这里不赘述
先抛出来一个结论:tcp链接成为一个最小粒度,不可被分割
为什么这么说呢?我们看看接下来的这张图

假设我们有三个服务端,server1 server2 server3,我们发出一个tcp请求,与server1建立连接,中间要经过一个代理,已经向server1发出了第一个sync,server1也回答了一个act,但是,客户端的确认包act发送给了server2,此时,tcp连接并没有完成连接,因此tcp链接称为最小粒度,不可被分割
三次握手的过程:
1.客户端发出sync信号(数据包),请求创建连接。
2.服务器端返回ack确认信号(数据包),表示收到了创建连接的请求,并且发出了sync新号(数据包),请求客户端的连接。
3.客户端给服务端回复ack确认信号(数据包),连接建立成功。最后一次确认信号一般是带着实际数据一起发送

为什么是三次握手:无论对于客户端还是服务端,IO都是双向的。也就是说对于客户端和服务端来说,发送出一个sync信号,同时都需要一个ack信号保持确认,如果是2次握手,则服务端发出的sync无法收到ack的确认信号。
四次分手:这其实是一个必然,客户端发出断开链接fin请求包,服务端回复一个act应答,但是实际服务端并不能马上释放资源,必须要有的一个确认请求都执行完成,并且资源都被释放了,即tcp是可靠的链接协议,服务端完成了一系列的操作之后,才会对客户端发出消息fin,客户端对这次分手信号进行act,才能完成分手的过程
上面介绍了,http请求的模拟过程,以及tcp的基础,我们接下来看看网络层是怎么工作?
先思考一个问题。为什么需要有网络层这个东西,存在是否有必要?我们发出一个请求之后,由tcp进行握手,创建链接,资源开辟出来,能够进行通信,但是,数据包封装完成之后,怎么发出去,成了一个问题,五层模型就是为了解决这个问题
网络层
传输控制层将数据包封装好的之后,必须要向下进行传输,经过网络层
netstat -natp 查看服务器的联系情况

网络层主要解决的问题是,数据包应该发给谁,核心机制:下一跳
网络层四个维度,

其中定义了当前ip地址,子网掩码 网关 还有一个DNS
ip地址又称为点分字节,因此ip的长度就是255.255.255.255
将ip地址与子网掩码进行按位与操作,可以得到网络号,在事例中,我们可以得到网络号是:10.16.158.0
route -n 路由表
下一跳机制:只需要保存最近的路由信息,将数据包发送给离自己最近的路由器,不存全网信息,只存周边一步的数据
我们验证一下这个过程,现在我们ping一下百度,看一下数据包的发送过程:

1.DNS解析域名,返回163.177.141.110
2.根据163.177.141.110去刚刚查看到路由表的子网掩码进行进行按位与操作,可以得到网络号,163.177.141.0,这个ip并不在我们的网络号中,我们本机的网络号是10.18.100.0
3.最终我们只能匹配到0.0.0.0 ,获得网络号是0.0.0.0,在路由表中进行匹配,发送给网关10.18.100.1
4.到这里意味着找到下一步了,我们可以将数据包发送给最近的路由器,然后,再由路由器根据类似的规则将数据包发送给其他的路由器,直到百度
5.注意:如果目标地址的网络号与本机的网络号在同一个局域网,不需要经过路由器的转发,可以直接通过交换机进行通信
链路层
经过网络层之后。我们已经直到,数据包将要经过网关发送出去,但是这时候我们思考一个问题,我们要发送的数据包是发送给10.18.100.1,还是163.177.141.110?
如果是到本机的网关到路由器的话,路由器并不知道百度的目标地址?这时候数据包应该是到不了目标ip地址,链路层就发挥作用了
我们看下网卡地址:
arp -a
数据包经过网络层之后,我么已经可以得到这个结论,数据包是要经过的10.18.158.1这个网关发送给路由器,然后经过路由器的转发到达目标地址百度,但是由于目标地址并不在这个局域网络内,必须要经过网卡信息,由mac地址进行封装,将目标地址包装进去,才能够到达百度的目标地址
通过arp命令,我们可以看到网卡信息,对应的物理地址,通过这个物理地址可以讲数据包发送出去,这里,我们注意,在数据包发送过程中,mac是要发生变化的,一直指向下一个路由器mac地址,目标ip port是不会发生变化
记住这句话:ip是端点间,mac是节点间
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
