http协议

什么是HTTP协议

Hyper Text Transfer Protocol,超级文本传输协议。常见于用来访问网页,传输HTML文件,图片,字符串等。

应用场景

HTTP协议工作于C/S架构上,HTTP CLIENT通过HTTP协议与HTTP SERVER进行交互。
image
HTTP SERVER默认端口号为80,用户也可以自定义成其它端口号。
HTTPS SERVER默认端口号为443,用户也可以自定义成其它端口号。

HTTP与HTTPS的异同

HTTPS是运行在TLS层(Transport Layer Security,传输层安全协议)的HTTP协议。
image

HTTP协议是基于TCP协议工作,其传输流程如下。
image

HTTPS=HTTP+TLS,TLS用来将HTTP的内容加密,然后由TCP层传输过去。
image

HTTP协议格式及说明

CLIENT发送的HTTP请求包括以下格式:

  • 请求行(request line)
  • 请求头 (request header)
  • 空行 (blank line)
  • 请求数据(body)

同时HTTP协议里不仅有header,还有参数设置,cookie,代理设置的功能

image
C语言的定义举例如下:

#define WEB_SERVER "example.com"
#define WEB_PORT "80"
#define WEB_PATH "/"

static const char *REQUEST = "GET " WEB_PATH " HTTP/1.1\r\n"
    "Host: "WEB_SERVER":"WEB_PORT"\r\n"
    "User-Agent: esp-idf/1.1 esp32\r\n"
    "\r\n";

SERVER响应消息
也由四部分组成,分别是

  • 状态行(status line)
  • 消息报头(msg header)
  • 空行 (blank line)
  • 响应正文(body)
    image

对于HEADER里的content-type说明
content-type,内容类型,决定浏览器将以什么方法去解析这个文件。

Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something

常见的媒体格式类型如下:

text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式

image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式

以application开头的媒体格式类型:
application/xhtml+xml :XHTML格式
application/xml: XML数据格式
application/atom+xml :Atom XML聚合格式
application/json: JSON数据格式
application/pdf:pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded :

中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

另外一种常见的媒体格式是上传文件之时使用的:

multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

HTTP协议版本

HTTP/1.0

请求行必须在尾部添加协议版本字段(http/1.0);必须包含头消息,用来描述一些元数据。
其他的新增功能还包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。
工作方式是每次TCP连接只能发送一个请求,当服务器响应后就会关闭这次连接,下一个请求需要再次建立TCP连接,就是不支持keepalive。
Content-Type 字段
关于字符的编码,1.0版规定,头信息必须是 ASCII 码,后面的数据可以是任何格式。因此,服务器回应的时候,必须告诉客户端,数据是什么格式,这就是Content-Type字段的作用。
Accept字段
客户端请求的时候,可以使用Accept字段声明自己可以接受哪些数据格式。
Accept:*/*
上面代码中,客户端声明自己可以接受任何格式的数据。
Content-Encoding 字段
由于发送的数据可以是任何格式,因此可以把数据压缩后再发送。Content-Encoding字段说明数据的压缩方法。
Content-Encoding:gzip Content-Encoding:deflate
客户端在请求时,用Accept-Encoding字段说明自己可以接受哪些压缩方法。
Accept-Encoding:gzip, deflate

不足

TCP连接的新建成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢(slow start)。所以,HTTP 1.0版本的性能比较差。随着网页加载的外部资源越来越多,这个问题就愈发突出了。

HTTP/1.1    

1.1 版的最大变化,就是引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。解决了1.0版本的keepalive问题,1.1版本加入了持久连接,一个TCP连接可以允许多个HTTP请求;
客户端和服务器发现对方一段时间没有活动,就可以主动关闭连接。不过,规范的做法是,客户端在最后一个请求时,发送Connection: close,明确要求服务器关闭TCP连接。
目前,对于同一个域名,大多数浏览器允许同时建立6个持久连接。降低了延迟同时提高了带宽的利用率。
加入了管道机制,在同一个TCP连接里,允许多个请求同时发送,增加了并发性,进一步改善了HTTP协议的效率;举例来说,客户端需要请求两个资源。以前的做法是,在同一个TCP连接里面,先发送A请求,然后等待服务器做出回应,收到后再发出B请求。管道机制则是允许浏览器同时发出A请求和B请求,但是服务器还是按照顺序,先回应A请求,完成后再回应B请求。
Content-Length 字段

一个TCP连接现在可以传送多个回应,势必就要有一种机制,区分数据包是属于哪一个回应的。这就是Content-length字段的作用,声明本次回应的数据长度。
分块传输编码
新增了请求方式PUT、PATCH、OPTIONS、DELETE等。
新增了Host字段
用来指定服务器的域名。在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。
100(Continue) Status(节约带宽)

HTTP/2.0
![image](https://img2020.cnblogs.com/blog/2321831/202109/2321831-20210902205707149-77272764.png)

二、HTTP响应模型
服务器收到HTTP请求之后,会有多种方法响应这个请求,下面是HTTP响应的四种模型:

    单进程I/O模型

服务端开启一个进程,一个进程仅能处理一个请求,并且对请求顺序处理;

    多进程I/O模型

服务端并行开启多个进程,同样的一个进程只能处理一个请求,这样服务端就可以同时处理多个请求;

    复用I/O模型

服务端开启一个进程,但是呢,同时开启多个线程,一个线程响应一个请求,同样可以达到同时处理多个请求,线程间并发执行;

    复用多线程I/O模型

服务端并行开启多个进程,同时每个进程开启多个线程,这样服务端可以同时处理进程数M*每个进程的线程数N个请求。

posted @ 2021-09-29 14:24  海林的菜园子  阅读(142)  评论(0编辑  收藏  举报