Http
Http是什么?
http就是超文本传输协议,其中又分为3部分:超文本、传输、协议。
超文本:就是传输的内容数据,可以是文本、图片、视频、音频等。
传输:数据从一个端的系统,传送到另一端系统的过程。
协议:就是在传输的过程中,双方都需要遵守的一些标准和规则。
最常见的http请求:在浏览器的地址栏输入一个地址,例如www.baidu.com,到网页完全展示出界面数据。
那从输入地址开始,到网页展示出来,过程是怎么样的?
image.png大体上就是这么一个流程,这里看一些跟http有关的问题。
三次握手是什么?
所谓三次握手(Three-way Handshake),是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包。
三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。在 socket 编程中,客户端执行 connect() 时。将触发三次握手。
第一次握手(SYN=1, seq=x):
客户端发送一个 TCP 的 SYN 标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。
发送完毕后,客户端进入 SYN_SEND 状态。
第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):
服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。 发送完毕后,服务器端进入 SYN_RCVD 状态。
第三次握手(ACK=1,ACKnum=y+1)
客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1
发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手结束
四次挥手是什么?
TCP 的连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),也叫做改进的三次握手。客户端或服务器均可主动发起挥手动作,在 socket 编程中,任何一方执行 close() 操作即可产生挥手操作。
第一次挥手(FIN=1,seq=x)
假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。
发送完毕后,客户端进入 FIN_WAIT_1 状态。
第二次挥手(ACK=1,ACKnum=x+1)
服务器端确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。
发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接。
第三次挥手(FIN=1,seq=y)
服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。
发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK。
第四次挥手(ACK=1,ACKnum=y+1)
客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK 包。
服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。
客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。
Http报文是什么?里面都有什么?
请求报文:
请求报文 如果请求的时候,method是GET,是没有Body的。 响应报文: 响应报文先来分析请求报文,其中主要的就是请求行中的“method”,指的就是请求方式。
请求方式分别有:
GET:⽤于获取资源,对服务器数据不进⾏修改,不发送 Body,GET把参数包含在URL。
GET /users/1 HTTP/1.1
Host: api.github.com
POST:⽤于增加或修改资源,发送给服务器的内容写在 Body ⾥⾯。
POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
name=mlx&age=10
PUT:⽤于修改资源,发送给服务器的内容写在 Body ⾥⾯
PUT /users/1 HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
name=mlx
DELETE:⽤于删除资源,不发送 Body
DELETE /users/1 HTTP/1.1
Host: api.github.com
HEAD:和 GET 使⽤⽅法完全相同,和 GET 唯⼀区别在于,返回的响应中没有 Body
其实我们常用的就是GET和POST,指的注意的是:
GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
GET产生一个TCP数据包;POST产生两个TCP数据包。
接下来我们看响应报文:
HTTP常见的状态码,有哪些?
状态码1xx
1xx 类状态码属于提示信息,是协议处理中的⼀种中间状态,实际⽤到的⽐较少。
2xx
2xx 类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。
「200 OK」是最常⻅的成功状态码,表示⼀切正常。如果是⾮ HEAD 请求,服务器返回的响应头都会有 body 数据。
「204 No Content」也是常⻅的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。
「206 Partial Content」是应⽤于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源
的全部,⽽是其中的⼀部分,也是服务器处理成功的状态。
3xx
3xx 类状态码表示客户端请求的资源发送了变动,需要客户端⽤新的 URL ᯿新发送请求获取资源,也就是重定向。
「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改⽤新的 URL 再次访问。
「302 Found」表示临时重定向,说明请求的资源还在,但暂时需要⽤另⼀个 URL 来访问。
301 和 302 都会在响应头⾥使⽤字段 Location ,指明后续要跳转的 URL,浏览器会⾃动重定向新的URL。
「304 Not Modifified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲⽂件,也称缓存重定向,⽤于缓存控制。
4xx
4xx 类状态码表示客户端发送的报⽂有误,服务器⽆法处理,也就是错误码的含义。
「400 Bad Request」表示客户端请求的报⽂有错误,但只是个笼统的错误。
「403 Forbidden」表示服务器禁⽌访问资源,并不是客户端的请求出错。
「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以⽆法提供给客户端。
5xx
5xx 类状态码表示客户端请求报⽂正确,但是服务器处理时内部发⽣了错误,属于服务器端的错误码。
「500 Internal Server Error」与 400 类型,是个笼统通⽤的错误码,服务器发⽣了什么错误,我们并不知道。
「501 Not Implemented」表示客户端请求的功能还不⽀持。
「502 Bad Gateway」通常是服务器作为⽹关或代理时返回的错误码,表示服务器自身⼯作正常,访问后端服务器发⽣了错误。
「503 Service Unavailable」表示服务器当前很忙,暂时⽆法响应服务器,类似“网络服务正忙,请稍后重试”的意思。
上面这些就是http的基本知识点了,接下来我们继续看个版本的http的区别
http的版本都有哪些?有什么区别?
主要有:1.0、1.1、2.0、3.0
其中http3是2018年出的,现在用的还不多。现在项目用的比较多的还是1.1版本或者2.0版本。
http1.1:
长连接:新增Connection字段,可以设置keep-alive值保持连接不断开
管道化:基于上面长连接的基础,管道化可以不等第一个请求响应继续发送后面的请求,但响应的顺序还是按照请求的顺序返回
缓存处理:新增字段cache-control
断点传输
管道化是什么?就是基于长连接的基础,把所有请求都用一个管道来管理。
1.0版本的请求,可以理解为有只能载一个人的小船,要渡河只能一个一个来。
而管道化就好比建立一座桥,大家都可以同时上桥过河,但是呢,上桥的时候会拿上一个号码牌,回来时也需要按照顺序回来。 管道化 请求1 --> 请求2 --> 请求3 > 响应1 --> 响应2 --> 响应3
缓存处理
当浏览器请求资源时,先看是否有缓存的资源,如果有缓存,直接取,不会再发请求,如果没有缓存,则发送请求
通过设置字段cache-control来控制
断点传输
在上传/下载资源时,如果资源过大,将其分割为多个部分,分别上传/下载,如果遇到网络故障,可以从已经上传/下载好的地方继续请求,不用从头开始,提高效率在 Header 里两个参数实现的,客户端发请求时对应的是 Range 服务器端响应时对应的是 Content-Range
http2.0:
二进制分帧
多路复用: 在共享TCP链接的基础上同时发送请求和响应
头部压缩
服务器推送:服务器可以额外的向客户端推送资源,而无需客户端明确的请求
二进制分帧
将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码
多路复用
基于二进制分帧,在同一域名下所有访问都是从同一个tcp连接中走,http消息被分解为独立的帧,乱序发送,服务端根据标识符和首部将消息重新组装起来
区别
http1.0 到http1.1的主要区别,就是从无连接到长连接
http2.0对比1.X版本主要区别就是多路复用
那HTTP2.0有没有缺点?
当然有,没有就不用出http3了。但是也不能说是http2.0的锅,其实是TCP机制的锅。
首先2.0是共用一个TCP连接来传输数据;
然后其中一个数据包丢失了,就自然触发TCP的机制了,会再发一遍这个数据包。
那么,再重新收到这个数据包之前,其他的http都必须等,整个请求队列都处于阻塞的状态。
上面提及到很多控制字段,那么都有哪些字段?
通用头部字段:
通用字段请求头部字段: 头部字段
响应头部字段: 响应头
实体头部字段: 实体字段