从浏览器输入url到页面加载(十)接收到网卡数据的处理

49 阅读3分钟

上一节我们说到数据经过漫长的旅程,从客户端,到达了服务端。然后服务端的等待连接程序被开启,与客户端建立了连接,这一节我们继续说。

1 接收到的数据是什么样的?

更准确的说,服务端接收到的数据,这个时候还不是我们的什么url,data,post/get这些,它只是一些电信号或者光信号,然后网卡接收到这些信号以后,再将信号还原成数字信号,也就是我们总说的0和1啦。接收到的数字信号被保存在网卡的缓冲区中。

2 网卡驱动被激活

虽然网络包已经到达了,网卡也接收到了,但他并不能开始工作。因为服务器的CPU也不知道网络包达到了,所以正在忙其他的事情。所以,网卡告诉CPU,有网络包过来了,你赶紧分配任务。

所以CPU就停掉其他工作,开始执行网卡的相关任务。就这样,网卡驱动开始工作,从网卡缓存区的数字信号网络包读取出来,调用TCP/IP协议栈,将网络包转交给他。

image.png

3 达到协议栈

数据包到达协议栈后,IP模块要检查过来的IP头部信息是否符合规范,会检查网络包是不是发给自己的。检查是不是分片包,如果不是,就保留原样,如果是分片包,还需要将数据包暂存在内存中,等所有的分片包都到达之后,再进行组装还原。

当TCP头部中的控制位SYN为1时,表示这是一个发起连接的包,TCP就会接受连接操作。然后将等待连接的套接字复制一个副本,同时生成代表确认接收的ACK号,并将这些副本和ACK号的信息打包生成TCP头部,委托IP模块发送给客户端。客户端接收到网络包,又将ACK号返回给服务端,这次握手就算成功了,也就是所谓的连接成功了。这时就可以将套接字描述交给服务器程序了。

4 你的接口名字是真实的服务器文件夹名字吗?

很显然,我们调用的接口url,

www.atest.com/user/getUser或者www.atest.com/a/index.html,

看似是一个文件夹的目录顺序,但其实并不能这么做。你想,如果这是真实的,那别人一眼不就看出来我们服务器的一些信息了嘛。我们的服务器应该是一个非常保密的东西。第一节我们说过一部分,但例如接口这种情况,就需要结合nginx的路由配置,我们项目中的一些router配置去找对应的文件了。甚至看似访问的a.html,其实这只是一个程序路由,指向的可能是c.jsp呢,对吧。

最终,程序获取到html信息,或者一些动态数据,协议栈又将数据打包,经过网卡,经过路由器再转发,经过互联网,一直到了客户端。