# 常见网络题目
# 前端发送表单到后端的报文结构
# HTTP请求报文结构
一个HTTP请求报文由四个部分组成:
- 请求行: 由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,用空格分隔。比如 GET /data/info.html HTTP/1.1
- 请求头: 指明请求类型(一般是GET或者 POST)。如有必要,客户程序还可以选择发送其他的请求头。大多数请求头并不是必需的,但Content-Length除外。对于POST请求来说 Content-Length必须出现。
- 空行: 它的作用是通过一个空行,告诉服务器请求头部到此为止
- 请求体: 若方法字段是GET,则此项为空,没有数据;若方法字段是POST,则通常来说此处放置的就是要提交的数据
示例:
参考文章: http请求/响应报文结构 (opens new window)
# 用户输入url到页面呈现的过程
URL
统一资源定位符,用于互联网上不同的资源的标识,就像不同的人有不同的身份证一样
URL组成:
- 用户输入url
- 浏览器查找域名的IP地址 域名解析(DNS解析)
- 找到IP地址后,建立TCP三次握手 (opens new window) ,与目标服务器建立连接
- 握手成功后,通过规定的协议(http),浏览器向目标主机发送http请求,请求数据包
- 服务器处理收到的请求,将数据返回至浏览器
- 浏览器收到HTTP响应报文
- 关闭连接 浏览器解析文档
- 读取页面内容,浏览器渲染,解析html源码
- 生成Dom树、解析css样式、js交互
【简略版】
- 域名解析(DNS解析)
- TCP连接
- 发送http请求
- 服务器处理请求并返回HTTP报文
- 浏览器解析渲染页面
- 连接结束
# 域名解析(DNS解析)
浏览器会把输入的域名解析成对应的ip,解析分为几部分进行。
- 查看浏览器内部缓存,如果查到域名对应的ip,就发送和接受参数和数据
- 查看本机的host文件,浏览器会在本机的hosts文件查看是否有对应的ip服务器地址。
- 查看本地路由器的DNS缓存,找到对应的ip
- 查看网络服务商中DNS服务器
- 查询根域名下是否存在。 上述5步找到对应的ip地址后
- 询到目标IP地址后,则开始建立TCP三次握手 (opens new window) ,与目标服务器建立连接。
- 通过规定的协议(http)向目标主机发送请求
# 浏览器如何渲染页面
# 主要过程
用户输入网址(假设是个 HTML 页面,第一次访问,无缓存情况),浏览器向服务器发出HTTP请求,服务器返回 HTML 文件; (善用缓存,减少HTTP请求,减轻服务器压力)
浏览器载入 HTML 代码,发现
<head>
内有一个<link>
引用外部 CSS 文件,则浏览器立即发送CSS文件请求,获取浏览器返回的CSS文件; (CSS文件合并,减少HTTP请求)浏览器继续载入 HTML 中
<body>
部分的代码,并且 CSS 文件已经拿到手了,可以开始渲染页面了; (CSS文件需要放置最上面,避免网页重新渲染)浏览器在代码中发现一个
<img>
标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码;(图片文件合并,减少HTTP请求)服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码;(最好图片都设置尺寸,避免重新渲染)
浏览器发现了一个包含一行 JavaScript 代码的
<script>
标签,会立即运行该js代码;(script最好放置页面最下面)js脚本执行了语句,它令浏览器隐藏掉代码中的某个
<div>
,突然就少了一个元素,浏览器不得不重新渲染这部分代码;(页面初始化样式不要使用js控制)终于等到了
</html>
的到来,浏览器泪流满面……等等,还没完,用户点了一下界面中的“换肤”按钮,JavaScript 让浏览器换了一下
<link>
标签的 CSS 路径;浏览器召集了在座的各位
<div><span><ul><li>
们,“大伙儿收拾收拾行李,咱得重新来过……”,浏览器向服务器请求了新的CSS文件,重新渲染页面。
# 影响页面渲染速度的因素: Repaint(重绘)和Reflow(回流)
Repaint(重绘)
只是改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性
Reflow(回流)
元件的几何尺寸变化,比如页面上某些元素的占位面积、定位方式、边距等属性的变化
# GET和POST的区别
GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的
GET和POST的实质上是没有区别的,只是报文格式不同,我们常说的是区别是指在浏览器实现上的区别
# 浏览器实现的区别:
GET | POST |
---|---|
从服务器获取资源 | 提交资源到服务器 |
在url上传参,长度受限制 | 在body里传参,长度不受限制 |
能被缓存 | 不能被缓存 |
安全性较差,因为url可见参数 | 比较安全 |
注意
- GET 方法的长度限制大多是浏览器和服务器的原因,HTTP 协议没有 Body 和 URL 的长度限制,
- 从传输的角度来说,POST 和 GET 都是不安全的,因为 HTTP在网络上是明文传输的,要想安全传输,可以加密使用HTTPS
# 报文上的区别:
- 不带参数时,最大区别就是第一行的方法名不同:
GET方法请求报文第一行:
GET /uri HTTP/1.1
POST方法请求报文第一行:
POST /uri HTTP/1.1
- 带参数时报文的区别:
GET 方法简约版报文是这样的
GET /index.html?name=fanmy&age=24 HTTP/1.1
Host: localhost
2
POST 方法简约版报文是这样的
POST /index.html HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
name=fanmy&age=24
2
3
4
5
← 前言 HTTP请求/响应报文结构 →