HTTP简介
- HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写。
- HTTP是一个简单的请求-响应协议,它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
- HTTP是应用层协议。
- HTTP是否是面向连接的?
面向连接和无连接指的都是协议。也就是说,这些术语指的并不是物理介质本身,而是用来说明如何在物理介质上传输数据。面向连接和无连接协议可以、而且通常也确实会共享一条物理介质。
它们的本质区别在于,对无连接协议来说,每个分组的处理信息都独立于所有其他分组,而对面向连接的协议来说,协议实现则维护了与后继分组有关的状态信息。
无连接协议中的分组被称为数据报,每个分组都是独立寻址。
面向连接的协议则维护了分组之间的状态,使用这种协议的应用程序通常都会进行长时间的对话。记住这些状态,协议就可以提供可靠的传输。
依据上面的解释,HTTP是无连接的。
HTTP工作原理
- 典型的HTTP事务处理有如下的过程:
(1)客户与服务器建立连接;
(2)客户向服务器提出请求;
(3)服务器接受请求,并根据请求返回相应的文件作为应答;
(4)客户与服务器关闭连接。 - 三点注意事项
(1)HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
(2)HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
(3)HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。 - HTTP使用位置
HTTP运作方式
基于HTTP协议的客户/服务器模式的信息交换过程,它分四个过程:建立连接、发送请求信息、发送响应信息、关闭连接。
HTTP协议是基于请求/响应范式的。一个客户机与服务器建立连接后,发送一个请求给服务器,请求方式的格式为,统一资源标识符、协议版本号,后边是MIME(多用途Internet邮件扩展)信息包括请求修饰符、客户机信息和可能的内容。服务器接到请求后,给予相应的响应信息,其格式为一个状态行包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
服务器端有一个HTTP驻留程序,用于响应用户请求。
报文格式
- HTTP报文由从客户机到服务器的请求和从服务器到客户机的响应构成。
- 请求报文格式
请求行(request line)-- 请求头部(header)-- 空行 – 请求数据
- 请求报文示例
GET / HTTP/1.1
Host: localhost:8888
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
- 响应报文格式
状态行 – 消息报头 – 空行 – 响应正文
响应报文示例
HTTP 请求方法
- 请求方法
(1)GET: 请求指定的页面信息,并返回实体主体。
(2)HEAD: 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
(3)POST: 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
(4)PUT: 从客户端向服务器传送的数据取代指定的文档的内容。
(5)DELETE: 请求服务器删除指定的页面。
(6)OPTIONS: 允许客户端查看服务器的性能。
(7)TRACE: 回显服务器收到的请求,主要用于测试或诊断。 - GET 和 POST 的对比
- GET 方法:查询字符串(名称/值对)是在 GET 请求的 URL 中发送的。
/test/demo_form.php?name1=value1&name2=value2
- POST 方法:查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的。
POST /test/demo_form.php HTTP/1.1
Host: runoob.com
name1=value1&name2=value2
- 比较
GET | POST | |
---|---|---|
后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。 |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存 | 能被缓存 | 不能被缓存 |
历史 | 参数保留在浏览器历史中。 | 参数不会保存在浏览器历史中。 |
对数据长度的限制 | 是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 | 无限制 |
对数据类型的限制 | 只允许 ASCII 字符。 | 没有限制。也允许二进制数据。 |
安全性 | 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET ! | POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。 |
可见性 | 数据在 URL 中对所有人都是可见的。 | 数据不会显示在 URL 中。 |
HTTP状态码
状态码分类
分类 | 描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 比如:200表示请求成功 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 比如:404表示请求的资源(网页等)不存在 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |