Http:

(hypertext transfer protocol)一种用于在WEB服务器传输超文本标记语言(HTML)到本地浏览器的传送协议。基于TCP/IP通信协议来传递数据。

http特点:

无连接:每次链接只处理一个请求,接受到客户端回应之后断开链接

无状态:对于事务处理没有记忆,后续处理需要前面的信息,则必须重传

http请求/响应的步骤

  • 1.客户端连接到Web服务器
  • 2.发送HTTP请求
  • 3.服务器接受请求并返回HTTP响应
  • 4.释放TCP连接
  • 5.客户端(浏览器)解析HTML内容

http常用方法

  • GET---获取资源
  • POST---传输资源
  • PUT---更新资源
  • DELETE---删除资源
  • HEAD---获取报文首部

get和post区别

  • get回退无害,post回退会再次提交请求
  • get请求地址会被主动缓存
  • get请求其中的参数会被保存在历史记录中
  • get的参数在url中能被看到,不安全,且长度有限制
  • get一般针对数据查询而post针对数据的增删改

http报文的组成部分

http请求报文

包括请求行,请求头部,空行和请求数据

请求行:请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。

GET /index.html HTTP/1.1。

请求头部:请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。

User-Agent:

Accept:

Host:

cookie:

token:

空行:最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。

请求数据:

请求数据只能在Post方法中使用,get方法无法使用

http响应报文

HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。

状态行:HTTP-Version Status-Code Reason-Phrase CRLF

http版本,响应状态码,状态码的文本描述,换行

HTTP状态码

  • 1xx:指示信息类,表示请求已接受,继续处理
  • 2xx:指示成功类,表示请求已成功接受
  • 3xx:指示重定向,表示要完成请求必须进行更近一步的操作
  • 4xx:指示客户端错误,请求有语法错误或请求无法实现
  • 5xx:指示服务器错误,服务器未能实现合法的请求

常见状态码:

  • 200 OK:客户端请求成功
  • 301 Moved Permanently:所请求的页面已经永久重定向至新的URL
  • 302 Found:所请求的页面已经临时重定向至新的URL
  • 304 Not Modified 未修改。
  • 403 Forbidden:对请求页面的访问被禁止
  • 404 Not Found:请求资源不存在
  • 500 Internal Server Error:服务器发生不可预期的错误原来缓冲的文档还可以继续使用
  • 503 Server Unavailable:请求未完成,服务器临时过载或宕机,一段时间后可恢复正常

https

https:是以安全为目标的 HTTP 通道,即 HTTP 下 加入 SSL 层进行加密。

http和https的区别

• http是明文传输,而https是有着ssl加密传输协议的。

• http的端口是80,而https的端口是443。

• Https 协议需要 ca 证书,费用较高。

https链接过程

https协议建立链接需要7次握手,首先是通过三次握手建立tcp协议,之后需要建立ssl链接

  1. 浏览器通过url向服务器发送请求,要求建立SSL连接。
  2. 服务器接受请求后返回公钥证书。
  3. 浏览器验证公钥证书是否有效,如果有效就生成会话密钥,并用公钥加密会话密钥发送给服务器。
  4. 服务器通过自己的私钥解密会话密钥。此时两方都有了相同的会话密钥。
  5. 服务器与浏览器通过会话密钥加密双方的通信。

对称加密:加密和解密使用同一个秘钥

非对称加密:发送端使用公钥加密,接收端使用私钥解密

https优缺点:

  • 安全,可以防止数据在传输过程中被窃取,改变
  • 比较费时
  • 缓存不如http高效,增加数据开销

TCP/IP协议族是互联网相关的各类协议族的总称,包括TCP,IP,FTP,HTTP

TCP/IP协议将网络分为四层:应用层,传输层,网络层,数据链路层

  1. 应用层:负责向用户提供应用程序,比如HTTP、FTP、Telnet、DNS、SMTP等。
  2. 传输层: 负责对报文进行分组和重组,并以TCP或UDP协议格式封装报文。
  3. 网络层:处理网络上流动的数据包。规定了通过怎样的路径到达对方计算机,并把数据包传送给对方(IP选址、路由选择)。
  4. 链路层: 用来处理链接网络的硬件部分,包括控制操作系统、驱动、网卡等等。

img

img

三个重要协议

一、IP

IP协议处于网络层,用于将各种数据包传给对方,其中最重要的两个条件是IP地址和MAC地址,IP地址是节点被分配到的地址,而MAC地址是网卡所属的固定地址,IP地址可以和MAC地址相互之间进行配对。

IP之间的通信依赖MAC地址,通常是经过多次中转,最终到达目的IP,而在中转时,需要使用ARP协议解析下一次中转的目标。

二、TCP

TCP协议是提供可靠服务的字节流服务,字节流服务是指将大块数据分割成报文段进行管理,可靠是指该协议能确保对方收到信息或者收到信息发送失败的指示。

三、DNS

DNS是一个通过域名查找IP地址或者通过IP地址逆向查找域名的协议

TCP三次握手四次挥手详解

与UDP相比,TCP是一种更加安全的服务,但是在效率上不如UDP

UDP,在传送数据前不需要先建立连接,远地的主机在收到UDP报文后也不需要给出任何确认。虽然UDP不提供可靠交付,但是正是因为这样,省去和很多的开销,使得它的速度比较快,比如一些对实时性要求较高的服务,就常常使用的是UDP。对应的应用层的协议主要有 DNS,TFTP,DHCP,SNMP,NFS 等。UDP支持单播,广播,多播等功能

TCP,提供面向连接的服务,在传送数据之前必须先建立连接,数据传送完成后要释放连接。因此TCP是一种可靠的的运输服务,但是正因为这样,不可避免的增加了许多的开销,比如确认,流量控制等。对应的应用层的协议主要有 SMTP,TELNET,HTTP,FTP 等。TCP仅支持单播功能

TCP在使用之前需要通过三次握手建立链接,在发送数据的过程中接收方需要发送确认信息已经收到的指令,否则将会重发消息,在断开链接时需要通过四次挥手

三次握手

img

SYN=1的为SYN报文段,不能携带数据,消耗一个序号

ACK=1的为应答报文段,可以携带数据

seq代表发送方本次发送的数据,在整个数据流之中的位置,则这次发送的数据的起始位置

ack代表接收方期待的下一次发送数据的起始位置(seq)是多少,通过上一次的发送方的seq和数据长度相加得到,发送给发送方作为下一次的seq使用

三次握手:

首先客户端发送一个SYN报文段,服务器接收到后发送一个应答的SYN报端,接受到第二次握手消息之后的客户端也发送一个应答报文段,从而建立起链接

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。

四次挥手

img

  1. 客户端发送链接释放报文,停止发送数据,释放数据报文首部,FIN=1,其序列号为seq=u,此时,客户端进入FIN-WAIT-1(终止等待1)状态
  2. 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,服务端就进入了CLOSE-WAIT,客户端向服务器方向释放,但是客户端依旧可以发送剩余需要发送的数据
  3. 客户端接收到服务器第一次确认请求之后,进入FIN-WAIT-2状态,等待服务器发送连接释放报文
  4. 服务器发送完最后的数据之后向客户端发送释放报文,服务器就进入了LAST-ACK(最后确认)状态
  5. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,客户端就进入了TIME-WAIT,等待2*MSL( Maximum Segment Life)的时间之后,客户端撤销响应的TCB之后,进入CLOSED阶段。

为什么要等待2MSL:A在发送了最后一条消息之后并不知道B有没有收到消息,如果没有收到,B会超时重新发送FIN消息,如果收到了,B不会发送任何消息,所以需要等待2MSL确保B收到了消息

HTTP的跨域问题

跨域问题的产生原因是因为浏览器的同源策略,这是浏览器最基本的安全功能,他组织一个域的js脚本和另外一个域的内容进行交互,如果没有这个策略,浏览器会很容易收到XSS,CSFR等攻击。同源策略要求协议,域名,端口都一致

解决方法:

JSONP:利用script 标签中的src属性可以访问跨域的js脚本这一特性,自定义一个函数然后再src中设置链接和callback函数,进行函数的调用

CORS:服务器设置Access-Control-Allow-Origin HTTP响应头之后,浏览器将会允许跨域请求

proxy代理:最常用的方法,前端不发送请求,让后端代发,数据一并传给前端,解决跨域问题

理解xss,csrf,ddos攻击原理以及避免方式

XSS(Cross-Site Scripting跨站脚本攻击)是一种代码注入攻击。攻击者在目标网站上注入恶意代码,当被攻击者登陆网站时就会执行这些恶意代码,这些脚本可以读取 cookie,session tokens,或者其它敏感的网站信息,对用户进行钓鱼欺诈,甚至发起蠕虫攻击等。

CSRFCross-site request forgery跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

XSS避免方式:

  1. url参数使用encodeURIComponent方法转义
  2. 尽量不是有InnerHtml插入HTML内容
  3. 使用特殊符号、标签转义符。
CSRF 避免方式:
  1. 添加验证码
  2. 使用token

    • 服务端给用户生成一个token,加密后传递给用户
    • 用户在提交请求时,需要携带这个token
    • 服务端验证token是否正确

DDoS又叫分布式拒绝服务,全称 Distributed Denial of Service,其原理就是利用大量的请求造成资源过载,导致服务不可用。

DDos避免方式:

  1. 限制单IP请求频率。
  2. 防火墙等防护设置禁止ICMP包等
  3. 检查特权端口的开放

浏览器的缓存机制 强制缓存&&协商缓存

img
浏览器在每次发起请求之前都会在缓存中先查找请求的结果和缓存标识

浏览器每次拿到的请求结果都会将改结果和缓存标识存入浏览器缓存中

决定是否使用缓存的过程分为强制缓存和协商缓存

强制缓存

控制强制缓存的字段分别是 ExpiresCache-Control

情况有三种:

  1. 不存在该缓存结果和缓存标识,强制缓存失效,则直接向服务器发起请求(跟第一次发起请求一致)。
  2. 存在该缓存结果和缓存标识,但该结果已失效,强制缓存失效,则使用协商缓存。
  3. 存在该缓存结果和缓存标识,且该结果尚未失效,强制缓存生效,直接返回该结果

协商缓存

协商缓存是在强制缓存失效之后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程,控制协商缓存的字段是:Last-Modified / If-Modified-SinceEtag / If-None-Match
Etag比Last-Modified优先级更高,且相对于last-modified,Etag有两个优势:

  1. Last-Modified只能精确到以秒为级别,而无法处理一秒多次改变的情况
  2. 有时文件会定时生成,但是内容并没有改变,使用last-modified会导致不能使用缓存
  3. 存在服务器端无法获取精确时间或者是时间不相同的情况
    Etag提供了一种更加精确控制缓存的方式

image-20220302152332737

可以看出,如果没有命中强缓存,通过缓存标识判断向服务器发送的请求中包含的字段,由服务器决策是返回304(使用缓存)还是200(重新发送数据)