当我们从浏览器输入网址敲回车后,客户端和服务端做了什么

当我们从浏览器输入网址敲回车后,客户端和服务端做了什么
=======================================
客户端处理(为了拿到服务器的网页)
1.用户在浏览器中输入URL地址(统一资源定位符),它定位了网页在服务器的位置
2.浏览器发请求找URL指向的网页(用户回车)
. 浏览器解析URL地址=>域名+端口+路径信息等等
. 浏览器发起一个DNS系统调用,目的是找到域名对应的服务器IP
. 浏览器先查看浏览器本地是否有没有缓存(可以在浏览器中看到),如果有直接访问
. 如果浏览器没有找到对应的缓存,就交给操作系统继续解析DNS,
. 操作系统先检查操作系统本身有没有缓存(host文件),如果有交给浏览器直接访问
. 如果都没有找到,会对DNS服务器发起一个系统调用(DNS服务器是一个ip,运营商分配的,连接宽带就有)
. 系统向DNS服务器发起解析请求,DNS会把解析域名返回一个IP供给浏览器访问
3.DNS服务器
. DNS不会直接返回IP,比如baidu.com,这个com是一个顶级域名,而宽带的DNS服
务只是知道这些顶级域名服务器的地址,然后让系统去com对应的服务器来解析IP,
因为是他们旗下的域名,但如果是www开头的,还需要进一步让baidu的服务器去找
所以说子域用得越深
DNS解析的过程就越长,时间越长,所以有些域名是没有www域的
总结:DNS服务器会返回网页的IP,但如果没有,会返回一个有这个域名的服务器的IP
我们找到这个服务器让起解析,如果没有继续返回关联的DNS服务器IP,直到找
到为止,最终返回给浏览器,
4:浏览器会建立一个与服务端之间的连接通道
每个服务器就像一个封闭的大厦,IP就相当于街道门派号,端口就相当于开放的大门
在网络范围内,所有的IP都是一个个孤岛,如果想要连接,就需要连接一条通道,
而浏览器也需要给本机“开门”(开放端口),浏览器会通过一个本地随机端口建立连接
5:浏览器会将客户端的一些信息打成“包”
将这个“包”通过这个连接通道发送到服务端
“包”包括浏览器的信息,浏览器版本信息,请求的方式,缓存等等
~~~至此客户端的操作告一段落~~
服务端处理
1:服务端收到了浏览器的“包”
2:此时web Server(Apache)登场,Apache一直监听着80端口(默认情况下)
3:由于一直监听着端口,所以“包”进入web Server(Apache)里面,开始处理
4:打开客户端提交过来的“包”,拿到包里面的请求路径(要知道里面有这个东西)
5:根据请求的路径对应文件的扩展名找到文件的MIME Type(text/html),配置文件在mine.types
一种类型对应一种MIME Type
6:判断文件类型是静态文件还是动态文件
7:如果是动态文件,Apache优先询问小弟(模块文件)是否能处理文件,如果都不能,则Apache
都按照静态文件处理(Apache不能处理动态文件)
. php读取动态文件代码并执行
. 将执行结果返回给web Server(Apache)
8:如果是静态文件,直接读取这个文件的内容
9:服务端会把要发给客户端的数据打一个”包“
10:将这个”包“通过之前的连接通过通道发回给客户端
返回的”包“
包含一个HTML和一些附加信息
客户端渲染阶段
1:打开服务端返回过来的”包“,找到contentType
2:根据content-Type决定如何处理响应的内容(有css,html,js,图片等等)
3:如果界面有js,css,图片连接,有需要发请求,重复上面所有的流程

最终将页面的效果显示在浏览器窗口上呈现给用户


=======================================
http协议
指打包的规则,要让浏览器或者说客户端能够读懂,就需要遵守一定的规则,这就是HTTP
(超文本传输协议)
标准的说话是:计算机之间沟通的一种标准协议,这种协议限制了通讯内容的格式以及各项内容的含义
包括:
。请求/响应报文格式
。请求方法--GET/POST
。响应状态--200/404/302/304
。预设的请求/响应头
报文
//在浏览器控制面板下Network选项卡里面查看
http协议规定了请求/响应报文的格式
浏览器包装的请求”包“叫做“请求报文
web Server包装的响应”包“叫做”响应报文“
请求报文格式:
请求行 GET/index.html HTTP/1.1
请求头 Host:baidu.com
Connecton:keep-alive
User-Agent:Mozilla/5.0(window 10......
Accept:text/html,application.....
......
空行
请求体 ......(正常情况下get请求体都是空的)
响应报文:
状态行 HTTP/1.1 200 OK
响应头 Date:Tue,26 Sep 2017 10:23:04 GMT
Connection:keep-alive
Keep-Alive:timeout=5,max=96
Content-Type:text/html
Content-Length:16228
空白行
响应体 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form action="<?php echo ($_SERVER['PHP_SELF']);?>" method="post" enctype="multipart/form-data">
<input name="abc" type="file">
<button>提交</button>
</form>
</body>
</html>
提交表单时也会发送请求报文
因为get方法是通过url地址传输数据的,所以请求体里面是没有数据的
但是我们可以通过post方法提交表单,这样请求体里面就是提交的表单的信息
超文本
普通的文本只能传输信息,超文本是有格式的,比如html,doc
https
https是加密版的http,将报文加密了,更为安全
content-Type
后面跟文件需要解析的格式,如果是text/html浏览器就会解析成网页,如果是text/css就会解析成样式文件
如果是text/javascript就会被解析成js页面,
所以浏览器解析文件不是以后缀为标准,而是响应头中content-Type声明的类型为标准
另外content-type还会声明页面的编码格式,UTF-8,GBK这种,出现乱码的情况多是页面输入和解析的
编码方式不一致,
ps:如果浏览器不能解析某种格式,则会弹出下载框,让用户下载该文件
PHP header()函数
header()函数用于设定响应报头的头信息,比如
header("content-type:UTF-8") 声明编码格式
header("loaction:www.baidu.com") 页面重定向(跳转到指定页面),切记不能定向到当前页面,不然会报错
还可以修改很多头信息。。。。。

HTTP会话
1.Cookie
HTTP很重要的一个特点就是无状态(每一次见面都是“初次见面”),如果单纯的希望通过我们服务端的程序程序
去记住每一个访问者是不可能的,必须使用一些手段让服务端记住客户端,这种手段就是Cookie
Cookie就像是超市给消费者的小票,由超市(Server)发给消费者(Browser),超市不需要记住每一个消费者,而是
通过小票知道消费者之前的消费信息(提交的数据,辨识用户)
作用:
在我们之前验证用户名,或者上传文件当某些数据不能达到服务端的接受要求时,我们会使用上次GET的
数据来填充,但是一旦离开这个页面这个数据就会随之销毁,当我们任何时候都想要访问到上次上传的数据
这就需要用到Cookie,这让服务器可以辨识到当前客户端(浏览器)并且记住之前的提交的数据、做出的操作
举例:网站记住登录用户名,网页广告特定客户端免广告(特定显示)

猜你喜欢

转载自www.cnblogs.com/loveHtml/p/12102552.html
今日推荐