OSI网络七层模型简介
网络七层模型就是一个参考模型,也就是说有这么个七层的定义,就像是项目中的dao、service、controller三层架构一样,每一层都有自己的工作要干,互联网协议就按照不同的作用分为osi七层或tcp/ip五层或tcp/ip四层。
应用层
第一层:应用层。定义了用于在网络中进行通信和传输数据的接口
第二层:表示层。定义不同的系统中数据的传输格式,编码和解码规范等
第三层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断
传输层
第四层:传输层。管理着网络中的端到端的数据传输
网络层
第五层:网络层。定义网络设备间如何传输数据
链路层(网络接口层)
第六层:链路层。将上面的网络层的数据包封装成数据帧,便于物理层传输
第七层:物理层。这一层主要就是传输这些二进制数
学习计算机网络时我们一般采用折中的办法,也就是中和OSI和TCP/IP的优点,采用一种只有五层协议的体系结构学习即可,这样既简洁又能将概念阐述清楚。
网络通讯的流程了基本如下(五层):
应用层,数据(加http协议等)—》传输层(包上tcp或者udp协议)—》网络层(包上ip协议)—》数据链路层(包上以太网协议)—》物理层
下面就开始详细介绍这个几层,并按如上流程进行演示,最好开一台服务器或者虚拟机,跟着一起操作感受一下,相信你会对OSI这几层以及各种协议有一个全新的认识
应用层
比如浏览器、qq微信都是属于应用层,准确的说是应用层客户端,访问的服务器就是应用层服务端。我们在浏览器发送的请求会被加上http协议传输到传输层。还有xftp、sqlyong等等会加ssh协议。
这些协议就是所谓的应用层协议,用来约定两个程序传输的格式、怎么加密的等等。不同的场景选择不同的协议来工作。
其后的传输层、网络层、网络接口层我们并不需要关心,因为这是操作系统内核帮我们做好的事情了。就像我们使用浏览器一样,http协议浏览器帮我们加好了,只需要输入域名就可以。
用linux访问百度举个例子:
1.创建连接: 8就代表文件描述符,<>代表输入输出,然后指向了一个路径,但是操作系统内核会把这个路径转换成对百度的socket连接
exec 8<> /dev/tcp/www.baidu.com/80
创建socket之后,cd到/proc目录下
这个目录下是内核程序运行时我们能在文件系统看到的东西,可以看到目录中有很多数字的目录,可以把他们想象成线程号一样。
如下命令就是查看当前执行进程的进程号,相当于查看当前运行的线程了。
echo $$
可以看到当前的进程号就是5725,那么进入5725
可以看到一些目录,这个fd就是前面说的文件操作符了,再cd进去,ll查看
0代表标准输入,1代表标准输出,2代表报错,下面的8就是我们刚才创建的socket,指向的百度。
那么我们现在其实就是应用层客户端,我们已经有了应用服务端百度的连接,那么我现在应该遵循某种协议,给百度发一些信息,让百度把主页返回给我们。现在很明显我们应该遵循HTTP协议。
2.发送请求: 请求的HTTP协议规范为 “GET / HTTP/1.0\n”,最后\n就是换行符,-e代表识别换行符,>代表会写到文件中,>&就代表会写到文件描述符中。
echo -e "GET / HTTP/1.0\n" >& 8
通过执行上面命令,就会把“GET / HTTP/1.0\n”通过8号文件描述符发送给百度,我们8号文件描述符的这个socket连接是双向的,可输入输出,那么百度就会把主页的信息放到socket中,我们只需要把8文件描述符的数据输入重定向出来,就可以看到百度主页的信息了
cat <& 8
上面我们干的其实就是一个应用层做的事,传输层网络层我们是无感的,因为系统内核已经把TCP协议的事做了,后面我们继续深入研究系统内核怎么做的TCP协议。
我们想一下刚才就做了两步,通过exec建立连接,发请求。那么怎么从应用层到的传输层、网络层的呢,其实太明显了,传输就是socket做的嘛,所以exec创建socket时就是调用了内核的传输层才建立的socket。
传输层
传输层就是把一台计算机的数据传输到另一台,基于的协议可以是TCP或者UDP,TCP是面向连接并可靠的协议,那么什么叫面向连接还可靠的呢,他要通过三次握手,四次挥手来保证它的连接的可靠性,以及滑动窗口的概念,这个后面再说。
三次握手
什么是三次握手呢,其实就像下图一样,由客户端这边的传输层创建了一个sync数据包发给服务端,代表我想和你建立握手,服务端如果能收到这个包,一般服务端的传输层会给客户端回一个sync+ack确定包,最后客户端还得再给客户端回一个确认包,这样就通过三次握手建立了连接。