我们在生活中经常会上网冲浪,这似乎是再平凡不过的一件事了,但你有没有想过当你在浏览器输入一个网址之后,你是怎么得到结果的呢?希望这本书和这篇博客可以给你一个回答。
首先,我们会在浏览器端输入一个网址,它还有一个名字URL(统一资源定位符),顾名思义就是我们所请求的资源所在的位置,我们以这篇博客的网址为例
其中https表示希望以哪种方式来仿真我们想要的资源, 这里指https协议。互联网上的每一台主机都被分配了一个ip地址和,我们通mac地址,我们通过这个地址来访问它们,但记忆一些毫无关联的数字有些困难,因此我们希望可以为一些经常访问的重要的地址起一个更加容易记忆的名字,所以就出现了域名,在这里指mp.csdn.net,当我们到达了存储资源的服务器之后, 我们还需要一些更多的信息才能辨别出我们想要的资源是哪个,因此我们需要标出是哪个文件夹下的哪个文件。所以这个网址的意思就是通过https协议在mp.csdn.net这个服务器上找到postedit文件夹下的84110676这个文件夹下的默认文件。
浏览器所做的工作就是在你输入一段网址之后,把它按照上述的方法解析之后生成一个http消息(为什么这个消息要叫做http消息,有ftp消息吗?待回答),
请求方法常见的有get、post、put等,生成http消息之后,我们的目的是把它发向mp.csdn.net这个服务器,但我们现在还不知道它的地址。
互联网中存在着数量巨大的域名,因此没有办法把它存在我们的电脑上以便随时访问,所以需要调用解析器通过DNS服务来进行域名与ip地址之间的转换。对于该域名,首先我们从浏览器的缓存中去查取,如果没有则接着查取hosts文件,如果还是没有,则需要由协议栈向本地DNS服务器查询,正如之前所说,互联网中的域名众多,所以为了存储和查询方便,DNS服务采用树的结构来存储,如图所示。
其实我们常见的域名都是省略了最后的.的结果,也就说这个域名其实是mp.csdn.net.,因此DNS根服务器存储的就是.com、.net等顶级域名,全球共有13个根服务器。解析器先向根服务器查询存储net.的服务器的ip地址,随后再通过得到的地址访问该服务器查询csdn.net.的ip地址,最后得到mp.csdn.net.的ip地址39.96.132.69,并把得到的结果存入本地DNS缓存中,知道了ip地址之后,我们就可以委托协议栈向该服务器发送web消息了。
发送消息需要创建套接字,套接字实际上是把通信双方的信息存储在一个内存空间内,然后可以通过套接字的描述符获取该空间内存储的所有信息。客户端创建套接字的过程可以分为三个阶段(即为TCP的三次握手),首先是客户端向服务器发送SYN包,在客户端的套接字中写入本地地址和端口号,然后服务器端回以ACK包,并在服务器端的内存空间中写下客户端的ip地址和端口号,最后客户端向服务器端回以ACK包,并把服务器端的ip地址和端口号写入套接字中,三次握手结束。我们首先看一下TCP消息的格式。
在最开始发送的信息中,我们知道源端口即协议栈为这次通信分配的一个端口,可能有人觉得奇怪我们还没有被告知过目的端口,但其实常用端口都是固定的,譬如80端口是为http开放的,所以目的端口在这里只需要填写80即可。最开始连接阶段,因为此时还没有发送数据,所以序号暂时空置,通过操作系统的随机算法计算出一个ack号,最重要的部分即标志位的设置。客户端发送的第一个包的SYN置为set,服务器端回复的ACK包SYN位置为set,ACK位置为set,而客户端最后的包ACK置为set。TCP模块将生成的TCP数据报发送给IP模块并告知通信双方的ip地址。IP模块根据这些信息生成IP数据报,消息格式如下:
版本号表示目前所用的是IPv4还是IPv6,在源目的IP地址部分填写本地网卡的ip地址,在目标ip地址填写查询得到的服务器端的ip地址39.96.132.69,生成了IP数据报之后,如何把ip数据报发送给服务器端呢?
IP模块通过查询缓存的路由表查找通向服务器端的路由,路由表如下图所示
网络掩码表示服务器端ip地址与路由表中的网络目标需要匹配的位数,而网关则表示下一跳的目的ip地址,而接口则表示本机的网卡,数据从这个网卡发送到网关。因此查39.96.132.69得到的结果为通过10.10.20.62向10.10.20.1发送数据。这样的话,我们只需要在现在的IP消息前面在加上一个头部,在里面填写转发的源ip地址和目的ip地址不就可以了吗?但实际上我们还需要查询mac地址(所以为什么有了ip地址还需要mac地址啊?),查询mac地址可以通过arp服务,这个协议的内容十分简单,就是在当前的局域网中广播消息,每个host收到广播消息后比对自己的ip地址与请求ip地址,如果相同,则回复一条消息,告诉客户端自己的mac地址。根据这些信息,IP模块创建mac头部。
之后ip模块将数据报发送给网卡的mac模块,mac模块再添加报头和起始帧分界符以及帧校验序列,再通过网卡的phy模块把包转化成为电信号或者光信号,通过电话线或者光缆发送出去。
未完待续