浏览器访问网站过程
QUESTION1:浏览器访问网站的过程
step1:缓存查找
如果改页面在短时间内被访问过,则会经过缓存茶盏来判断是否需要请求新的资源,根据max-age、expires、cache-control、if-none-match、last-modifiled、etoken等来判断是走浏览器缓存还是向服务器请求数据,走浏览器缓存则直接返回数据,响应状态设置为灰色的200。
step1:域名解析
首先浏览器需要做域名解析,在浏览器本地的缓存中寻找是否又该域名的解析,如果没有,则到主机的缓存中去寻找,如果也没有,就到主机的hosts文件中去寻找,如果仍然没有则到路由器中找,如果还没有则根据指定的本地dns地址到指定的本地域名服务器上去寻找,如果没有寻找到,则到缓存中去找,如果也没有且如果配置了转发的话,则会把这个请求转发到该域名服务器的上一级域名服务器解析,上一级域名服务器如果也没有寻找到要么再到上一级或者到根服务器去寻找,这个过程叫做递归查询
。根服务器告知主机负责解析顶级域名的服务器的地址,顶级域名服务器告知负责二级域名解析的服务器的地址,二级域名解析服务器告知三级域名解析的服务器的地址,依次迭代,直到找到该域名的解析为止,这个过程叫做迭代查询
。
step2:建立tcp连接
域名解析完成后,开始建立tcp连接,连接时进行三次握手,首先客户端发送syn报文,将标志位syn设为1,同步序列号设为x,进入syn_send状态,服务器收到请求后回一个ack报文,其中标志位syn设为1,ack标志位设为1,同步序列号设为y,确认号设为x+1,进入syn_recieve状态,客户端收到确认报文之后,发送确认报文到服务器,ack标志位设为1,确认号设为y+1,进入established状态,此时tcp连接建立完毕。
step3:发送请求
tcp连接建立后开始开始传送http协议数据内容,经过tcp/ip协议五层层层封装,数据首先在五层编码成二进制,再到4层经过tcp层加上5层协议的端口号,根据数据链路层MTU对数据进行分段,然后到3层加上ip地址与4层协议号,然后数据到了三层后,首先判断目标ip地址是不是与本机处在同一网段,如果是在同一网段,则查询arp缓存表,或者进行arp广播,如果没有在同一网段则根据本机配置的网关地址,查询arp缓存表或者广播查询网关的mac地址,完成后封装帧头帧尾,然后数据被发送网关,由网关进行地址转换,然后层层路由到服务器端。
step4:服务器解析请求,发送数据
服务器根据请求内容返回相应内容,如果请求的是静态网页,将直接由web中间件根据url中请求的内容返回对应的数据,如果请求的是动态的页面,则web中间件将请求通过socket发送到动态脚本解析器解析执行,解析器若发现需要查询数据库,则会连接数据库进行查询并将数据添加到结果中,脚本解析器解析完后,将数据发回给web中间件,web中间件再发回给浏览器。
step5:断开连接
当浏览器没有要发送的数据时,服务器首先发送一个结束报文,我们称其为执行主动关闭,该报文中fin标志位设置为1,ack标志位设置位1,syn标志位设置位0,同步序列号为x,确认号设置为z,此时服务器关闭其发送数据服务,但仍然可以接受来自浏览器的数据,浏览器接收到后回复服务器一个ack报文,表示已经接收到了服务器的结束连接请求,设置ack标志位为1,syn标志位位0,fin标志位为0,同步序列号为z,此时如果浏览器仍然有请求,仍然可以发送给服务器,等到浏览器没有请求发送后,其会发送一个带有fin+ack标志位的包给服务器,并设置确认号位X,同步序列号位Y表示没有数据再发送给服务器了,进入lask_ack状态,当服务器收到该报文后,发送一个带有ack标记的包给浏览器,同步序列号设置为X,此时服务其进入最终确认状态fn_ack ,待等待了2msl(2倍报文最大生存时间)后,服务器释放连接。
step6:浏览器解析、渲染数据
客户端收到数据后,经过层层的解封装、重组等操作最终将数据发送到浏览器。浏览器接受到数据后首先将html代码构造成DOM树,css文件构造成CSSOM,这两个过程是同步进行,然后浏览器合并这两棵树,生成渲染树,最后进行重构,渲染等操作得到我们看到的网页
QUESTION2:一台计算机最多可以有多少个网络端口(逻辑)?
共有655356个端口
- 0-1023 公认端口,一般都有特殊的含义,个人在分配端口的时候一般不使用这些端口
- 1024-49151 注册端口:这些端口可以用于绑定一些服务
- 49152-65535 私有端口:这些端口我们在测试的过程中可以使用
QUESTION3:127.0.0.1在网络安全和测试中的现实意义有哪些?
一般用作测试用,可以用于测试本机的网络配置是否成功,可以用于本机应用间的通信
QUESTION3:部署网站的体会
我在部署过程中遇到的一个问题就是PHP版本不匹配的问题,我使用的PHP版本时7.3,这个版本的PHP与老的版本的PHP有较大的差别,就我所知道的,7.3版本里面单条mysql单条查询语句的执行函数时mysqli_query(),而老版本的PHP中确是mysql_qurey,所以我在发布网站之后,访问页面是一片空白。这个问题我在部署sqli_labs的时候也遇到过,不过当时有报错信息,所以我很快就找到了问题的根源,但这次却没有报错信息,所以浪费了很多的时间,还向刘俊岑请教了一下,我方才大彻大悟,可能是PHP版本不兼容导致的, 在我使用了低版本的PHP后,这个问题果然被解决了。