浏览器从输入网址到渲染完整个页面的全过程
1. DNS(域名系统)解析:用户输入网址后,DNS根据域名查找IP地址。(域名是人类可以理解的地址,IP地址对应一台真实的物理机器,由于IP地址不容易记忆,所以输入人类可以理解的网址,DNS再根据域名查找地址)
2. TCP(传输控制协议:是主要的网络协议之一,能够使两台主机建立连接,并交换数据流。)连接。
TCP通过三次握手建立连接:客户端和服务端都需要知道各自可收发,因此需要三次握手。
第一次:客户端发送一个SYN(同步序列编号)消息,服务端确定自己能收到客户端发的消息。
第二次:服务端发送一个SYN+ACK应答表示接收了这个消息,客户端既确定自己能发送消息给服务端,也能确定自己可以接收服务端发的消息。
第三次:客户端发送一个ACK回应服务端,服务端确定自己能发送消息到客户端。
SYN是是TCP建立连接时使用的握手信号。
ACK是确认字符,表示发来的数据已确认接收无误。在TCP协议中,如果接收方成功的接收到数据,那么会回复一个ACK。
3. 向web服务器发送HTTP请求:浏览器根据解析到的IP地址和端口号发起HTTP请求。
请求报文包括 请求行(包含请求的方法、请求URI和HTTP版本)、请求报头(首部字段)、请求报文主体。
http支持的请求方法:
get : 从指定的资源请求数据,指定的资源经服务器端解析后返回响应内容。最常见的get请求就是通过在浏览器的地址栏中输入地址的方式。
post : 向指定的资源提交要被处理的数据。虽然get方法也可以传输实体主体,但一般不用get方法进行传输,而是用post方法。因为post这种方式相对于get请求来说要安全一些。
put :put方法用来传输文件。要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。但是HTTP/1.1的put方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,因此一般的网站不使用该方法。
head :head和get几乎相同,但head不返回报文主体部分,用于确认URI的有效性及资源更新的日期时间等,返回的是与报文主体部分有关的响应首部。
delete :用来删除文件,是与put相反的方法。delete方法按请求URI删除指定的资源。但是HTTP/1.1的delete方法本身和put方法一样不带验证机制,所以一般的Web网站也不使用delete方法。
options :查询针对请求URI指定的资源所支持的方法。
trace : 追踪路径,让Web服务器端将之前的请求通信返回给客户端的方法。发送请求时,在Max-Forwards首部字段中填入数值,每经过一个服务器端就将改数字减1,当数值刚好减到0时,就停止继续传输,最后接收到请求的服务器端则返回状态吗200OK的响应。
请求想要连接到源目标服务器可能会通过代理中转,客户端通过trace方法可以查询发送出去的请求是怎样被加工修改/篡改的,确认连接过程中发生的一系列操作。
trace方法本来就不常用,再加上容易引发XST(Cross-Site Tracing,跨站追踪)攻击,就更加不容易用!
connect:要求用隧道协议连接代理。
connect方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL和TLS协议把通信内容加密后经网络隧道传输。
请求报头:请求报头允许客户端向服务器传递请求的附加信息和客户端自身的信息。
请求报文主体:在使用post、put等方法时,需要客户端向服务器传递数据。这些数据就储存在请求报文主体中。
在form标签身上有两个常用的属性:
method: 指定当前表单提交的方式。属性值默认为get。
action:指定当前表单提交的地址。
<form method="post" action="http://localhost:3000"></form>
console.log(req.method)
//输出两个请求方式:post和get,这是因为在post提交完成之后,get进行页面跳转。
4.服务器处理请求并返回HTTP响应报文。
响应报文:包含状态行(包括响应结果的状态码、原因短语和HTTP版本)、响应报头(首部字段)和响应报文主体三部分。
状态码告知客户端从服务器端返回的请求结果。状态码由3位数字和原因短语组成。数字中的第一位指定了响应类别,响应类别分为5种:
类别 | 原因短语 | |
1XX | Informational(信息类状态码) | 请求已接收,接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Readirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
常见的状态码:
200 OK:表示请求被正常处理,如果页面需要更新以显示页面更新后的资源则返回200
204 No Content : 表示请求已成功处理,但在返回的响应报文中不含实体的主体部分。浏览器显示的页面不发生更新时返回204
301 Moved Permanently :永久性重定向,表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI
302 Found :临时性重定向,表示请求的资源已被分配了新的URI,希望用户(本次)使用新的URI进行访问,但是仍旧保留当前页面的URI
304 Not Modified :表示客户端发送附带条件的请求(If-Modified-Since)时,服务器端允许请求访问资源,但因请求未满足条件,直接返回304(服务器端资源未改变,可直接使用客户端未过期的缓存)304状态码返回时,不包含任何响应的主体部分。304虽然被划分在3XX类别中,但和重定向没有关系
400 Bad Request :该状态码表示请求报文中存在语法错误,当错误发生时,需修改请求的内容后再次发送
401 Unauthorized : 该状态码表示发送的请求需要有通过HTTP认证的认证信息。若之前已经进行过1次请求,则表示用户认证失败
403 Forbidden :该状态码表示对请求资源的访问被服务器拒绝了。未获得文件系统的访问授权,访问权限出现某些问题等情况都可能发生403
404 Not Found :该状态码表示服务器端无法找到请求的资源,除此之外,也可以在服务器端拒绝请求且不想说明理由时使用
500 Internal Server Error :该状态码表示服务器端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障
响应报文主体 :服务器返回给浏览器的文本信息,通常HTML, CSS, JS, 图片等文件就放在这一部分。
使用res对象(res对象就是响应对象)下面的writeHead方法对客户端进行响应。res下面的writeHead方法有两个参数,一个是状态码,一个是对象,这个对象里面是响应头里面的信息。
res.writeHead(200,{ 'content-type' : 'text/plain;charset=utf8'//代表返回的内容是纯文本
//charset=utf8当内容为中文时,防止乱码。});
5.浏览器解析渲染页面
6.连接结束