HTTP请求过程
概览:DNS解析--TCP三次握手连接--浏览器请求--服务端接收请求,并回复HTML代码给客户端--客户端收到代码根据代码继续请求CSS/JAVASCRIPTS--客户端拿到资源,浏览器开始渲染
第一步:用户输入域名在浏览器,浏览器查找缓存,再查找PC缓存,再递归查找DNS服务器,DNS服务器迭代查找根服务器
递归即我向你发出查找请求,你必须找到资源并答复我,迭代是指我向你请求,你不知道,我再向上级查找
第二步:通过第一步拿到IP地址后,两端TCP/IP协议会通过TCP三次握手建立可靠的连接通道,即客户端发送SYN=1,ACK=0,SEQ=X,其中SYN=1表示这个报文是请求连接/答复连接的报文
ACK=0,表示双方还未建立连接,没有发生数据交流,未需向对方确认收到的数据,SEQ=X表示请求方发送的数据流的初始值,对端答复报文的ACK就是对SEQ数据的确认
服务端答复报文SYN=1,ACK=X+1,SEQ=Y,ACK=X+1表示期望下次收到的数据流的位置点,并确认了收到对端数据流的位置点
注意:TCP连接是双向的,两个通道,且有动态接收窗口来限制数据传输快慢,且有各种标志号的报文对数据传输过程做控制,比如重传,紧急回复等
TCP把应用层数据变成数据流方式传输,跟动态发送窗口一起控制发送速率
第三步:三次握手后,浏览器发送报文,method/url/version,头部信息,请求主体等组成,method即为方法,常见有GET/POST,version为HTTP协议版本号,现为1.1
头部信息为补充,数据类型是键值对,比如host:www.baidu.com,请求主体,当方法为POST客户端会提交表单数据上去服务端
第四步:服务端收到报文,查看请求头部的信息,查找资源,如果有且能访问,返回答复报文,也包括method/url/version,头部信息,内容主体,
若资源为静态,那么直接把html代码返回给客户端,客户端根据代码再请求CSS/JS等内容,
若为动态资源,那么已PHP为例,通过请求头部信息以.php结尾的地址,nginx就会启动fastcgi把请求内容交给fastcgi程序处理,PHP解析代码,当需要跟数据库交互数据就会取数据库取数据
取完数据并且跟模板生成html代码发送给客户端
注:nginx取.php页面是通过用户态转换成内核态,由内核态去调用硬件资源,即磁盘文件,在磁盘拿到文件会放在内存中
注:在LINUX的ext3/4文件系统中,会划分inode与block,其中inode记录文件的属性,权限,时间与block号码的信息,block存放文件的真正数据
目录一般占用一个block,只起到保存目录下文件所在的inode号码,所以,查找index.php的时候,是先通过/的inode查到block,并从block得知index.php文件的inode,
再从文件的inode得知block的号码,最后取得数据。
拓展:当创建文件时,从inodemap取号码,从blockmap取号码,若划分了inode,block给了文件,但是由于系统断电,没来得及把数据写入block,那么会造成浪费,且文件空有名字却无数据
这时需要日志功能,未完待续
第五步:浏览器解析代码,并请求CSS/JS
第六步:浏览器引擎渲染页面并呈现给用户
详细参考资源:https://blog.51cto.com/linux5588/1351007
http://www.cnblogs.com/vamei/archive/2013/05/11/3069788.html