应用层协议-HTTP
HTTP格式
HTTP的格式主要以下图为主,左边是请求端(客户端),右侧是响应端(服务端)。其中请求端的数据主要为请求行(请求方法、URL和版本号),请求报头,空行以及请求正文。而响应端主要包括状态行(版本号、状态码和状态码描述),响应报头,空行以及响应正文。接下来我们就一一进行解释。
URL
URL就是我们俗称的“网址”,在客户端和服务器进行网络数据的传输时,URL也是数据信息中不可缺少的一部分。
URL组成
- 协议方案名:例如http或https。
- 登录信息(认证)
- 服务器地址:域名或ip
- 服务器端口号:http中不显示就默认80端口
- 带层次的文件路径:服务器提供的服务
- 查询字符串:?为分界点,以键值对形式表现。键1=值1&键2=值2…
- 片段标识符:前端用来做页面定位使用的。
GET/POST请求方法
在http协议中有很多的请求方法,但最常见的主要还是GET方法和POST方法
GET方法和POST方法的区别
- 数据长度限制:GET方法发送数据是向URL添加数据,但URL的长度是受限制的(URL最大长度是2048个字符)。POST方法没有限制。
- 安全性:GET方法发送的数据是URL的一部分。POST方法传输数据的参数不会被保存在浏览器历史或web服务器日志中,所以POST更安全。
- 可见性:GET方法数据都在URL中,URL对所有人都可见。POST方法数据不会显示在URL中。
Version版本号
http协议主要为两个版本,一个是http1.0,另一个是http1.1 。现在常见的就是http1.1版本。
http1.0 和 http1.1的区别
- 缓存头:1.1版本比1.0 版本提供了更多可供选择的缓存头来控制缓存策略。
- 浪费带宽和网络连接的优化:在http1.0中,服务器只能传送一个资源对象的整体,如果客户端只请求了这个对象的部分数据,就会产生浪费的问题。1.1版本中引入了range头域,可以只传递客户端需求的一部分,优化了网络连接以及带宽的使用。
- 状态码:1.1中新增了一些错误状态响应码,响应信息更加全面。例如410表示服务器某个资源被永久删除。
- 主机名:1.0版本请求信息中的URL没有传递主机名。而1.1版本的请求信息和响应信息都会包含Host头域,如果没有的话还有响应400的错误状态码。
- 长连接:1.1版本支持长连接,在一个TCP连接上可以传送多个HTTP请求和响应。一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
状态码
通过状态码,我们可以了解到发送到服务器请求数据后的处理情况。大部分状态码都是从1开头到5开头的三位数字,五种不同数字开头的状态码表示的内容都不同。
- 1XX:信息性状态码 — 正在处理接收的请求。
- 2XX:成功状态码 — 请求正常处理完毕。
- 3XX:重定向状态码 — 需要附加操作才能完成请求。
- 4XX:客户端错误状态码 — 服务器无法处理请求。
- 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)的功能(请求/响应报头)