一.URL(统一资源定位符)
在讲HTTP协议之前,很有必要来说一下URL.
统一资源定位符:用来定位在网络上唯一的资源
完整的URL格式:
- 协议方案名:请求需要使用的协议,现在通常为HTTP,HTTPS
- 登录信息(用户名:密码):认证用户的用户名密码,为了安全一般都不会显示
- 服务器地址(IP+端口):这里通常都不会是IP地址,而是域名,通过域名解析服务器获取服务器的IP地址 端口:HTTP协议的端口默认是80,HTTPS协议的默认端口是443
- 带层次的文件路径: 即请求的资源在服务器上的路径
- 查询字符串: 客户端请求中的额外参数,由key=val的键值对组成,以&作为分隔符
- 片段标识符: HTML的标签ID,可以直接跳转到页面的某个位置
二.HTTP协议
HTTP协议,即超文本传输协议.用于从万维网服务器传输超文本数据到本地浏览器的传送协议.
负责应用程序之间的数据沟通.
HTTP协议的特点:
1.HTTP是无连接的
无连接的含义是限制每次连接只处理一个请求。服务端处理客户端的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
2.HTTP是灵活的
只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。通过头部中的Content-Type来标记正在传输的类型
3.HTTP是无状态的
无状态是指对于事务处理没有记忆能力,服务器不知道客户端是什么状态,即我们给服务器发送 HTTP 请求之后,服务器会根据请求给我们发送数据过来,但是发送完后不会记录任何信息。 无状态是一把双刃剑,如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。而如果服务器不需要先前信息时,它的应答就较快。
HTTP协议格式
HTTP协议请求格式:
- 请求首行: 请求方法 统一资源定位符(URL) 协议版本\r\n
- 请求头部: 头部字段名: 值\r\n
- 空行: \r\n 用于间隔头部信息和正文. 一旦检测到连续的两个\r\n就代表着头部结束
- 请求正文:请求数据(客户端提交的数据)
HTTP协议响应格式:
- 响应首行:协议版本 响应状态码 状态码描述\r\n
- 响应头部:头部字段名: 值\r\n
- 空行:\r\n
- 响应正文:响应数据(服务端响应的实体资源)
请求方法以及功能详解:
GET: 主要用于向服务器请求实体资源,也可以提交数据,提交的数据作为查询字符串存储在URL中
URL提交数据存在的弊端: 1. 不安全(HTTP明文传输) 2.URL有长度限制(IE浏览器:2048字节 谷歌浏览器:8182字节)- HEAD: 类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头
- POST: 向指定资源提交数据进行处理请求(例如提交表单或者上传文件).数据被包含在请求体中.POST请求可能会导致新的资源建立或已有资源的修改
- PUT: 从客户端向服务器传送的数据取代指定的文档的内容
- PATCH: 是对 PUT方法的补充,用来对已知资源进行局部更新
- DELETE: 请求服务器删除指定的页面
- CONNECT: HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器
- OPTIONS: 允许客户端查看服务器的性能
- TRACE: 回显服务器收到的请求,主要用于测试或诊断
协议版本
HTTP协议有四个版本,分别是0.9,1.0,1.1,2.0.现在大部分用的都是1.1版本.
HTTP/0.9:
HTTP协议的最初版本,功能简陋,仅支持GET请求方法,并且仅能请求访问HTML格式的资源.
短连接:建立连接,发送一个请求,得到响应后则关闭连接.
HTTP/1.0:
HTTP1.0版本相较于0.9版本做了很大进步:
- 增加了POST和HEAD请求方法
- 不再局限于HTML格式的资源,通过Content-Type可以支持多种数据格式,例如:text/html,image/jpeg等
- 开始支持cache,就是当客户端在规定时间内访问同一网站,直接访问cache即可
工作方式:每次TCP连接只能发生一个请求,当服务器响应后就会关闭这次连接,下一次请求需要再次建立TCP连接,不支持keepalive(长连接).
TCP建立连接的成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢.随着网页加载的外部资源越来越多,这个问题就愈发突出.
为了解决这个问题,有些浏览器在请求时,用了一个非标准的Connection字段(受限制的长连接):
Connection: keep-alive
受限制的长连接:一个连接可以发送多条请求,但是必须要响应完上一个请求后才能发送下一个请求.
HTTP/1.1:
增加了更多的请求方法和头部描述信息,并且支持长连接和管道化传输.
长连接:TCP默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive.
1.1版本新增五种请求方法: OPTIONS,PUT,DELETE,TRACE和CONNECT方法
管道化传输:可以连续发送多个请求,只需要按顺序响应就行,不需要响应后才发送下一个请求(响应的顺序必须与请求的顺序保持一致,通过队列实现,如果不一致则在队首阻塞)
HTTP/2.0:
采用二进制流传输,并且进行多路复用,允许服务端主动推送数据
多路复用: 响应顺序可以与请求的顺序不一致,因为头部中标识了对应的请求信息。提高了信道的利用率
头部信息
- Content-Length: 响应正文的长度
- Content-Type: 表示资源的类型
- Accept-Ranges:bytes/none
- Range: 请求头格式:Range: bytes=start-end
- Content-Range: 响应头格式: Content-Range: bytes 0-10/3103 表示服务器响应了(0-10字节)的资源,该资源一共有3103个字节.
- ETag: 表示资源版本的标识符,通常是消息摘要(类似于MD5一样),分段下载时需要注意,或者缓存控制也需要注意
- Lacation:3xx重定向的新地址
- Host:客户端告知服务器,所请求的资源是在哪个主机的哪个端口上
- Set-Cookie:客户端通过Set-cookie向客户端传递的信息,会被保存在客户端浏览器的cookie文件中
- Cookie:客户端上保存的数据,客户端每次通信时从cookie文件中读取数据,并通过cookie字段向服务端传递信息(用于维持客户端状态信息)
- Session:服务端为客户端创建的会话,会话信息中描述了客户端的身份认证信息和状态信息,保存在服务端,可以通过cookie将session id返回给客户端,客户端每次通信都会通过cookie传输带有自己session的id。
状态码详解
状态码 | 状态码描述 | 常见状态码 |
1xx | 信息性状态码,接收的请求正在处理 | 100: |
2xx | 成功状态码,请求正常处理完毕 | 200:表示客户端发来的请求被服务器正常处理 206:表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求 |
3xx | 重定向状态码,需要进行附加操作以完成请求 | 301:永久重定向(表示请求的资源已被分配了新的URL,以后应使用资源现在所指的URL) 302:临时重定向(表示请求的资源已被分配了新的URL,希望本次使用新的URL访问) |
4xx | 客户端错误状态码,服务端无法处理请求 | 400:表示请求报文中存在语法错误 404:表示服务器上无法找到请求的资源 |
5xx | 服务端错误状态码,服务端处理请求出错 | 500:表示服务器端在执行请求时发生了错误 502:代理请求失败/无效响应 504:代理请求超时 |
Cookie与Session:
因为HTTP是无状态的,但在实际情况中,我们还是需要保持状态的 那么如何让HTTP来保持状态呢,答案就是借助Cookie和Session。 举个例子,正好明天就是618,618作为一个大型的购物节,在一天的不同时间段,不同店铺中,会有着许多不同的活动,为了达到最大折扣,我们通常会在一天内多次进入如淘宝、京东等购物网站进行购物,但是因为HTTP是无状态的,所以它并不会记录我们的任何信息,所以我们在每次访问时都需要重新登陆来确认用户的身份,这是一种很麻烦的事情。所以大佬们为HTTP加入了Cookie来帮助其维持状态,在每次通信后,会将服务端的一些临时验证信息保存在客户端的cookie文件中。这样下次通信时,就可以通过读取cookie中保存的验证信息,将其传递给服务端,来维持客户端的状态,这样就可以避免多次登录。
但是Cookie的使用不够安全,因为Cookie保存在客户端(浏览器)。而如果将这些重要的信息保存在本地,则很容易就会被脚本、爬虫等截取,造成不必要的损失,所以Cookie需要搭配Session使用。
Session其实就是服务端为客户端创建的会话,其中描述了客户端的身份认证信息和状态信息,并且将其保存在服务端。服务端每次通信结束后都会将Session id(本次会话的ID)保存在客户端的Cookie中,客户端在下次通信时通过Cookie将保存的Session id传递给服务端,这样服务端就可以通过对应的Session id来查找到客户端的身份认证信息和状态信息,来为客户端维持状态,这样就可以避免重复登录。并且因为Cookie和Session分别保存在客户端和服务端,保证了一定的安全性。
Cookie与session的区别是什么? Cookie保存在客户端上,是一些临时存储的数据(session id),用于持续与服务端进行信息传递的一种手段。
Session保存在服务端上,是一种会话的控制,会话信息中包含客户端的身份状态信息,通过Cookie传递Session id来查找到对应的身份状态信息,来实现状态维持。