HTTP协议概述
1.2. HTTP
在讲HTTP之前,我们先讲一下什么是协议
1.2.1. 什么是协议
通俗来讲,协议可以理解为约定,比如说下午一到6点,你就知道要下班了,这是因为公司有制度规定6点下班,协议可以很简单,但也可以很复杂,比如语言就是一种很复杂的协议,有大量的词汇代表不同的意思
1.2.2. 协议分层
在学HTTP前一定要理解协议分层这个概念,打个比方,打电话,你打开电话,拨通号码,跟需要通话的人建立了连接,然后你说一句话,声音通过话筒由声波信号转换成了电信号,然后电信号通过通讯媒介传输到对方电话,最后通过对方的听筒转化成声波。
声波转换成电信号,最后电信号又转换成声波,这就要遵守一定的协议,比如多少频率转化成多少伏的电压,如果双方协议不一样,转换出来的声音可能就完全不一样了。声波的传输是需要协议,同时双方通话的人也是,比如你是广东人,对方是上海人,两边各讲方言,结果都蒙逼了,然后双方使用一样的协议都讲普通话,OK,这要就可以愉快的聊天了。
在这里,双方通话语言的协议就在声波和电信号转换的协议之上
那为什么要分层呢?这个问题比较好回答,比如如果你跟你老婆打电话,如果不通过声波和电信号之间的转换协议,你声音得多大她才能听到??这是必要情况。还有一种情况,可能不是必要的,但也要分层,这么做的目的是简化实现,降低耦合,大家可以先这么理解,有兴趣的话可以看一些专业书籍。
再看一下下面这个图,可以理解一下为什么要分层(这个图摘自图解TPC/IP)
2.2.3. TCP/IP协议
点击即可查看维基百科中关于TCP/IP协议中的内容,简单一句话总结:就是怎么样把你电脑上运行的程序的消息发送给网络上另一个电脑的程序的一系列协议
注解
Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。
我们来了看OSI七层模型一下下面的图
通常人们认为OSI模型的最上面三层(应用层、表示层和会话层)在TCP/IP组中是一个应用层。由于TCP/IP有一个相对较弱的会话层,由TCP和RTP下的打开和关闭连接组成,并且在TCP和UDP下的各种应用提供不同的端口号,这些功能能够被单个的应用程序(或者那些应用程序所使用的库)增加。与此相似的是,IP是按照将它下面的网络当作一个黑盒子的思想设计的,这样在讨论TCP/IP的时候就可以把它当作一个独立的层。
| 4 | 应用层 application layer |
例如HTTP、FTP、DNS (如BGP和RIP这样的路由协议,尽管由于各种各样的原因它们分别运行在TCP和UDP上,仍然可以将它们看作网络层的一部分) |
| 3 | 传输层 transport layer |
例如TCP、UDP、RTP、SCTP (如OSPF这样的路由协议,尽管运行在IP上也可以看作是网络层的一部分) |
| 2 | 网络互连层 internet layer |
对于TCP/IP来说这是因特网协议(IP) (如ICMP和IGMP这样的必须协议尽管运行在IP上,也仍然可以看作是网络互连层的一部分;ARP不运行在IP上) |
| 1 | 网络访问(链接)层 Network Access(link) layer |
例如以太网、Wi-Fi、MPLS等。 |
2.2.4. HTTP
我们在这只需了解一下什么是HTTP,以及一些入门的知识,并不深入讨论(学习周期比较长)
2.2.4.1. HTTP是什么
最开始HTTP是为了传输文件产生的,它属于应用层协议,基于传输层TCP协议,但随着互联网的演进,最初的静态文件传输已经演变成动态生成“文件”再传输
HTTP原理比较类似于去小卖铺买东西,你说要一个泡面( 请求 ),然后店员给你一个泡面( 响应 ),如果商店没有,店员告诉你没有货了( 404 ),如果买东西的人太多了,店员懒得给你找,就回复给你小店炸了,没空理你( 500 ),再或者,店员干脆懒得理你,回都不回( timeout )
或者,商店里有很多种泡面,你得告诉店员要哪一种,然后你说要包装是纸桶装的( header )泡面
再或者,你在店里办了会员,每次不会花钱就能买东西,然后你到店里后,要把会员卡给店员,店员看一下你是不是会员,是会员了再看你有什么要求( cookies )
再再或者,你买的东西比较私密,不想让旁边的人听到,然后你说了只有你和店员知道的暗语( 加密 )
同理HTTP就是你的电脑和服务器电脑通信的,你输入 http://www.baidu.com ,百度的服务器把网页数据返回给你
2.2.4.2. HTTP方法
这里只介绍四种常见的,也就是增删改查
- GET 查,我需要查点资料
- POST 增,我要增加点东西,如向数据库增加记录
- PUT 改,修改某一项已经存在的数据的内容
- DELETE 删,删除一些数据
但其实在实际使用过程中,程序员们并不严格遵守,会使用GET和POST完成PUT和DELECT的操作
2.2.4.3. HTTP状态码
首先看一下状态码分类
| 状态码 | 类别 | 原因短语 |
|---|---|---|
| 1XX | 信息性状态码 | 接收的请求正在处理 |
| 2XX | 成功状态码 | 请求正确,处理完毕 |
| 3XX | 重定向状态码 | 需要进行附加操作完成请求 |
| 4XX | 客户端错误状态码 | 服务器无法处理请求 |
| 5XX | 服务器错误状态码 | 服务器处理请求出错 |
大家对各种状态码先有一个大致了解,至于每组状态码之间有什么细微差别(如400和404),可以看这里的介绍: https://zh.wikipedia.org/wiki/HTTP%E7%8A%B6%E6%80%81%E7%A0%81
HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。类似于下面这样:
POST http://192.168.23.144:8888/WoniuBoss4.0/login/userLogin HTTP/1.1 Host: 192.168.23.144:8888 Connection: keep-alive Content-Length: 60 Accept: */* X-Requested-With: XMLHttpRequest User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Origin: http://192.168.23.144:8888 Referer: http://192.168.23.144:8888/WoniuBoss4.0/login/logout Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7 Cookie: _jfinal_captcha=758d5284e26342f5940e49eb176162ce userName=WNCD000&userPass=woniu123&checkcode=0000&remember=Y
下面我们介绍几个比较重要的首部
Host
该首部指明了要访问的服务器地址和端口
Accept
表示客户端接受哪种类型的数据,如 text/html 表示客户端希望得到html文本,image/jpeg 表示希望得到图片,`` application/msword`` 表示希望得到word文档
Content-Type
表示客户端发送的数据类型,如 application/x-www-form-urlencoded 表示发送的是表单键对数据, application/json 表示发送的是序列化后的json数据
Cookie
表示客户端存储的Cookie发送给服务器
2.2.4.4.http版本
http有好多版本
- HTTP/0.9 HTTP协议的最初版本,功能简陋,仅支持请求方式GET,并且仅能请求访问HTML格式的资源。 没有首部;只能获取纯文本,请求完成后即关闭TCP连接
- HTTP/1.0
- 任何格式的内容都可以发送。不仅可以传输文字,还能传输图像、视频、二进制文件。
- 除了GET命令,还引入了POST命令和HEAD命令,丰富了浏览器与服务器的互动手段。
- HTTP请求和回应的格式也变了。除了数据部分,每次通信都必须包括头信息(HTTP header),用来描述一些元数据。
- 新增功能还包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等
- HTTP1.1
- 持久连接(keep-alive):TCP连接默认不关闭,可以被多个请求复用
- 管道机制(pipelining):同一个TCP连接里面,客户端可以同时发送多个请求。但是服务器还是按照顺序响应。
- 分块传输编码:对于动态生成的响应类容,可以使用分块传输,边生成边发送
- 新增了许多动词方法:PUT、PATCH、HEAD、 OPTIONS、DELETE。
- 客户端请求的头信息新增了Host字段,用来指定服务器的域名:有了Host字段,就可以将请求发往同一台服务器上的不同网站,为虚拟主机的兴起打下了基础。
- HTTP2.0
- 多路复用:HTTP2建立一个TCP连接,一个连接上面可以有任意多个流(stream),消息分割成一个或多个帧在每个流里面传输。帧传输过去以后,再进行重组,形成一个完整的请求或响应。
- 二进制帧:1.1响应是文本格式,而2.0把响应划分成了两个帧,HEADERS和DATA 是帧的类型。也就是说一条HTTP响应,划分成了两个帧来传输,并且采用二进制来编码。
- 头信息压缩:每个请求带的一些首部字段都是相同的,例如cookie、user-agent等。HTTP2压缩首部。
- 服务器推送:服务器端推送使得服务器可以预测客户端需要的资源,主动推送到客户端。如客户端请求index.html,服务器端能够额外推送script.js和style.css。




浙公网安备 33010602011771号