本节主要介绍OSI七层参考模型的应用层,传输控制层,网络层和链路层的相关内容
OSI 七层参考模型
OSI 七层参考模型的主要作用是:分层解耦,只要保证接口不变,开发人员可以分层进行开发(可以类比web开发中的mvc设计思想),其本质是节点间进行通信。
附:OSI 七层参考模型示意图
我们把7层模型精简后,可以精简成4-5层的模型,如图所示,其中应用层属于CPU用户态,传输控制层至链路层隶属CPU内核态
应用层:
常用得应用层协议:
- http协议
- ssh协议 比如连接虚拟机
- smtp 比如发送邮件
演示http的发送过程:测试环境linux,连接工具xshell
第一步:
cd /proc/$$/fd ##/proc/7497/fd &&当前解释程序的进程ID号 fd文件描述符
ll
显示信息:
Linux系统一切皆文件,我们的socket也可以用文件表示
lrwx------. 1 root root 64 6月 11 11:22 0 -> /dev/pts/0 #文件描述符0 ->>标准输入,类比Syetem.in
lrwx------. 1 root root 64 6月 11 11:22 1 -> /dev/pts/0 #文件描述符1 ->>标准输出,类比Syetem.out
lrwx------. 1 root root 64 6月 11 11:22 2 -> /dev/pts/0 #文件描述符2 ->>标准报错信息,类比Syetem.err
lrwx------. 1 root root 64 6月 11 11:28 255 -> /dev/pts/0
第二步:创建与baidu的连接
exec 8<> /dev/tcp/www.baidu.com/80 ##创建文件描述符8,可输入输出(<>),指向磁盘路径,和百度建立了连接
显示信息:
lrwx------. 1 root root 64 6月 11 11:22 0 -> /dev/pts/0 #文件描述符0 >->标准输入,类比Syetem.in
lrwx------. 1 root root 64 6月 11 11:22 1 -> /dev/pts/0 #文件描述符1 >->标准输出,类比Syetem.out
lrwx------. 1 root root 64 6月 11 11:22 2 -> /dev/pts/0 #文件描述符2 >->标准报错信息,类比Syetem.err
lrwx------. 1 root root 64 6月 11 11:28 255 -> /dev/pts/0
lrwx------. 1 root root 64 6月 11 11:31 8 -> socket:[68504] #创建了与>baidu的连接
第三步:发送http协议
echo -e 'GET / HTTP/1.0\n' >& 8 ##请求头最小的写法,模拟浏览器,-e是\n变成换行符 >&重定向到文件描述符 8
第四步:查看返回的内容
cat 0<& 8 ##查看返回内容
exec 8<& - ##查看内容后,断开连接,关闭文件描述符8
传输控制层
发送http请求的前提是,已经在传输控制层建立了通讯,开辟了资源。
传输控制层的协议主要有:
- TCP协议,面向连接的可靠的传输方式
- UDP协议,非面向连接的不可靠的传输方式
在这里主要介绍TCP协议
建立一次TCP连接的过程是 3次握手 -> 数据传输 ->四次分手 ,这个过程是不可被分割的。
1.三次握手
三次握手是通讯双方建立连接的确认机制,三次握手结束后才开辟资源,比如说使用BIO创建一个web服务器,每次三次握手之后抛出线程创建一个连接。
三次握手的过程:
1.客户端发出sync信号(数据包),请求创建连接。
2.服务器端返回ack确认信号(数据包),表示收到了创建连接的请求,并且发出了sync新号(数据包),请求客户端的连接。
3.客户端给服务端回复ack确认信号(数据包),连接建立成功。最后一次确认信号一般是带着实际数据一起发送
为什么是三次握手:无论对于客户端还是服务端,IO都是双向的。也就是说对于客户端和服务端来说,发送出一个sync信号,同时都需要一个ack信号保持确认,如果是2次握手,则服务端发出的sync无法收到ack的确认信号。
2.四次分手
四次分手一定是必然,因为无论客户端还是服务端的资源都是有限的(比如端口号),在数据传输之后,需要释放资源,四次分手后再销毁资源
网络层
传输控制层封装的数据包,需要向下发送,经过网络层,我们来看一下网络层都有哪些维度的信息,和它是如何运行的。
netstat -natp ##查看服务器的连接状态
其中第四条信息Local Address:192.168.10.31:22表示当前连接中本机的ip:port,Foreign Address:192.168.10.1:55301表示连接到本机的ip:port,这个连接就代表了windows上Xshell连接到了虚拟机的一个ssh协议的连接。
网络层主要解决的问题是:数据包应该发给谁,其核心机制->下一跳机制
网络层的四个维度:IP地址,掩码地址,网关地址,DNS地址
查看网络层配置
cat /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=192.168.10.31 IP地址,点分字节
NETMASK=255.255.255.0 掩码地址
GATEWAY=192.168.10.2 网关地址
DNS1=114.114.114.114 解析域名和ip的映射
##IP、掩码按位与 网络号 :192.168.10.0
route -n ##路由表
##路由表信息来自于网络层配置文件
下一跳机制:只需要保存最近的路由信息,把数据包发送给离自己最近的路由器(不用存全网信息 只存周边一步得数据)
Ping baidu的过程分析:
- ping www.baidu.com,根据DNS解析获取IP:220.181.38.150。
- 根据IP:220.181.38.150去路由表中匹配掩码,255.255.255.0可得网络号是:220.181.38.0,根据网络号可只,此IP不在自己的网络号中。
- 匹配下一条路由规则,Genmask:0.0.0.0,获得网络号0.0.0.0,该网络号与路由表中地址匹配,则发送给网关192.168.10.2。
- 至此这个数据包就可以发送给离我们最近的路由器,再由路由器根据像类似的规则发送给其他路由器,直到baidu。
- 如果我们的目标IP可以匹配网络号192.168.10.0,则表示目标地址在同一网段,则不需要通过路由转发,可直接通过局域网内交换机通信。
链路层:
当我们确定了需要把数据包发送给谁(某个路由器),则我们还需要知道通过谁(哪个网卡)发送出去,则需要Mac地址。
#网卡地址-MAC
arp -a
通过arp -a指令,我们可以看到我们网卡对应的物理地址,则通过这个物理地址把数据包发送出去。
需要了解的是,数据在不同路由转发的过程中,mac地址是不断变化的,一直指向下一个路由的mac地址,而目标点的ip:port是始终不变的,如图所示: