03.HTTP协议

97 阅读7分钟

http是什么

超文本传输协议(Hyper Text Transfer Protocol,HTTP).通常是基于tcp传输协议的一种请求-相应协议,从1990年的http0.9到今年6月http3.0正式发布已经32个年头,作为一个前端,或者说一个程序员,它与我们的工作息息相关.

tcp协议

是一种面向链接,可靠的,基于字节流的协议.

面向链接:发送数据的两端必须建立链接,建立链接的方法就是"三次握手" 第一次,客户端向服务端发送链接请求报文,SYN(seq=X) 客户端进入 SYN-SENT状态 第二次,服务器端收到报文,发送相应报文,ACK(X+1),SYN(seq=y) 服务器端进入SYN-RECEIVED状态 第三次,客户端收到后,再向服务端发送确认报文ACK(Y+1) 客户端进入ESTABLISHED状态 服务器端收到后也进入ESTABLISHED 这次两端的链接已建立成功 4次挥手和3次握手差不多,只是会多一个确认数据传输完成的报文.

可靠的:对于可靠传输,判断丢包,误码靠的是TCP的段编号以及确认号。 TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。

基于字节流:TCP把数据流分区成适当长度的报文段 TCP传输实体接受本地进程的用户数据流,将它们分割成不超过64KB(实际上去掉IP和TCP头,通常不超过1460数据字节)的分段,每个分段以单独的IP数据报形式发送。当包含TCP数据的数据报到达一台机器时,它们被递交给TCP传输实体,TCP传输实体重构出原始的字节流。

UDP协议

User Datagram Protocol,无需建立连接就可以发送封装的 IP 数据包的方法

面向无连接:UDP无需向TCP一样3次握手建立链接,而是想法就发,并且只是报文的搬运工,不会对报文进行操作.发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。

不可靠性:UDP是无连接的,想发就发,所以是不可靠的.收到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关心对方是否已经正确接收到数据了。再者网络环境时好时坏,但是 UDP 因为没有拥塞控制,一直会以恒定的速度发送数据。即使网络条件不好,也不会对发送速率进行调整。这样实现的弊端就是在网络条件不好的情况下可能会导致丢包.优点就是实时性很高.

基于报文传输:UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。因此,应用程序必须选择合适大小的报文.

http 0.9/1.0

http0.9属于http的新生时期.适用于各种数据信息的简洁快速协议,但是远不能满足日益发展的各种应用的需要。0.9协议就是一个交换信息的无序协议,仅仅限于文字。由于无法进行内容的协商,在双发的握手和协议中,并有规定双发的内容是什么,也就是图片是无法显示和处理的。

http1.0属于http的幼年期随着互联网的发展以及浏览器的出现,单纯的文本内容已经无法满足用户需求了,浏览器希望通过 HTTP 来传输脚本、样式、图片、音频和视频等不同类型的文件

由于0.9和1.0本我也没用过,这些资料都是我了解后从网上copy过来的.

http1.1

随着互联网的飞速发展,http1.0已经不能满足日常使用,于是诞生了http1.1.http新特性如下: 1.可重复使用链接(keep-alive),一个TCP默认不关闭,可复用. 2.强制要求 Host 头,让互联网主机托管称为可能,允许一个ip地址上支持多个虚拟机 3.缓存控制机制 包括协商缓存和强缓存 4.增加了 PUT、DELETE、OPTIONS、PATCH 等新的方法 5.Chunked机制,分块响应(Transfer-Encoding:Chunked) 6.允许响应数据分块(chunked),利于传输大文件

此后互联网上所有的浏览器、服务器、网关、代理等,只要用到 HTTP 协议,就必须严格遵守这个标准。

http2.0

2.0和1.1之间虽然只差了一个版本,但是更新内容还是挺大,所以一直是共存状态.http2.0的主要变动在于:

1.长链接:同一域下所有Http请求通过一个Tcp连接传输(提高Tcp连接吞吐量) http1.1中大量创建/断开连接造成的性能消耗, HTTP1.1中使用持久连接时,一个连接中同一时刻只能处理一个请求。当前的请求没有结束之前,其他的请求只能处于阻塞状态,这种情况被称为「队头阻塞」. http2.0中使用长链接,通过其他方式传输,解决队头阻塞问题

2二进制协议替换纯文本 客户端在发送请求时会将每个请求的内容封装成不同的带有编号的二进制帧(Frame),然后将这些帧同时发送给服务端。服务端接收到数据之后,会将相同编号的帧合并为完整的请求信息。同样,服务端返回结果、客户端接收结果也遵循这个帧的拆分与组合的过程。 有了二进制分帧后,对于同一个域,客户端只需要与服务端建立一个连接即可完成通信需求,这种利用一个连接来发送多个请求的方式称为「多路复用」。每一条路都被称为一个 stream(流)。解决队头阻塞.

3头部压缩 把头部的键值对内容根据对应的(hpack)表进行转换,最后经过编码生成最终的压缩后的数据

4服务器推送 允许服务器向客户端发送额外的可缓存信息,这些信息未被请求但在未来的请求中预计会出现。例如,如果客户端请求资源X并且知道资源Y被请求的文件引用,则服务器可以选择将Y与X一起推送,而不是等待适当的客户端请求。

...其他

http3.0

HTTP3.0,也称作HTTP over QUIC,http3主要是将底层依赖的 TCP 改成 UDP主要特征如下:

面向无连接:http1.1/2.0都是基于tcp链接的,需要3次握手.而3.0是基于udp链接,所以速度非常快.

集成了TLS(Transport Layer Security 传输层安全性协议)加密功能,所以3.0同时也保证了一定的安全性.

多路复用:不QUIC实现了在同一物理连接上可以有多个独立的逻辑数据流,实现了数据流的单独传输,解决了TCP中队头阻塞问题

http还是算比较新的技术,一些系统或者硬件对它的支持还不完善.但是相信以后也会是主流.

8.4 今天主要是介绍http协议,明天更新https