网络编程(5)计算机网络基础(包含cookie/session/token)
计算机网络基础
http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议。有状态的话,会占用服务器的资源
一、DNS域名解析
我们在浏览器输入网址,其实就是要向服务器请求我们想要的页面内容,所有浏览器首先要确认的是域名所对应的服务器在哪里。将域名解析成对应的服务器ip地址这项工作,是由DNS服务器来完成的。
客户端收到你输入的域名地址后,它首先去找本地的hosts文件,检查在该文件中是否有相同的域名、IP对应关系,如果有,则想起它ip地址发送请求,如果没有,再去找DNS服务器。一般用户很少去编辑修改hosts文件。hosts文件的默认路径:c:\windows\system32\drivers\etc\hosts
二、建立TCP连接
三次握手:
客户端发送一个带有SYN
标志的数据包给服务端,服务端收到后,回传一个带有SYN/ACK
标志的数据包以示传达确认信息,最后客户端再回传一个带ACK
标志的数据包,代表握手结束,连接成功。
上图也可以这么理解:
客户端:“你好,在家不,有你快递。”
服务端:“在的,送来就行。”
客户端:“好嘞。”
三、发送http请求
与服务器建立了连接后,就可以向服务器发起请求了。请求结构如下:
四、服务器处理请求
服务器端收到请求后的由web
服务器(准确说应该是http
服务器)处理请求,诸如apache
、Nginx
、IIS
等。web
服务器解析用户请求,知道了需要调度哪些资源文件,再通过响应的这些资源文件处理用户请求和参数,并调用数据库信息,最后将结果通过web
服务器返回给浏览器客户端。
五、返回响应结果
在http
里,有请求就会有响应,哪怕是错误信息。响应报文的组成结构:
在响应结果中都会有一个HTTP
状态码,比如我们熟知的200、301、404、500
等。通过这个状态码我们可以知道服务器端的处理是否正常,并能了解具体的错误。
六、关闭TCP连接
为了避免服务器与客户端双方的资源占用损耗,当双方没有请求或响应传递时,任意一方都可以发起关闭请求。与创建TCP
连接的3次握手类似,关闭TCP
连接,需要4
次握手。
4次挥手:
上图可以这么理解:
客户端:“兄弟,我这边没数据要传了,咱关闭连接吧。”
服务端:“收到,我看看我这边有木有数据了。”
服务端:“兄弟,我这边也没数据要传你了,咱可以接了。”
客户端:“好关闭连嘞。”
为什么要保持长连接?
因为不可能每次请求都要进行三次握手和四次挥手,这样太费时间,效率不高。
Keep-Alive
:使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive
功能避免了建立或者重新建立连接。Web
服务器,基本上都支持HTTP Keep-Alive
。
七、浏览器解析HTML
准确地说,浏览器需要加载解析的不仅仅是HTML,还包括CSS、JS。以及还要加载图片、视频等其他媒体资源。
浏览器通过解析HTML,生成DOM树,解析CSS,生成CSS规则树,然后通过DOM树和CSS规则树生成渲染树。渲染树与DOM树不同,渲染树中并没有head
、display
为none
等不必显示的节点。
要注意的是,浏览器的解析过程并非是串连进行的,比如在解析CSS的同时,可以继续加载解析HTML,但在解析执行JS脚本时,会停止解析后续HTML,这就会出现阻塞问题,关于S阻塞相关问题,这里不过多阐述后面会单独开篇讲解。
八、浏览器布局渣染
根据渲染树布局,计算CSS
样式,即每个节点在页面中的大小和位置等几何信息。HTML
默认是流式布局的,CSS
和js
会打破这种布局,改变DOM
的外观样式以及大小和位置。这时就要提到两个重要概念:replaint
和reflow
。
replaint
:屏幕的一部分重画,不影响整体布局,比如某个CSS
的背景色变了,但元素的几何尺寸和位置不变。
reflow
:意味着元件的几何尺寸变了,我们需要重新验证并计算渲染树。是渲染树的一部分或全部发生了变化。这就是Reflow
,或是Layout
。
补充
DNS
(Domain Name System
)服务是和HTTP
协议一样位于应用层的协议。它提供域名到IP地址之间的解析服务。
计算机既可以被赋予IP
地址,也可以被赋予主机名和域名。比如www.hackr.jp。
用户通常使用主机名或域名来访问对方的计算机,而不是直接通过IP地址访问。因为与IP地址的一组纯数字相比,用字母配合数字的表示形式来指定计算机名更符合人类的记忆习惯。
建立HTTP
连接
浏览器解析URL
拿到协议,IP
和端口后,通过TCP
与对应服务器建立连接,这个过程称为3
次握手,如下图,SYN
,ACK
表示存放在TCP
的标志位
第一次握手: 首先客户端发起请求,带着
SYN=1
,表示我想要创建连接第二次握手: 服务器收到请求后,告诉客户端:我收到了,回复
ACK=1
,此时标识位就变为SYN=1
,ACK=1
第三次握手: 到第
2
步服务器回复时,理论上就已经创建连接成功了,但为了防止意外,客户端又做了一次确认,告诉服务器我收到你的回复啦,此时只用发送
ACK=1
标志位就可也了到此
HTTP
连接成功!!!
断开HTTP
连接
HTTP
建立连接时只能由客户端发起,而断开时可以由客户端和服务器端任意一方发起
第一次挥手:主机
A
(可以为客户端或服务器端)向主机B
发送一个FIN
标志位,表示我没事做了请求关闭连接第二次挥手:主机
B
收到FIN
后,向主机A发送一个ACK
回复,表示我也没数据发送了,可以关闭连接第三次挥手:因为连接是双向的,此时主机
B
也会向主机A
发送FIN
标志位,请求客户端关闭连接第四次挥手:主机
A
收到主机B
发送的FIN
后,向主机B
发送ACK
回复,此时主机B
收到后会关闭连接,主机
A
在长时间等不到主机B
的回复后,自己也就关闭了连接以上就是整个
HTTP
请求的全过程了,专业术语描述的不够准确,能理解过程就好了!!!
cookie
和session
的用途
要知道我们访问网站都是通过HTTP协议或HTTPS协议来完成的,HTTP协议它本身是无状态的协议(即:服务器无法分辨哪些请求是来源于同个客户)。而业务层面会涉及到客户端与服务器端的交互(同网站下多个页面间能共享数据),此时服务器端必须要保持会话状态,这样才能进行用户身份的鉴别。
由于HTTP无状态的特性,如果要实话客户端和服务器端的会话保持,那就需要其它机制来实现,于是Cookie和Session应运而生。
cookie主要是网站用于在浏览器临时存放的数据,包括浏览器缓存数据以及服务器设定的一些数据,主要存放在浏览器端。
session主要用于保存会话数据,一般存储在服务器端,同时每一条session对应一个sessionID,sessionID是存放在浏览器的cookie中。
传统上的会话登陆和鉴权主要用session加cookie实现,随着分布式系统的快速演进,尤其是微服务的应用,token+cookie的授权访问机制得到亲睐,通常在用户登录后,服务器生成访问令牌(Access token),浏览器存储cookie中,在每次请求资源时都会在请求头中带上token,用于服务器授权访问使用。
通常情况下,Session
和Cookie
是搭配在一起使用的。
Token
机制其实和Cookie
机制极其相似,主要有以下流程:
1、用户登录进行身份认证,认证成功后服务器端生成Token返回给客户端;
2、客户端接收到Token后保存在客户端(可保存在Cookie、LocalStorage、SessionStorage中);
3、客户端再次请求服务器端时,将Token作为请求头放入Headers中;
4、服务器端接收请求头中的Token,将用户参数按照既定规则再进行一次签名,两次签名若一致则认为成功,反之数据存在篡改请求失败。
小结:
(机制都是一样的,保存的地方不一样)
cookie
:保存在浏览器中,有大小限制,有状态;用cookie
的话,直接添加cookie
管理器
session
:保存在服务器中,服务器有资源开销;
Token
:客户端可以将Token
保存到任何地方,无限制,无状态,利于分布式部署。用token
的话,就用关联
cookie session token
登录是有 有效期的,可以问开发,token
有效期是多少
cookie
:保存在浏览器中是有大小限制、时间限制的。(用来保持登录状态)
session
流程:
token
:客户端可以将token
保存到任何地方,无限制,无状态,利于分布式部署