HTTP协议
HTTP
协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则,同时是一种无连接、无状态的协议。
无状态:退出再重进浏览器不会意识到还是你
无连接:当服务端和客户端进行通讯的时候,客户端向服务端发起请求,服务端接收请求之后返回给客户端一个响应,之后就会断开不再继续保持连接了
MIME概念
MIME(多用途邮件扩展,一开始只用于邮件附件)是一种标准,用来说明文件类型的
两部分组成:类型(type)和子类型(subtype)例如“text/html”
HTTP请求组成
http请求由请求行,消息报头(cookie等等),请求正文(post有get没有)三部分构成。name=John+Doe&age=30&location=New+York // 请求体,除了请求体的都是请求头
HTTP请求行
请求行由请求Method
,(http请求方式) URL
字段和HTTP Version
三部分构成, 总的来说请求行就是定义了本次请求的请求方式, 请求的地址, 以及所遵循的HTTP协议版本例如:
GET /example.html HTTP/1.1 (CRLF)
常见的HTTP请求方式包括:
-
GET:从服务器获取数据,通常用于获取网页、图片等静态资源。
-
POST:向服务器提交数据,通常用于提交表单、上传文件等操作。
-
PUT:向服务器上传新数据,通常用于更新资源。
-
DELETE:从服务器删除数据,通常用于删除资源。
HTTP请求头
Host:www.example.com
,指定了请求的服务器地址
Content-Length:45
,指定了请求体的长度。
Connection:keep-alive
,指示服务器保持连接以便后续请求(为什么还会有连接到最后看)
User-Agent 表示浏览器或者操作系统的属性
Windows NT 10.0; Win64; x64
表示操作系统信息
AppleWebKit/537.36 (KHTML, like Gecko)Chrome/91.0.4472.77 Safari/537.36
表示浏览器信息
Referer 表示这个页面是从哪个页面跳转过来的
**吞吐率:**单位是 “req/s”。吞吐率特指 Web 服务器单位时间内处理的请求数
Content-Disposition
是一个 MIME 协议的扩展头部字段,用于定义邮件附件或网页中文件的展示方式。在 HTTP 协议中,它主要用于指示浏览器如何处理响应体内容,即是否应该将内容内联显示(即作为页面的一部分)或作为附件下载并保存到本地。
-
inline
:默认值,表示响应的内容将被浏览器内联展示,通常用于 PDF、图片等文件,用户可以直接在浏览器中查看内容。 -
attachment
:表示响应的内容将被浏览器视为附件,提示用户下载文件。如果提供了filename
参数,浏览器会使用该参数值作为下载文件的默认文件名。
例如,当服务器发送一个文件并希望用户下载而不是在浏览器中打开时,可以使用以下头部:
Content-Disposition: attachment; filename="filename.jpg"
http守护进程:
如果客户端长时间没有发起请求,网关长时间得到响应时,就会默认此次的连接已经完成,从而断开,那么下次的连接还要重新进行TCP的连接,所以为了维持这样的状态,服务器会开启一个http进程来维持该连接。
X-Forwarded-For
头的值通常是一个或多个IP地址,用逗号分隔。第一个IP地址通常是原始请求者的地址,随后的地址可能是中间代理服务器的地址。例如:
X-Forwarded-For: 192.0.2.1, 198.51.100.1
Content-Type
是 HTTP 头部用来指示资源的 MIME 类型(媒体类型)。在 Content-Type
的定义中,application
是指该媒体类型属于应用程序类型
-
application/x-www-form-urlencoded
:这是 HTML 表单默认的编码方式,用于提交表单数据。数据被编码为键值对,以&
分隔,每个键值对的键和值通过=
连接。 -
application/javascript
:用于传输 JavaScript 代码。
总结post请求需要注意的:
1.请求方式, 请求行中的请求方式需要改为POST
2.请求头, 提交POST请求, 需要比GET请求多提供几个请求头, 其中最重要的一个是 Content-Type: application/x-www-form-urlencoded
3.请求体格式, 请求头和请求体之间有一个请求空行, 也就是一行空内容, 用来分隔请求头和请求体的内容, 如果中间的空行被不小心删掉了或者多了几行空行, 都会出现异常
HTTP响应
也由三部分组成,包括状态行,消息报头,响应正文。
HTTP响应状态行
状态行也由三部分组成,包括HTTP协议的版本,状态码,以及对状态码的文本描述。例如:
HTTP/1.1 200 OK (CRLF)
HTTP响应状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值: 1xx
:指示信息 - 表示请求已接收,继续处理 2xx
:成功 - 表示请求已被成功接收、理解、接受 3xx
:重定向 - 要完成请求必须进行更进一步的操作 4xx
:客户端错误 - 请求有语法错误或请求无法实现 * 5xx
:服务器端错误 - 服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200
: OK - 客户端请求成功
400
: Bad Request - 客户端请求有语法错误,不能被服务器所理解
401
: Unauthorized - 请求未经授权,这个状态代码必须和WWW-Authenticate
报头域一起使用
403
: Forbidden - 服务器收到请求,但是拒绝提供服务
404
: Not Found - 请求资源不存在,eg:输入了错误的URL
500
: Internal Server Error - 服务器发生不可预期的错误 *
503
: Server Unavailable - 服务器当前不能处理客户端的请求,一段时间后,可能恢复正常
HTTP状态返回码302
是一个重定向状态码,它表示请求的资源已经被临时移动到了另一个位置。当客户端发送一个请求时,服务器会返回302状态码以及一个包含新位置的URL的响应头,客户端会根据这个新的URL重新发送请求。这种状态码通常用于处理网页重定向或者临时性的资源移动。
http连接扩展
HTTP是基于请求与响应的,且最主要的两个特点就是无连接和无状态,但是,虽然是无连接的,但其底层也就是传输层大多却是基于 TCP面向连接的通信方式,因此,这里的无连接指的是:当server端和client端进行通讯的时候,client端向server端发起请 求,server端接收请求之后返回给client端一个响应,之后就会断开不再继续保持连接了;这样有一个好处就是对于只有一次访问的连接来说不仅节省 资源还很高效,但很明显,如果client端还想继续多次访问server端就需要重新建立连接也就是会多次进行TCP的“三次握手,四次挥手”的过程, 这样一来并没有节省资源而且还很低效,因此使用keep-alive(又称持久连接、连接重用)可以改善这种状态,即在一次TCP连接中可以持续发送多份数据而不会断开连接。通过使用keep-alive机制,避免了建立或者重新建立连接的次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高http服务器的吞吐率(更少的TCP连接意味着更少的系统内核调用,socket的accept()和close()调用)。