互联网运行主要围绕着客户端、服务器、数据库三个部分展开。首先用户在浏览器输入域名,此时浏览器会向DNS域名服务器发送域名解析请求,DNS域名服务器查到对应的IP后将IP地址返回给客户端。浏览器会携带IP向服务器发送HTTP请求,在发送请求前客户端会三次握手向服务器建立连接,连接建立好后客户端开始向服务器发送HTTP请求进行会话。当服务器接收到客户端发送的请求后服务器会提取请求的参数,处理对应的逻辑并向数据库发送SQL查询的请求,数据库查询到数据后向服务器返回对应的数据结果,服务器接收到数据后并处理数据得到最终的结果,服务器将响应数据传给客户端,服务器四次挥手断开与客户端之间的连接,客户端获取到数据后进行页面渲染解析CSS、JS样式,如果存在ajax异步,则执行异步操作。
(1)DNS域名解析
DNS是一个分布式数据库,上面记录了域名和其IP 地址对应关系,在浏览器中输入网址时浏览器首先先连接DNS服务器获取到该域名的IP地址后浏览器在连接访问该IP的服务器有了DNS后,之后服务器IP地址有了变化重新绑定一下域名和新IP地址就可以了,这样就不会影响到访问站点的用户。
(2)三次握手
当客户端给服务器发送一个syn的报文,当服务器接收到请求后知道了客户端需要建立连接。于是服务器会给客户端发送一个syn包和ack确认包。当客户端收到确认包之后,客户端就知道了我既能发送数据又能接收数据,但是服务器只知道自己能接收数据,不知道自己发送给客户端的数据客户端能否接收到,所以需要第三次握手,客户端给服务器发送一个ack位置的报文,完成以上步骤后操作结束.
(3)发送请求
-------------------------------------------------请求方法-------------------------------------------------------------------
- get请求:请求指定页面的信息,并从服务器端得到资源
- Post请求:向指定资源提交数据进行处理请求(例如:提交表单上传文件),数据包含在请求体中
- put请求:从客户端向服务器传送数据取代指定文档内容
- delete请求:请求服务器删除指定的页面
- Connections:HTTP/1.1协议中预留给能够连接改为管道方式的代理服务器
- Options:允许客户端查看服务器性能
- Trace请求:回显客户端查看服务器性能
- head请求:类似于get请求,只不过返回响应中没有具体的内容,用于获取报头
get/post区别
- 浏览器在地址栏输入网址打开都是get请求
- get请求正文一般为空因为get的请求参数一般放在url中(以查询字符串的形式)post请求参数放在请求正文中
- 因为url长度存在限制(也就意味着get请求的参数是有长度限制)post长度不会(post数据是放在正文中的)
- 因为get的请求参数一般放在url中可以直接通过url查看参数信息所以不安全post相对安全(因为post参数放在正文中)
- get请求数据因为在URL中会被URL编码(只接收ascii字符)post不会且支持多种编码方式
- get请求回退无害post回退可能会造成重复提交
----------------------------------------------------url地址-------------------------------------------------------------------
URL地址:URL是对互联网上得到的资源的位置和访问方法的一种简洁表示,是互联网上标准资源的地址
(1)protocol协议:
http:通过http访问该资源
https:通过安全的HTTPS访问该资源
ftp协议:通过FTP访问资源
HTTP和HTTPS协议的区别:
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL (Secure Sockets Layer)协议
用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS.简单来说,HTTPS 协议是由SSL+ HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
1. http协议不安全,是明文传输; https 协议安全性高,加密传输
2. http 不需要申请证书,而https需要申请证书
3. http 的默认端口是80,而https的默认端口是443
(2)hostname主机名:
是指存放资源的服务器的域名系统(DNS) 主机名或 IP 地址
(3)Port端口号:
HTTP缺省工作在TCP协议80端口,用户访问网站http:// 打头的都是标准HTTP服务。HTTPS缺省工作在TCP协议443端口。
(4)path路径:
由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。
(5)Parameters参数:
这是用于指定特殊参数的可选项。
(6)query查询:
可选,用于给动态网页(如使用CGI、ISAPI、PHP/JSP/ASP/ASP。NET等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。
(7)fragment信息片段:
信息片断,字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释。
----------------------------------------------------协议版本-----------------------------------------------------------------
HTTP/1.1 HTTP:协议类型 1.1 版本号
----------------------------------------------------请求头--------------------------------------------------------------------
Host:表示该请求所对应的服务器地址,地址可以是域名,可以是IP地址,也可以是手动指定端口号
Referer:先前网页的地址,当前请求网页紧随其后
User-Agent:发出请求的用户信息
Accept-Charset:浏览器可接受的字符集
Accept-Encoding:浏览器能够进行解码的数据编码方式
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到.
Authorization:HTTP授权的授权信息
Content-Length:表示body的长度,单位是字节、GET中没有body
Connection:keep alive 连接状态
Content-Type:表示body的格式。只有该请求是POST时,才会带上Content-Length和Content-Type
(4)会话
1.HTTP无状态
客户端向服务器发送请求后退出,请求会消失,下次访问时重新创建连接
2.Cookie
1.HTTP
客户端向服务器发送请求后退出,请求会消失,下次访问时重新创建连接
2.Cookie
cookie是浏览器实现的一种数据存储技术。一般由服务器生成,发送给浏览器(客户端也可进行
cookie设置)进行存储,下一次请求同一网站时会把cookie发送给服务器
cookie的特点:
- cookie存储在客户端(浏览器上),发送请求时自动携带放在请求头中
- cookie只能以文本的方式保存字符串类型的数据
- 单个cookie保存的数据不能超过4kb
- cookie的安全性不高,别人可以分析存放在本地的cookie并进行cookie欺骗
3.Session
用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对应的session。请求返回时将此session的唯一标识信息SessionID返回给浏览器。浏览器接收到浏览器返回的SessionID信息后,会将此信息存入到Cookie中,同时Cookie记录此时SessionID属于哪个域名。当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在cookie信息,如果存在自动将cookie信息发送给服务端,服务端会从Cookie中获取SessionID查找对应的session信息,如果没有找到说明用户没有登录或者登录失效,如果找到session证明用户已经登录可执行后面操作
Session的特点:
- session是基于cookie实现,cookie失效或删除则session也无法获取
- Session是存储在服务器端,所以安全性比cookie高
- Session可以存储任意数据类型
- Session的默认生效时间是30分钟。只要在生效时间内,即使该session值已被修改,依然可通过旧有的Cookie访问到旧有的session值
- Session可存储数据的容量远高于cookie,但是当访问量过多,会占用过多的服务器资源
4.Token
虽然Session具备一定的安全性,但是它的问题在于扩展性不好。比如涉及到服务器集群的场景,要求每台服务器能够读取session。这种场景解决方案是session共享,经典应用需求是A和B两个关联网站间的单点登录,但是这种方案一般工程量较大。于是便出现另一种服务器无需保存session的技术方案:token
Token = uid + time + sign
uid:用户唯一的身份凭证
Time:当前时间的时间戳
Sign:签名,将token和时间戳加上其他请求参数再用HASH散列算法加密,加密后的数据就是本次请求的签名
验证流程:
- 客户端使用用户名跟密码请求登录
- 服务器收到请求后,去验证用户名与密码
- 验证成功后,服务端会签发一个token并把这个token发送给客户端
- 客户端收到token以后,会把它存储起来,比如放在cookie里或者localStorage里
- 客户端每次向服务端请求资源的时候需要带着服务端签发的token
- 服务端收到请求,然后去验证客户端请求里面带着token,如果验证登录成功,就向客户端返回请求数据
Token特点:
- 每一次请求都需要携带token,需要把token放到http的header里
- token签发后存储在客户端,不占用服务器资源,可减轻服务器压力
- 使用token无需担心跨域问题,可自由使用
总结:
由于cookie安全性低,所以发明了session;但是当用户同时在线量比较多时,session会占据较多的内存,为了节省服务器的内存资源,所以发明了token,用解析token的计算时间换取session的存储空间,从而减轻服务器的压力,减少频繁的查询数据库
(5)响应数据
响应状态码
(6)四次挥手
- A与B交谈结束之后,A要结束此次会话,对B说:我要关闭连接了(seq=u,FIN=1)。(第一次挥手,A进入FIN-WAIT-1)
2.B收到A的消息后说:确认,你要关闭连接了。(seq=v,ack=u+1,ACK=1)(第二次挥手,B进入CLOSE-WAIT)
3.A收到B的确认后,等了一段时间,因为B可能还有话要对他说。(此时A进入FIN-WAIT-2)
4.B说完了他要说的话(只是可能还有话说)之后,对A说,我要关闭连接了。(seq=w,ack=u+1,FIN=1,ACK=1)(第三次挥手)
5.A收到B要结束连接的消息后说:已收到你要关闭连接的消息。(seq=u+1,ack=w+1,ACK=1)(第四次挥手
6.B收到A的确认后,也进入CLOSED。