网络请求几乎在日常使用计算机都需要使用到,计算机网络原理在大学的时候也曾作为必修课学习过。但是时间久远,加上那是主要是应付考试,所学深度、重点及当时学习的目的和工作之后不同,还是想再来了解一遍。
以前学计算机网络的时候,老师讲的是七层结构:物理层、数据链路层、网络层、运输层、会话层、表示层、应用层。工作之后,发现大家基本都使用五层的结构:物理层、数据链路层、网络层、运输层、应用层。这里也是使用五层的结构。因为工作当中,使用最多的是HTTP协议,所以这里应用层,也是从HTTP协议入手。
对于移动开发来说,网络应用基本是C/S(客户端/服务器)架构,客户端发起请求,服务端接受、处理消息并返回响应消息,客户端拿到响应消息再做出相应的行为。这样的一次网络请求,虽然在开发中开来,只要代码书写没有问题,在很短的时间内客户端就可以得到服务器返回的数据,但是这个过程确实经历了很多的操作。
本打算从上往下来分析请求过程,但是感觉还是从下往上比较好,从下往上感觉可以讲出从无到有,而网络本来也是从无到有,比较符合实际。
一、物理层
在以前,那还是只有计算机没有网络的时候,都是单台计算机在各自工作。后来等计算机开始多起来的时候,就有人希望多台计算机可以链接起来工作。这时候,首先就需要把计算机链接起来,最开始的时候使用的是光缆、电缆等链接计算机。然后在这些缆线上传输电信号(包括模拟信号和数字信号)。
二、数据链路层
在物理层已经把计算机链接起来了,理论上已经可以实现计算机之间的通信了。如果多台计算机相连的时候,一台计算机需要向指定的计算机发送数据的时候,那就需要一个标志来对每一台计算机进行唯一的标识。这个时候,MAC地址就出现了,一个MAC地址对于一台设备,这个MAC地址是在设备出厂的时候,就已经写在设备的网卡模块上的。有了MAC地址标识计算机,还需要一个协议来对电信号进行分组,因为在缆线上传输的信号是连续的,所以在传输之前应该分好组,接收的时候才能区分那些信号是一组,这个协议就是以太网协议。
(以太网)
以太网规定,一组电信号构成一个数据包,叫做“帧”。每一帧分成两个部分:标头(head)和数据(data)。
标头(head):包含数据包的一些说明项,比如发送者的MAC地址、接受者的MAC地址、数据类型。
数据(data):数据包的具体内容。
标头(head)长度固定18字节。数据(data)长度最小46字节,最长1500字节。所以一个帧最短字节数是64,最长字节数是1518字节。
知道了数据包的分组方式(帧),就可以尝试在数据链路中传输数据了。数据在以太网中传输的时候,数据包从一台计算机发出,通过数据传输总线会使得链接到数据总线上的所有计算机都会接收到数据包,然后各台计算机判断目标MAC地址与自己的MAC地址是不是相同,相同的话,处理数据包,不相同的话,把数据包丢弃,这种方式也称为广播方式。前面说到,在一个帧中,需要知道自己的MAC地址,还需要知道对方的MAC地址。但是开始的时候是不知道对方的MAC地址的。这里需要了解一个协议--ARP协议。因为这个协议需要结合IP地址来讲,所以在讲完IP地址之后在讲。
三、网络层
这一层的协议是IP协议。以太网广播的发送方式在数量不多的计算机组成的小网络可以行的通,当计算机数量达到一定的数量之后,还依然通过将所有的计算机链接在一条数据传输总线,使用以太网链接,这是不现实的,所以就出现了IP协议。IP协议需要借助IP地址实现,IP地址是一个32位的二进制数字,习惯上将IP地址分成4段,每段8位,如写成:192.168.1.1。IP协议使得可以将所有的计算机分成一个一个的子网络。子网络内部的计算机可以使用以太网链接,而子网络之间会有一个网关来处理数据通信。
如何确认两台计算机是否在一个子网络中呢?这需要再引入一个概念,子网掩码。子网掩码也是一个32位的二进制数字。知道子网掩码还需要知道IP地址其实分为网络部分和主机部分,详细不说了,一般到达某一台计算机的时候,子网掩码一般是255.255.255.0。两台计算机是否在一个子网络里面,确认方法是,分别用两台计算机的IP地址和子网掩码进行“与运算”,如果结果相同,说明两台计算机在一个子网络中。
IP协议给每一台计算机分配一个IP地址,并提供了哪些IP地址是在一个子网络中。
在这一层,数据包会被添加上相应的IP信息。包括IP协议版本、数据长度、IP地址。
IP数据包“标头”部分长度是20-60字节,整个数据包长度最大为65535字节。因为以太网数据包数据部分最大1599字节。因此,如果IP数据包超过1500字节,就需要分割成几个以太网数据包发送。
如果两台计算机需要进行通信,那么首先会通过以太网协议,在子网络中广播发送数据包,在子网络中的所有计算机接收数据包,判断数据包的IP地址相同,则当前计算机处理数据包,其他计算机把数据包丢弃。
如果发现没有计算机处理这个数据包,那么说明两台计算机不在一个子网络,那么数据包交由网关处理。网关会通过“路由”的形式,将数据包传输给下一个子网络的网关。这样,数据包就可以在整个网络中传输了。
ARP协议
IP数据包交给以太网传输的时候需要知道目标计算机的MAC地址,而目标计算机的MAC地址一开始不知道。需要使用ARP协议来获得,ARP协议其实就是通过IP来确定目标计算机的MAC地址。ARP协议的原理就是:通过判断目标计算机的IP地址和原计算机IP地址是不是在一个子网络中,如果是,那么发送一个数据包,这个数据包的目标MAC地址使用:FF:FF:FF:FF来代替,内容携带目标计算机的IP地址。在以太网中传输这个数据包,所有子网络中的主机接收到这个数据包,判断目标IP地址与自身IP地址是否相等,如果是则返回一个数据包,告知原计算机自己的MAC地址。如果不在一个子网络,数据包交给网关处理,网关把数据包封装好通过路由在所有网关之间传输,当其他网关接收到这样的数据包,通过子网掩码发现这个IP地址在自己的子网络中,那么就把自己的MAC地址返回。然后之后的正式的数据包就可以发送出来了,当目标IP地址的网关接收到这个数据包,因为自身是网关,不能处理数据,那么就会通过ARP协议的方式找到目标IP地址的MAC地址,然后就可以准确的把数据包发送到目标主机上了。
四、运输层
来到运输层,这层的协议是TCP/UDP。这一层接收网络层的数据包,那么运输层怎么知道当前数据包到底对应哪个应用程序呢?这里使用的是端口来标识。系统提供了65535个端口,端口表示就是使用0-65535这样的数字。其中0-1023端口已经被系统占用。所以开发程序的时候,需要监听端口的话,一般使用1024往后的端口。
在这一层,也会添加对应的头数据,头数据(head)部分主要是接收端口及发送端口。
这一层有两个协议:UDP和TCP协议。
UDP协议接收到应用层数据包之后,直接把数据包作为data部分,加上自己的head的部分,就扔给网络层了,每个数据包只发送一次,不管是否发送成功。UDP比较简单,但是可靠性比较差。
TCP是面向链接的数据传输协议,在发送数据包之前,会先进行连接过程的三次握手。而在发送数据包过程,每一次数据包的发送都需要确认,如果收不到确认会进行重发。TCP协议较UDP复杂很多,消耗更多资源,但相应的也可靠的多。
另外UDP协议传输数据给网络层时,不考虑数据包的大小,它只管把数据包发松给网络层就完事了。TCP除了先通过三次握手建立连接,然后数据包传送都确认外,还会考虑到网络层的数据包大小不超过1500字节,在数据包下发网络层时,如果数据包超过1500字节,就会把数据包分割成多个报文发送给网络层。
五、应用层
当客户端想要发送Http请求,必须先构造一个Http数据包。Http数据包由三部分组成:请求行、请求头和请求正文。请求行包含Http请求的方法、URL及Http协议的版本。请求头包含很多内容,主要是告诉服务端关于这次请求的一些信息,请求头重点是包含了这次请求发送到的服务器的地址(一般是一个域名)。当需要把这个请求发出去时,这个数据包构建完毕,下发给运输层。
下图完整的展示了Http请求过程。
Http组装好一个数据包(应用层),通过端口下发给TCP协议(运输层),TCP协议加上自己的头信息,主要是接收端口和发送端口,然后根据数据包大小,决定是否拆分数据包。然后下发数据到网络层。网络层拿到数据包之后,需要知道目标主机的IP。一般情况下,Http请求带的数据里面,存储的是域名,在这里就需要将域名转换成IP地址,这个转换过程需要使用到DNS协议。DNS协议专门用于将域名转换成IP地址或者将IP地址转换成域名,它就像一个电话簿,使得IP地址和域名一一映射。得到IP地址之后,就可以通过ARP拿到目标主机的MAC地址了。然后网络层就会添加自己的头部信息,将数码包下发到数据链路层了。在这层,判断客户端和服务器IP地址是不是在一个子网络中,如果是,则直接由服务器所在主机处理数据包。不在一个主机的话,有网关转发之后,找到服务器主机所在。
服务端主机接收到数据之后,开始拆分数据包,对应层处理相应层的头部信息,最后到达运输层的时候,TCP协议根据端口号把数据给到相应的应用程序处理数据。当处理结束之后,需要返回数据给客户端时,又重复上述流程,只不过这时,服务器端是发送方,客户端是接收方。
以上就是一个Http请求所经历的过程。
参考链接:互联网协议入门二
互联网协议入门二