应用层:Http协议 你了解多少?

一.URL(统一资源定位符)

在讲HTTP协议之前,很有必要来说一下URL.

统一资源定位符:用来定位在网络上唯一的资源

完整的URL格式:

  • 协议方案名:请求需要使用的协议,现在通常为HTTP,HTTPS
  • 登录信息(用户名:密码):认证用户的用户名密码,为了安全一般都不会显示
  • 服务器地址(IP+端口):这里通常都不会是IP地址,而是域名,通过域名解析服务器获取服务器的IP地址    端口:HTTP协议的端口默认是80,HTTPS协议的默认端口是443
  • 带层次的文件路径: 即请求的资源在服务器上的路径
  • 查询字符串: 客户端请求中的额外参数,由key=val的键值对组成,以&作为分隔符
  • 片段标识符: HTML的标签ID,可以直接跳转到页面的某个位置

 二.HTTP协议

HTTP协议,即超文本传输协议.用于从万维网服务器传输超文本数据到本地浏览器的传送协议.

负责应用程序之间的数据沟通.

HTTP协议的特点:

1.HTTP是无连接的

无连接的含义是限制每次连接只处理一个请求。服务端处理客户端的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

2.HTTP是灵活的

只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。通过头部中的Content-Type来标记正在传输的类型

3.HTTP是无状态的 

无状态是指对于事务处理没有记忆能力,服务器不知道客户端是什么状态,即我们给服务器发送 HTTP 请求之后,服务器会根据请求给我们发送数据过来,但是发送完后不会记录任何信息。 无状态是一把双刃剑,如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。而如果服务器不需要先前信息时,它的应答就较快。         

HTTP协议格式

HTTP协议请求格式:

  • 请求首行: 请求方法  统一资源定位符(URL) 协议版本\r\n
  • 请求头部: 头部字段名: 值\r\n
  • 空行: \r\n 用于间隔头部信息和正文. 一旦检测到连续的两个\r\n就代表着头部结束
  • 请求正文:请求数据(客户端提交的数据)

HTTP协议响应格式:

  • 响应首行:协议版本 响应状态码 状态码描述\r\n
  • 响应头部:头部字段名: 值\r\n
  • 空行:\r\n
  • 响应正文:响应数据(服务端响应的实体资源)

请求方法以及功能详解:

  • GET: 主要用于向服务器请求实体资源,也可以提交数据,提交的数据作为查询字符串存储在URL中 

    URL提交数据存在的弊端: 1. 不安全(HTTP明文传输)  2.URL有长度限制(IE浏览器:2048字节 谷歌浏览器:8182字节)
  • HEAD: 类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头
  • POST: 向指定资源提交数据进行处理请求(例如提交表单或者上传文件).数据被包含在请求体中.POST请求可能会导致新的资源建立或已有资源的修改
  • PUT: 从客户端向服务器传送的数据取代指定的文档的内容
  • PATCH: 是对 PUT方法的补充,用来对已知资源进行局部更新
  • DELETE: 请求服务器删除指定的页面
  • CONNECT: HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器
  • OPTIONS: 允许客户端查看服务器的性能
  • TRACE: 回显服务器收到的请求,主要用于测试或诊断

协议版本

HTTP协议有四个版本,分别是0.9,1.0,1.1,2.0.现在大部分用的都是1.1版本.

HTTP/0.9:

HTTP协议的最初版本,功能简陋,仅支持GET请求方法,并且仅能请求访问HTML格式的资源.

短连接:建立连接,发送一个请求,得到响应后则关闭连接.

HTTP/1.0:

HTTP1.0版本相较于0.9版本做了很大进步:

  1. 增加了POST和HEAD请求方法
  2. 不再局限于HTML格式的资源,通过Content-Type可以支持多种数据格式,例如:text/html,image/jpeg等
  3. 开始支持cache,就是当客户端在规定时间内访问同一网站,直接访问cache即可

工作方式:每次TCP连接只能发生一个请求,当服务器响应后就会关闭这次连接,下一次请求需要再次建立TCP连接,不支持keepalive(长连接).

TCP建立连接的成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢.随着网页加载的外部资源越来越多,这个问题就愈发突出.

为了解决这个问题,有些浏览器在请求时,用了一个非标准的Connection字段(受限制的长连接):

Connection: keep-alive

受限制的长连接:一个连接可以发送多条请求,但是必须要响应完上一个请求后才能发送下一个请求.

HTTP/1.1:

增加了更多的请求方法和头部描述信息,并且支持长连接管道化传输.

长连接:TCP默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive.

1.1版本新增五种请求方法: OPTIONS,PUT,DELETE,TRACE和CONNECT方法

管道化传输:可以连续发送多个请求,只需要按顺序响应就行,不需要响应后才发送下一个请求(响应的顺序必须与请求的顺序保持一致,通过队列实现,如果不一致则在队首阻塞)

HTTP/2.0:

采用二进制流传输,并且进行多路复用,允许服务端主动推送数据

多路复用: 响应顺序可以与请求的顺序不一致,因为头部中标识了对应的请求信息。提高了信道的利用率

头部信息

  • Content-Length: 响应正文的长度
  • Content-Type: 表示资源的类型
  • Accept-Ranges:bytes/none
  • Range: 请求头格式:Range: bytes=start-end
  • Content-Range: 响应头格式: Content-Range: bytes 0-10/3103 表示服务器响应了(0-10字节)的资源,该资源一共有3103个字节.
  • ETag: 表示资源版本的标识符,通常是消息摘要(类似于MD5一样),分段下载时需要注意,或者缓存控制也需要注意
  • Lacation:3xx重定向的新地址
  • Host:客户端告知服务器,所请求的资源是在哪个主机的哪个端口上
  • Set-Cookie:客户端通过Set-cookie向客户端传递的信息,会被保存在客户端浏览器的cookie文件中
  • Cookie:客户端上保存的数据,客户端每次通信时从cookie文件中读取数据,并通过cookie字段向服务端传递信息(用于维持客户端状态信息)
  • Session:服务端为客户端创建的会话,会话信息中描述了客户端的身份认证信息和状态信息,保存在服务端,可以通过cookie将session id返回给客户端,客户端每次通信都会通过cookie传输带有自己session的id。

状态码详解

状态码状态码描述常见状态码
1xx信息性状态码,接收的请求正在处理100:
2xx成功状态码,请求正常处理完毕

200:表示客户端发来的请求被服务器正常处理

206:表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求

3xx重定向状态码,需要进行附加操作以完成请求

301:永久重定向(表示请求的资源已被分配了新的URL,以后应使用资源现在所指的URL)

302:临时重定向(表示请求的资源已被分配了新的URL,希望本次使用新的URL访问)

4xx客户端错误状态码,服务端无法处理请求

400:表示请求报文中存在语法错误

404:表示服务器上无法找到请求的资源

5xx服务端错误状态码,服务端处理请求出错

500:表示服务器端在执行请求时发生了错误

502:代理请求失败/无效响应

504:代理请求超时

Cookie与Session:

因为HTTP是无状态的,但在实际情况中,我们还是需要保持状态的 那么如何让HTTP来保持状态呢,答案就是借助Cookie和Session。 举个例子,正好明天就是618,618作为一个大型的购物节,在一天的不同时间段,不同店铺中,会有着许多不同的活动,为了达到最大折扣,我们通常会在一天内多次进入如淘宝、京东等购物网站进行购物,但是因为HTTP是无状态的,所以它并不会记录我们的任何信息,所以我们在每次访问时都需要重新登陆来确认用户的身份,这是一种很麻烦的事情。所以大佬们为HTTP加入了Cookie来帮助其维持状态,在每次通信后,会将服务端的一些临时验证信息保存在客户端的cookie文件中。这样下次通信时,就可以通过读取cookie中保存的验证信息,将其传递给服务端,来维持客户端的状态,这样就可以避免多次登录。

但是Cookie的使用不够安全,因为Cookie保存在客户端(浏览器)。而如果将这些重要的信息保存在本地,则很容易就会被脚本、爬虫等截取,造成不必要的损失,所以Cookie需要搭配Session使用。

Session其实就是服务端为客户端创建的会话,其中描述了客户端的身份认证信息和状态信息,并且将其保存在服务端。服务端每次通信结束后都会将Session id(本次会话的ID)保存在客户端的Cookie中,客户端在下次通信时通过Cookie将保存的Session id传递给服务端,这样服务端就可以通过对应的Session id来查找到客户端的身份认证信息和状态信息,来为客户端维持状态,这样就可以避免重复登录。并且因为Cookie和Session分别保存在客户端和服务端,保证了一定的安全性。

Cookie与session的区别是什么? Cookie保存在客户端上,是一些临时存储的数据(session id),用于持续与服务端进行信息传递的一种手段。

Session保存在服务端上,是一种会话的控制,会话信息中包含客户端的身份状态信息,通过Cookie传递Session id来查找到对应的身份状态信息,来实现状态维持。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值