HTTP基本知识

HTTP

一、什么是HTTP协议?

HTTP是一种超文本传输协议,是一个基于请求和响应无状态应用层协议,基于TGP/IP协议传输数据,基于TGP之上,是一个标准协议.

无状态:指协议对于交互式性场景没有记忆能力,就是说你每次的请求都是一个全新的请求,请求和请求之间是相互独立的,服务器不会记录客户端的请求信息。

​ 那问题来了,服务器不能记录用户信息,那怎么识别客户端的身份呢?答案是使用SessionCookie.

二、HTTP协议组成

HTTP请求Request四部分组成:

  • 请求行:用来说明请求类型,要访问的资源以及所使用的HTTP版本,之间使用空行分隔

    例如:GET /index.html HTTP/1.1

  • 请求头(部):紧接在请求行之后的部分,用老说明服务器要使用的附加信息

  • 空行:请求头部后面的部分必须是空行,即使第四部分的数据为空,也必须要有空行

  • 请求数据:请求数据也叫主体,可以添加任意的其他数据

HTTP响应消息Response四部分组成:

例子:HTTP/1.1 200 OK

  • 状态行:由HTTP版本号状态码状态消息三部分组成。

    HTTP/1.1表明HTTP版本为1.1版本,状态码为200,状态消息为ok

  • 消息报头(响应头部):用来说明客户端要使用的一些附加信息

  • 空行:消息报头后面的空行是必须的

  • 响应数据(响应正文):服务器返回给客户端的文本信息

当我们打开浏览器的F12开发者工具的NetWork,点开一条信息,可以看到:

在这里插入图片描述

其中:

  • Request URL:请求路径
  • Request method:请求方法(LINK,UNLINK已被http/1.1废弃)
  • Status Code:响应状态码
  • Remote Address:域名解析后的地址(http协议用的是80端口,https协议使用的是443端口)
  • Response Headers:响应头部
  • Request Headers:请求头部

三、请求方法:

8种方式:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
常用的方式:
  • GET方式:用于查询,获取内容
  • POST方式:向指定资源提交数据(例如提交表单或者上传文件),数据包含在请求体中。POST请求可能会导致新的资源的建立或者已有资源的修改。
  • PUT方式:主要用于修改
  • DELETE方式:主要用于删除
  • 其他不大用…
POST方式和GET方式的区别:
  • GET方法会把参数添加到action所执行的URL后面,用?号分隔,每个变量之间用&连接。而POST方法会通过request body传递参数。
  • GET方法在浏览器回退时是无害的,而POST方法在回退时会再次提交请求
  • GET请求会被浏览器主动cache(缓存),而POST默认不会被缓存除非你手动设置
  • GET请求只能进行URL编码,而POST支持多种编码方式。
  • GET请求参数会被完整保留在浏览器历史记录中,而POST方法中的参数不会被保留
  • GET请求在URL中传送的参数是有长度限制的,而POST没有限制
  • 对于参数的数据类型GET只接受ASCII字符,而POST没有限制
  • GET不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息
  • GET方式产生一个TCP数据包POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器返回数据响应200;而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器返回数据响应200 ok。形象一点说:GET方式的汽车只跑一趟,因为运输的数据不是敏感数据都是些普通货物,而POST方式执行的是特殊任务高度机密,为了保证任务能够顺利的完成,就必须做好大量的准备工作,先跑去和服务器端打个招呼,告诉他我要运输高度机密的敏感文件了,让它做好沿途警戒和迎接的准备,等到服务器端响应了100后,我们就达成了共识,开始执行任务运输货物,运输完成,服务器返回200,则任务圆满完成。

四、HTTP响应码

HTTP响应码,也叫做HTTP状态码(HTTP Status Code),反应了Web服务器处理HTTP请求的状态。

常用HTTP响应码分为五大类

  • 1XX:信息类,表示收到http请求,正在进行下一步处理,通常是一种瞬间的响应状态

  • 2XX成功类:表示用户请求被正确接收、理解和处理

    • 200(ok):请求成功。一般用于GET与POST请求
    • 201(Created):已创建。成功请求并创建了新的资源
    • 202(Accepted):供处理的请求已被接受,但是处理未完成。
  • 3XX重定向类,表示没有请求成功,必须采取进一步的动作

    • 301(Moved Permanently):资源被永久移动,请求的资源已被永久的移动到新的URL,返回信息会包括新的URL。浏览器会自动定向到新的URL,今后任何新的请求都应使用新的URL
    • 302(Found):资源临时移动
    • 304:用其他策略获取资源
  • 4XX客户端错误(Client Error),表示客户端提交的请求包含语法错误或不能正确执行

    • 400(Bad Requests):客户端请求的地址不存在或者包含不支持的参数
    • 401(Unauthorized):未授权,或认证失败,一般用于登录操作
    • 403(Forbidden):没有权限,服务器收到请求,但拒绝提供服务。
    • 404(Not Found):请求的资源不存在,遇到404首先检查请求url是否正确
  • 5XX服务器端错误(Server Error),表示服务器不能正确执行一个正确的请求(客户端请求的方法及参数是正确的,但服务器端不能正确执行,如网络超时、服务僵死,可以查看服务端日志再进一步解决)

    • 500(Internal Server Error):服务器内部错误,无法完成请求
    • 503(Service Unavailable):由于超载或系统维护(一般是访问人数过多),服务器无法处理客户端的请求,通常这只是暂时状态。

五、Session、Cookie和application

  1. Session机制

    Session机制采用的是在服务器端保持HTTP状态信息的方案,为了加速session的读取和存储,web服务器中会开辟一块内存用来保存服务器端所有的session,每个Session都会有一个唯一的表示sessionid,根据客户端传过来的sessionid(cookie中),找到对应的服务器端的session。为了防止服务器端的session过多导致内存溢出,web服务器默认会给每个session设置一个有效期(默认30分钟),若有效期内客户端没有访问过该session,服务器就认为该客户端已离线并删除该session。

    注意:session默认的有效期是30分钟(一直没有客户端访问的情况下),如果有客户端访问,则会重置为30分钟,如果在有效期一直都有访问,那session就总是不会过期。

    session的保存以及用户身份的识别:session是存放在服务器端上用来记录客户端的状态信息的,存储在服务器的内存中,但服务器是有可能出现问题的,比如说突然死机啥的,所以在运行时,session是存放在服务器内存中的,因为内存可能会丢失,所以会在文件中存储一份。Session机制在服务器端存储了客户端用户的状态信息,那么怎么才能识别客户端的身份呢?这就需要一个验证身份的方法或者是令牌暗号,这个验证身份的秘钥暗号就是客户端cookie中的JSESSIONID,客户端访问服务器的时候,会携带者这个JSESSIONID,服务器端一查,发现内存中有这个JSESSIONID,这样也就识别了客户端的身份了。

    问题:如果客户端的cookie被禁止了,就不能存储JSESSIONID了吧,那咋办呢?

    我们可以在客户端禁用cookie的情况下,继续使用session,方法有三种:

    • 通过URL重写,把JSESSIONID作为参数追加到原url中,后续浏览器与服务器交互携带JSESSIONID参数。
    • 服务器的返回数据中包含JSESSIONID,浏览器发送请求时,携带这个JSESSIONID参数。
    • 通过HTTP协议中的header字段,服务器每次返回时设置该header字段信息,浏览器中js读取该header字段,请求服务器时,js设置携带该header字段。

    执行原理:当用户发送一个请求到服务器端时,服务器会先检查请求中是否含有sessionID,如果不存在sessionid,就说明是第一次请求,就会为该请求用户创建一个session对象存入到服务器内存中,(为了防止内存数据丢失,还会在文件中存放一份),并将该session对象的sessionid放到响应头的set-cookie中,格式为set-cookie:sessionid,响应给客户端,客户端下次再请求时cookie中就会有一个name为jsessionid的cookie,value就是sessionid。如果服务器检查sessionid存在,就说明这个客户端不是第一次访问了,就会在服务器端查找是否有该sessionid对应的session,如果有就使用,没有就创建一个。

    适用场合:手机银行登录,等需要较高安全性的操作使用session.

  2. Cookie

    Cookie机制采用的是在客户端保持HTTP状态信息的方案。

    ​ 当客户端浏览器访问Web服务器的某个资源时,Web服务器会在HTTP响应头中添加一个键值对传送给浏览器,再由浏览器将该cookie放到客户端磁盘的一个文件中,该文件理解为cookie域(键值对的集合),往后客户端每次访问这个网站时,都会在请求头中带着这个网站的所有cookie值(访问的网站有很多方法区分cookie,比如最常见的加上它的网址信息等)。

    ​ 每一个cookie都是一个键值对,都只有一个name和一个value,name是唯一的,如果出现了name相同的情况,后面的会覆盖先前的。

    ​ 浏览器存储的cookie是有数量限制的,一般的web浏览器可以存储多个web站点提供的cookie信息,一般只允许存放300个cookie信息,每个站点最多能存放20个cookie每个cookie大小限制为4KB.

    Cookie默认的生存周期就到你关闭浏览器为止

    Cookie分类:(分两类

    • 会话级别的cookie:默认情况下,cookie是一个会话级别的cookie,存储在浏览器的内存中,用户退出浏览器之后被删除
    • 持久化的cookie:若希望浏览器将该cookie存储在磁盘上,则需要设置该cookie的声明周期setMaxAge,并给出一个以秒为单位的时间,将最大时效设置为0就会让浏览器删除该cookie.

    Cookie的作用范围:作用范围是用domainpath规定的,这个作用范围就是你在访问哪些网站或url时,会自动的携带哪些cookie.domain是域名默认是当前主机path默认是(通配符),也就是域名后面的路径*。

    例如:

    document.cookie = "token=abc;path=/;domain=.csdn.net"
    

    执行原理:当一个客户端浏览器访问Web服务器时,Web服务器会调用HttpServletResponseaddCookie()方法,在响应头中添加一个名叫Set-Cookie的响应字段用于将Cookie返回给浏览器,当浏览器第二次访问该web服务器时会自动的将该cookie回传给服务器,来实现用户状态的跟踪。

    使用场合自动登录、跟踪用户上次访问站点的时间、显示最近浏览信息等

    编码问题:cookie存储中文会出现中文乱码,需要对value进行额外的编码

    乱码解决

    • base64编码
      • 存储:Base64.getEncoder().encodeToString(content.getBytes(“utf-8”));
      • 读取:new String(Base64.getDecoder().decode(cookie.getValue()),“utf-8”)
    • URLEncoder
      • 存储:Cookie cookie = new Cookie(“userName”, URLEncoder.encode(“你好世界”, “UTF-8”));
      • 读取:URLDecoder.decode(cookie.getValue(), “UTF-8”)
  3. application

    ​ 多个用户共享的应用级别的作用域,在服务器端存储所有用户的公共的数据信息,相比cookie和session,Application存储时间长,只有当关闭服务器的时候才会销毁。

  4. 总结

    方法信息量大小保存时间应用范围保存位置
    Application任意大小整个应用程序的生命周期所有用户服务器端
    Session量小,简单的数据用户活动时间+一段延迟时间
    (默认30分钟)
    单个用户服义务端
    Cookie量小,简单的数据可以根据需要设定单个用户客户端

六、HTTP协议请求响应过程

一次完整的HTTP请求过程

  1. 首先进行域名解析
    • 客户端浏览器的地址栏中输入要访问的URL地址,浏览器会首先搜索自己的DNS缓存(缓存时间只有1分钟,且只能容纳1000条缓存)中没有过期的指定的对应条目,浏览器缓存中维护着一张域名与IP地址相对应的表。
    • 如果浏览器没有找到,则会去搜索操作系统的DNS缓存中查找没有过期的而且是指定的条目
    • 如果操作系统DNS都没有找到,就再去尝试读取hosts文件(在C:\Windows\System32\drivers\etc)查找该域名对应的IP地址。
    • 如果hosts文件中也没有找到对应的条目,浏览器再想本地首选DNS服务器发起域名解析请求,运营商的DNS服务器首先查找自身的缓存,找到那个没有过期的对应条目,并将结果返回,各级DNS也会缓存这个条目,至此客户端的浏览器找到了域名对应的IP地址。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DKMNpn2K-1625727840765)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210708112628446.png)]

    DNS优化是哈?DNS缓存DNS负载均衡

  2. 浏览器与服务器开始TCP三次握手

    传输层有两个协议:TCPUDPTCP是基于连接可靠传输协议,适合于一些对数据完整性要求高的场合;UDP无连接不可靠传输协议,适合允许数据丢失但对连接速率要求特别高的场合。

    ​ 什么是TCP的三次握手:三次握手是为了确保通信双方能够稳定的建立连接并完成数据报文的请求与相应动作。

    第一步建立连接客户端向服务器端发送一份特殊的TCP报文,它的首段SYN字段值为1;客户端还会生成一个初始序列号,填在报文的seq=J字段,客户端进入SYN_SEND状态,等待服务器的确认。

    第二步服务器收到客户端SYN报文段,需要对这个SYN报文段进行确认,设置ACK为1,将SYN设置为1Seq=Kack=J+1,然后服务器将上述信息放到一个报文段中**,一并发给客户端**,此时服务器进入SYN_RECV状态

    第三步客户端接收到服务器端的报文段(SYN+ACK),ACK=1,ack=K+1,向服务器发送ACK报文段,发送完毕后,客户端和服务器端都进入ESTABLISHED状态完成TCP三次握手

    ​ 完成了TCP的三次握手,也就表示客户端和服务器端就可以开始传送数据了。

在这里插入图片描述

  1. 连接建立后,发送HTTP请求。
  2. 四次挥手

    角色说明:由于TCP是全双工通信模式,服务器和客户端双方是相对的,谁是客户端,谁是服务器端也是相对的。

    ​ (假设是客户端请求断开连接:)

    第一挥手: 客户端构建TCP报文,设置FIN为1,序列号Seq=u,发送给服务器端,客户端进入FIN-WAIT-1状态。

    第二挥手:服务器端收到了连接释放请求,设置ACK=1,ack=u+1,Seq=v,作为确认信息发送给客户端,此时服务器端进入CLOSE—WAIT状态。客户端收到服务器端的确认请求后,进入FIN-WAIT-2状态,等待服务器发送连接释放报文,服务器端发

    第三挥手:服务器端发送完最后的数据,向客户端发送最后的释放报文,FIN=1,ACK=1,ack=u+1,序列号Seq=w,此时服务器端进入LSAR-ACK状态。等待客户端确认。

    第四挥手:客户端接收到连接释放报文,发出确认报文,ACK=1,ack=w+1,Seq=u+1,此时客户端进入TIME-WAIT等待状态。服务器收到客户端发出的确认进入CLOSE状态。此时连接正式断开。

在这里插入图片描述

至此,客户端和服务器端连接都已经断开了,也就结束通信了!

七、常见网络协议:

HTTPS:是Http协议的安全版本,是使用了SSL协议,所以HTTPS是http+SSL

计算机端口分类:

  • 公认端口(常用):0~1024
  • 注册端口:1025~49151
  • 动态和私有端口:49152~65535

OSI模型

OSI参考模型(层)功能常见协议
应用层提供用户程序接口FTP、Telnet、SMTP、HTTP、RIP、NFS、DNS
表示层数据转换、确认数据格式JPEG、ASCLL、GIF、DES、MPEG
会话层建立和中止连接RPC、SQL、NFS
传输层提供传输顺序信息与响应TCPUDP、SPX
网络层提供数据通过的路由IP、IPX、ICMP协议ARP协议、RARP协议
数据链路层进行数据打包与解包,形成信息帧IEEE802.3/.2、HDLC、PPP、ATM
物理层实现计算机系统与网络间的物理连接RS232、V.35、FDDI

常用协议端口:

协议名称端口号作用
FTP20、21文件传输协议
SSH22安全shell协议
Telent23远程登录协议,明文传递
DNS53域名系统
SMTP25简单邮件传输协议
POP3110邮局协议3代
HTTP80超文本传送协议
SNMP161简单网络管理协议
TFTP69简单文件传输的协议
DHCP67、68分配IP地址

什么是桥接模式/Nat模式

桥接模式:直接连接到外部网络,如果需要与局域网中的其他设备进行通信,则首选桥接模式。

特点

  • 在局域网的其他主机,可以访问虚拟机
  • 要想使用桥接则必须有物理设备(路由器/交换机)

Nat模式:只允许主机与虚拟机通讯
在这里插入图片描述

谢谢大家的支持,我会加油的~~

嗷~~恶龙咆哮~

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值