HTTP是什么?
HTTP(HyperText Transfer Protocol 超文本传输协议);
HTTP基于TCP/IP通信协议来传递数据(各种文件);
工作原理
HTTP协议工作于客户端(请求主动发起端)-服务端(请求响应端);使用者可以通过URL向服务端发送所有请求,服务端接收到请求后,向客户端发送响应信息;HTTP默认端口80(可改);
HTTP三个特点(HTTP1.1)
1. 无连接: 每个连接只处理一个请求,就是客户端发送请求,服务端响应后,收到客户的应答后,即断开连接;
2. 无状态: 即每一个连接都是独立,无法相互依赖影响;这样意味如果后续处理需要前面的消息,本次请求就必须带上前面的消息;
3. 媒体独立: 客户端和服务端都知道如何处理的数据内容,任何数据内容都可通过HTTP发送;需要客户端和服务端使用使用的MIME-type内容类型;
HTTP连接
HTTP基于TCP/IP通信协议,TCP协议建立连接必须三次握手
TCP三次握手
此处以打电话为例
A: 打电话接通首先说话 "你好";
B: 你好,我可以听到;
A: 嗯好 那我开始说正事了啊;
第一次: 由客户端发起 SYN=1 ,seq = x ;此时客户端连接进入 SYN-SENT (A: 你好!);
第二次: 服务器监听到客户端请求后,回复 SYN=1,ACK=1,seq=y, ack=x+1(上次带过来的seq +1);服务器进入SYN-RCVD;(B: 你好!我可以听到)
第三次: 客户端收到服务端回复后,发送ACK=1, seq=x+1,ack=y+1;客户端进入ESTAB-LISHED(含义TCP:连接成功),服务端收到该请求后也会进入ESTAB-LISHED状态;(A: 嗯好那我说正事了啊)
SYN是同步,ACK是确认,1为是,0为否,就是收到同步和确认信号
TCP四次挥手
还是以打电话为例:
A: 我已经说完了;
B: 嗯收到我想下我还有事没事;
B: 我没事了那我挂了啊;
A: 好挂吧;
TIME_WAIT(等待)
第一次挥手: 客户端想服务端发送FIN=1,seq=n; 客户端进入FIN_WAIT_1状态,标识没有数据要传输了(A: 我已经说完了;)
第二次挥手: 服务端收到消息后进入CLOSE_WAIT状态(被动关闭),然后发送ACK=1,sql=m,ack=n+1确认,表示同意关闭;客户端进入FIN_WAIT_2状态;(B: 嗯收到我想下我还有事没事;)
第三次挥手: 服务端发送FIN=1 ACK=1 ack=n+1 seq=m 请求关闭连接,服务端进入LAST_ACT状态;(我也没事了,你打来的你挂;)
第四次挥手: 客户端收到FIN后,回复ACK=1 ack=m+1 sql=n+1 客户端进入TIME_WAIT状态(等待2MSL),服务端收到ACK后关闭连接,客户端等待2MSL后,仍然没有回复,说明服务端已经关闭(如服务端未收到会在超市后重新发送第三次挥手),客户端关闭连接;
2MLS是啥: MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。
以上内容不在延续;回头再研究下2MLS,SO_REUSEADDR;
HTTP版本
HTTP/0.9
最初版本,
1. 只有GET一种请求方式,
2. 只能请求HTML格式资源
HTTP/1.0
请求必须在未必增加协议字段(http/1.0)必须包含头消息
1. 增加POST, HEAD请求方式;
2. 增加Content-type 可以支持多种数据格式;
3. 开始支持cache 客户在规定时间内访问同一网站,直接调用cache;
4. 每次请求必须包含头信息(HTTP header);
5. 每个连接只能发送一个请求(不支持keepalive);
6. 新增功能还包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。
7. 增加Content-Encoding 支持将数据压缩后再发送;客户端使用Accept-Encoding说明可以接受哪些压缩方式
HTTP/1.1
1. 引入持久连接,TCP连接默认不关闭,可以被多次复用,不用声明Connection:keep-alive; 客户端或服务端在发现对方一段时间未活动后;会主动关闭连接;规范做法是通过connection:close提出关闭;(大多数浏览器允许同时建立6个持久连接)
2. 加入管道机制: 一个TCP连接中允许多个请求同时发送;
3. 新增OPTIONS, PUT,DELETE,TRACE,CONNECT的请求方法;
4. 新增了24中状态响应码;
5. host域;
6. 引入更多的缓存策略;
等....
http之前版本问题:
1. 队头阻塞: 请求必须等待前面请求处理完成,如果前面请求很费时则会影响后面请求的响应;
2. 过大的请求头: 每次都会携带请求头,当请求头过大时,会形成负担;
3. 只有客户端发起请求后服务端才能响应,服务端不能主动推送;
4.
* HTTP/2.0
为了解决http1.1版本利用率不高的问题,提出了HTTP/2.0版本;
1. 二进制格式: 只有0,1的组合,可以适应更多的应用场景;
1. 多路复用: 每个连接内包含多个请求(流);每个流中包含多个帧;多个流并行发送请求;
每一个帧可看做是一个学生,流可以认为是组(流标识符为帧的属性值),一个班级(一个连接)内学生被分为若干个小组,每一个小组分配不同的具体任务。
2. 服务器推送;
3. 请求头压缩; 第一次传输所有数据以后只传输修改的内容;
好吧这就是 到处抄来的帖子
引用:
HTTP2笔记 blog.csdn.net/y_xianjun/a…
什么是2MSL blog.csdn.net/xiaofei0859…
HTTP各版本 blog.csdn.net/qq_22238021…
HTTP三握手 4次挥手 blog.csdn.net/charking_gg…