参考:阮一峰的 http协议讲解
作用:
就是大家都遵守这个协议,保证输入网址是响应出来时你想要的东西,然后服务端一看你是遵守这个协议的,好那我把你想要的东西给你。
简介:
http又叫超文本传输协议,超文本就是用超链接的方法将各种不同空间的文字信息组织在一起的网状文本,其实就是文本集合。超链接就是把各个页面链接在一块的链接地址,一般分为三种:内部链接,锚点链接,外部链接。
类型:
http是一个应用层协议,应用层协议的意思就是运行在不同端系统上的应用进程互相传递报文,包括请求以及响应报文。
应用层的协议分类:
1:域名系统,用于实现网络设备名字到IP地址映射的网络服务
2:文件传输协议(FTP),用于实现交互式文件传输功能
3:简单邮件传送协议,用于实现电子邮箱传送功能
4:超文本传输协议,就是现在所说的http
5:简单的网络管理协议:用于管理与监视网络设备
6:远程登录协议:用于实现远程登录功能
http是一个无状态的协议,就是服务器不知道请求完成没有,没有请求端的任何状态记录,每一个请求和之前的请求都是无关独立的。
载体:
http承载与tcp协议之上,也有承载在TLS或SSL协议之上的不过那个叫HTTPS
对于这句话的理解:
这个说来话长了,最早是两个设备需要发送接受数据,需要各种各样的协议保证是它们自己想要的数据。
以太网协议:
最早期的时候就是以太网协议,两部分head以及data,head包含的是发送者和接收者的信息,要识别这些信息就必须按照以太网的规定接入网卡接口,所以数据是根据网卡接受的,网卡的地址就叫做MAC地址,每个网卡都是独一无二的。以太网要知道对方的MAC地址就必须遵循ARP协议,然后知道之后给子网络所有的计算器发送数据包让每台计算器自己判断是否为接受方,不是就丢包,这个方式叫广播。但是这个方法效率太低,而且不能保证所有的电脑都在子网络。
ip协议
所以就有了IP协议,每台电脑都有ip地址,地址分为两个部分,前面代表网络,后面代表主机,处于同一子网络的ip网络部分必定相同,因为ip的网络部分并不知道是多少位,所以也就无法判断两台计算器是否属于同一个子网络了,这时候就需要”子网掩码“来进行识别,ip的作用是两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。以太网的数据部分包含了所有的ip数据包包括ip的地址栏。
ARP协议:
就算知道了通过ip协议知道了对方的子网络,要在子网络中得知对方的MAC地址也是不行的,一种方法是直接通过网关,还有一种是ip协议中数据包需要放入ARP协议来得知对方的MAC地址,ARP协议中放的对方的的ip,然后会与子网络的每一台电脑MAC地址栏中的ip看是否相同,如果相同发送MAC的地址,不相同就进行丢包。
端口:
有了IP以及ARP协议后仅仅可以在互联网上任意两台电脑建立通信,并不能知道这个程序包是什么程序所用,所以就需要端口,每个数据包发到主机的特定端口,所以不同的程序就能取到自己所需要的程序。
"传输层"的功能,就是建立"端口到端口"的通信。相比之下,"网络层"的功能是建立"主机到主机"的通信。只要确定主机和端口,我们就能实现程序之间的交流。
UDP协议:
因为需要端口,那么我们就需要在数据包里加入端口信息,这就需要新的协议,叫做UDP协议,也分为标头和数据,都包含在IP的数据包里,标头定义了发出端口和接收端口,"数据"部分就是具体的内容。
优点:简单,易实现,
缺点:可靠性差,无法得知对方是否收到
TCP协议:
为了解决UDP协议的缺点,TCP协议就诞生了,非常复杂的协议,可以当作是有确认机制的UDP协议,所以比较复杂消耗资源,TCP与UDP协议一样,数据包也一样长,和IP的数据包刚好大小相同,确保传送资源不会被分割。这时候TCP已经可以为各种各样的程序传递数据了,所以就有了应用层协议:www,ftp,Email之类的
应用层:
作用:规定应用程序的数据格式。
所以说HTTP是建立在TCP/IP之上的,刚才讲的以太网也变成了
发展
0.9版
最早版本是1991年发布的0.9版。该版本极其简单,只有一个命令GET。上面命令表示,TCP 连接(connection)建立后,客户端向服务器请求(request)网页index.html。
协议规定,服务器只能回应HTML格式的字符串,不能回应别的格式服务器发送完毕,就关闭TCP连接
1.0版
1996年5月,HTTP/1.0 版本发布,其次,除了GET命令,还引入了POST命令和HEAD命令,再次,HTTP请求和回应的格式也变了。除了数据部分,每次通信都必须包括头信息(HTTP header),用来描述一些元数据。
缺点:
HTTP/1.0 版的主要缺点是,每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。有些浏览器就用了一个非标准的connection的字段保持连接 connection :keep-alive
1.1版
1997年1月发布,一直到现在,引入了持久连接不用声明connection:keep-alive ,客户端发现对方一段时间没有活动,就会主动关闭连接,规范做法是客户端请求完毕发送connection:close 明确要求服务器关闭。一个域名允许同时建立6个持久连接
管道机制:
允许TCP协议里放多个请求,但是服务器是先处理A请求再处理B请求,因为有多个请求就有多个回应,所以必须有一个区分知道回应是哪次请求的,之前1.0版本请求完服务器关闭,1.1版本先是采用了客户端告诉服务器这次请求的长度content-length,然后回应的字节长度是这个就是本次请求,但是对于耗时的动态操作来看效率很差,因为需要操作完服务器才能响应,所以流模式就取代了缓存模式,所以就不使用content-length字段了,用了“分块传输编码字段”,请求头有Transfer-Encoding:chunked字段,每个非空的数据块之前,会有一个16进制的数值,表示这个块的长度。最后是一个是为0的数据块,
还新增了PUT,DELETE,HEAD之类的东西
客户端请求的头信息新增了Host字段,用来指定服务器的域名,可以将请求发往同一台服务器上的不同网站,为虚拟主机的兴起打下基础
缺点:
虽然可以发送多个,但是多了会造成请求的排队导致”队头堵塞“,解决方法,减少请求,同时多开持久连接,
SPDY协议
2009,谷歌发行了spdy协议解决1.1版本效率不高的问题,后期发布的http/2协议继承了主要特性
HTTP/2
2015年发布,没有子版本,下个版本直接是3,
二进制:
1.1头信息是文本,数据体是文本也可以是二进制,http2是一个彻底的二进制,并统称为”帧“
多工:
避免了1.1的”队头堵塞“问题i,服务器同时收到A,B,然后先回应A,如果处理的时间较长,会先给A返回处理好的部分,然后处理B,再处理A。
数据流:
每个请求或回应的数据包成为数据流,http2是不按照顺序发数据包的,所以都有数据流ID用来区分它属于哪个数据流,客户端发送的数据包一律为奇数,服务器是偶数,客户端可以指定数据流的优先级,越高越早回应
头信息压缩:
因为HTTP协议是无状态的,每次都要附上所有信息,所以避免字段重复,浪费宽带,影响苏黛,引入了头信息压缩机制,头信息压缩后发送,还有就是客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,直接发送索引号就能提高速度了
服务器推送:
HTTP2允许服务器未经请求,主动发送资源,常见场景就是网页包含很多静态资源,然后正常情况是先请求网页,然后请求静态资源,但是有了推送后,服务器预期到客户端请求完网页了会有可能请求静态资源,然后就会一起发给客户端了
HTTP状态码类型:
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作成功接受并处理
3** 重定向,需要进一步的操作已完成请求
4** 客户端错误,包含语法错误,和无法完成的请求
5** 服务器错误,处理请求过程中发生错误