应用层协议-HTTP

HTTP格式

HTTP的格式主要以下图为主,左边是请求端(客户端),右侧是响应端(服务端)。其中请求端的数据主要为请求行(请求方法、URL和版本号),请求报头,空行以及请求正文。而响应端主要包括状态行(版本号、状态码和状态码描述),响应报头,空行以及响应正文。接下来我们就一一进行解释。

应用层协议-HTTP

URL

URL就是我们俗称的“网址”,在客户端和服务器进行网络数据的传输时,URL也是数据信息中不可缺少的一部分。

URL组成
  1. 协议方案名:例如http或https。
  2. 登录信息(认证)
  3. 服务器地址:域名或ip
  4. 服务器端口号:http中不显示就默认80端口
  5. 带层次的文件路径:服务器提供的服务
  6. 查询字符串:?为分界点,以键值对形式表现。键1=值1&键2=值2…
  7. 片段标识符:前端用来做页面定位使用的。

GET/POST请求方法

在http协议中有很多的请求方法,但最常见的主要还是GET方法和POST方法

GET方法和POST方法的区别
  1. 数据长度限制:GET方法发送数据是向URL添加数据,但URL的长度是受限制的(URL最大长度是2048个字符)。POST方法没有限制。
  2. 安全性:GET方法发送的数据是URL的一部分。POST方法传输数据的参数不会被保存在浏览器历史或web服务器日志中,所以POST更安全。
  3. 可见性:GET方法数据都在URL中,URL对所有人都可见。POST方法数据不会显示在URL中。

Version版本号

http协议主要为两个版本,一个是http1.0,另一个是http1.1 。现在常见的就是http1.1版本。

http1.0 和 http1.1的区别
  1. 缓存头:1.1版本比1.0 版本提供了更多可供选择的缓存头来控制缓存策略。
  2. 浪费带宽和网络连接的优化:在http1.0中,服务器只能传送一个资源对象的整体,如果客户端只请求了这个对象的部分数据,就会产生浪费的问题。1.1版本中引入了range头域,可以只传递客户端需求的一部分,优化了网络连接以及带宽的使用。
  3. 状态码:1.1中新增了一些错误状态响应码,响应信息更加全面。例如410表示服务器某个资源被永久删除。
  4. 主机名:1.0版本请求信息中的URL没有传递主机名。而1.1版本的请求信息和响应信息都会包含Host头域,如果没有的话还有响应400的错误状态码。
  5. 长连接:1.1版本支持长连接,在一个TCP连接上可以传送多个HTTP请求和响应。一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。

状态码

通过状态码,我们可以了解到发送到服务器请求数据后的处理情况。大部分状态码都是从1开头到5开头的三位数字,五种不同数字开头的状态码表示的内容都不同。

  1. 1XX:信息性状态码 — 正在处理接收的请求。
  2. 2XX:成功状态码 — 请求正常处理完毕。
  3. 3XX:重定向状态码 — 需要附加操作才能完成请求。
  4. 4XX:客户端错误状态码 — 服务器无法处理请求。
  5. 5XX:服务器错误状态码 — 服务器处理请求错误。
常见状态码
  • 200:服务器正确处理完请求,并返回响应。
  • 301/302/307:重定向(服务端响应3XX重定向状态码,location报头,然后浏览器会自行跳转到location)。
  • 400:客户端错误(客户端请求数据错误–数据格式/数据类型错误)。
  • 404:找不到资源(服务器没有提供该URL地址请求的服务)。
  • 405:Method Not Allow 不支持的客户端请求方法(服务器的这个服务不支持请求报头的请求方法)。
  • 500:服务器错误(一般是服务器后端错误–抛出异常)。
  • 502:Bad Gateway 网关错误。

Header报头

报头的内容都是以键值对的形式保存的,报头中也有很多请求信息或者响应信息的内容,下面是一些常见的Header报头。

常见Header
  • Content-Type:数据类型(text/html等)(响应报头)
  • Content-Length:body的长度(请求/响应报头)
  • Host:客户端告知服务器,请求资源在哪个主机的哪个端口(请求报头)
  • User-Agent:声明用户的操作系统和浏览器版本信息(请求报头)
  • referer:从哪个页面跳转过来(请求报头)
  • location:搭配3XX状态码使用,告诉客户端接下来访问哪里(响应报头)
  • Cookie:在客户端存储少量信息,例如用户登录信息等。通常用于实现会话(Session)的功能(请求/响应报头)