1.计算机网络分层

1.首先 计算机网络iso参考模型是7层,但是这只是一个参考的模型,真实的iso模型实际是5层,
它是将下边两层的内容放入了应用层
我们为什么要对通信进行分层?
我们是基于软件工程架构的思想,对一个通信中的各个不同的操作进行解耦分层,使每一层都只关心做自己的事情。

2.分层解析各个层

image.png

1.应用层

这一层使我们程序员待的地方,它是基于http协议所生成的一个层,当我们程序员在对一个应用进行发送请求建立连接时,我们首先进入的是应用层,我们将请求通过应用层发送给由内核管控的四层,获取到连接,然后建立连接完成后,我们才可以向应用发送请求。
image.png

问题?

我们发送的请求如何获取到响应的?
发送请求,我们的请求首先需要建立连接,而我们如何建立连接的,首先需要 进入传输层,
经过tcp协议获取连接

2.传输控制层

传输控制层最基础的两个协议:TCP,UDP

1.什么是TCP:

我们需要深刻的记住两句话: tcp协议是面向连接的,可靠的传输协议。
而为什么说tcp是面向连接的,可靠的传输协议?

1.什么是连接?

我们此时就需要理解三次握手和四次挥手
首先我们要明白三次握手的目的:建立连接

2,三次握手过程:

首先客户端向服务端发送一个syn包,服务端接收到之后向客户端发送一个syn+ack包,告诉客户端,我可以收到你发送的请求,然后客户端接收到服务端发送过来的syn+ack包之后,再向服务端发送一个ack包,告诉服务端,我也可以接收到服务端所发来的数据,由此连接建立完成,确保客户端和服务端都可以接收到对方的请求,并且可以向对法发送数据。
image.png

一个操作系统当中端口号的取值范围为65535个。

3.什么是socket?

socket:被称为套接字,专业名称为四元组。
我们慢慢来分析socket:
一台服务端可以与多台客户端建立连接,而服务端如何完成定位到指定的某一台客户端的呢?
通过socket!
来深入socket:
首先,每一个socket都是唯一的。在一台服务端和多个客户端完成连接的情况下,只要保证一个socket中的四个元素只要有一个元素不同,那么就可以保证此次连接是唯一的。
客户端与服务端的一次连接 就是一个socket。而一台客户端最多可以和一个服务端建立65535个连接,因为在端口号唯一ip地址唯一的情况下,只有客户端的65535次次端口号的变化。
image.png

4.四次挥手过程:

四次挥手的目的是为了断开连接,第一次客户端向服务端发送一个请求断开的请求,服务端在接收到请求后,向客户端发送一个 ack 包,证明我已经接收到你的请求,再向 客户端发送一个我同意你断开请求的请求包,客户端在接收到服务端的响应之后,再向服务端发送一次响应,证明我也同意与服务端断开本次连接。由此四次挥手断开连接操作完成。
image.png

测试通信流程
1.进行对80端口号进行抓包
image.png
2.对百度 的 80 端口进行建立连接
image.png
3.我们可以看到,在抓取的结果中就获取到了三次握手的过程。
image.png

问题?

我们所发送的第一个请求连接的包,是如何发送到指定服务器端的,这时就需要对ip地址进行定位,而ip的定位控制是网络层所做的事情。

3.网络层

每一个层都有一个表。

1.什么是路由表

关于网络层:我们首先要知道什么是路由表?
我们可以使用 route -n 查看当前网络中的路由表。而这个路由表记录的就是离本地网络最近的一个表格,而我们可以通过这个路由表与全球所有可连接的网络进行通信,我们不可能将所有的网络都记录在这个表格中,因为数据太过庞大,因此我们可以基于最近的网络路由实现,将我要进行的连接交于下一个网络,也叫作”下一跳”,而这个下一跳的实现就是基于路由表实现的。
————————————————————————————————-
当我们发送了第一个握手的包之后,这个包该怎么走呢?
走到网络层,网络层中就有ip了,
什么是互联网?
互联网就是由很多的局域网组成,每一个网络中有很多主机,
一般会有四个维度:
第一个是ip地址,第二个子网掩码,第三个网关,或者称为下一跳。
ipv4是点分字节,两点之间是一个字节可以表示的十进制数,一个字节是8个2进制位。代表的是本台主机。
掩码:ip地址和子网掩码做2进制的按位与可以获得网络号
而下图中的ip地址和子网掩码的按位与结果是 192.168.150.0
ip 中最后一位11代表的是本机在整个网络中的第11号机器。
ip与子网掩码按位与就可以计算出在这个网络中所藏的主机号和多少个机器
image.png

网络层中的路由表
分别是
网络号 : 表示本台主机所连接的网络号
网关:0.0.0.0 表示本次数据交换不需要进行跳转
子网掩码
image.png

2.什么是下一跳

分析路由表
第二行中的 192.168.40.0 和 0.0.0.0 是通过网卡的配置自动生成的
那么怎么将一个数据发送给一个指定的ip地址呢?
例如 我想将一个数据包发送给 百度 (220.181.38.150),我们需要将这个目标地址与本机的子网掩码进行按位与,分别与本机中的路由表中的每一个条目进行按位与,如果结果和网络号相同,那么该次数据的发送的下一跳就是该条目的网关。
当在本局域网时,不需要经过下一跳,当经过外网时,才必须计算下一跳。

问题?

那么又有一个问题?
我向百度发送的数据包的目标地址是写百度的ip 还是 下一跳的ip地址,
如果我放到下一跳的ip地址,主机会发现这个数据包是发给自己的,他就会自己处理掉这个数据包,
如果放的是百度的ip地址,那么我如何才能确定这个数据包是经过我的下一跳发送的。
因此还需要下一层 链路层来进行定位

4.链路层

1.数据链路层表

image.png
从数据链路层表中获取到该下一跳地址的物理地址
分析下图:
当我们获取到下一跳的目的地址之后,我们还会获取到下一跳目的地址的物理地址,通过下一跳的物理地址和目标地址封装成一个数据包,经由一个个的下一跳,最终到达指定的目标地址。
image.png

最终的网络流程就是:
如果网络中链路表不是空的:
当我们在应用层发送请求,经由传输控制层的tcp协议通过三次握手建立连接时,当三次握手发送第一次握手请求时传输层会阻塞,到网络层通过路由表,计算下一跳的目标地址时,又会阻塞到数据链路层,经过rap协议计算出下一跳的目标地址的物理地址,将这个物理地址封装在请求数据包的最外层,经由物理地址和下一跳的目标地址找到下一跳,在由下一跳继续封装数据包和物理地址,直到跳转到最终的目标地址,第一次握手请求完成回到传输层继续进行第二次,第三次的握手,直到三次握手成功,创建完连接之后,服务器开始处理应用层用户所发起的请求。

总结整个网络的行为应该是:
如果链路表是空的,如果触发网络行为的话,先看到的是网络中有arp请求,在看到三次握手,在看到数据传输,在看到四次分手。

5.物理层