详解http协议
本文通过自己的一些学习和参考了《图解HTTP》
4.1 在浏览器地址栏键入URL,按下回车之后会经历以下流程:
1.定义:
http协议是超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。是一种详细规定了浏览器和万维网直接按互相通信的规则,允许将HTML文档从web服务器传送到Web服务器。默认的端口是80.
基于 请求-响应 的模式
HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并 返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有 接收到请求之前不会发送响应
2.URL解析
URL(Uniform Resource Locator,统一资源定位符)。URL正是使用 Web 浏览器等 访问 Web 页面时需要输入的网页地址。例如 :https://www.baidu.com/。
在一个完整的URL中应该包含如下几个部分:
协议名称:指明了当前通信使用了什么协议(http/https/ftp等)
登录信息:在冒号前面是用户名,后面是密码。用户名和密码作为从服务器端获取资源时必要的登录信息(身份 认证)。此项是可选项。
服务器地址:这里是服务器的地址,可以是域名(因为ip地址不方便记忆,通过DNS协议来将域名和ip地址进行了映射)当然这里也可以是192.168.1.1 这类 IPv4 地址 名,还可以是 [0:0:0:0:0:0:0:1] 这样用方括号括起来的 IPv6 地址名。
服务器端口号:默认为80号端口。
资源路径:这个表示了我们要访问的资源在服务器上的路径,/ 表示了根目录。
查询字符串:客户端提交给服务器的一些数据,由key-val的键值对组成,键值对之间通过&进行间隔。如果在URL中出现了特殊的字符,这时候就需要将这些特殊的字符进行转码,因为在URL中由很多的特殊字符有着自己的含义,防止重复定义。
urlencode编码:将特殊字符的每个字节都转换成16进制的数字字符(通过ASCLL值),并且在前面加上%。
Urldecode编码:在url中遇到%就将后面的两个字符,通过ASCLL值转化成原来的字符。
片段标识符:表示HTML中的某个标签,可以直接跳转到网页的某个位置。
3.http协议的版本
http 0.9:
最初的版本,只有一个命令GET,服务器只能回应HTML格式字符串。
http 1.0:
引入了新的命令POST和HEAD(http数据头部)命令
每个TCP连接只能发送一个请求,发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接,头信息是 ASCII 码,后面数据可为任何格式。服务器回应时会告诉客户端,数据是什么格式,即Content-Type字段的作用。这些数据类型总称为MIME即多用途互联网邮件扩展,每个值包括一级类型和二级类型,,预定义的类型,也可自定义类型, 常见Content-Type值:text/xml image/jpeg audio/mp3
http 1.1: 新增方法:PUT、PATCH、OPTIONS、DELETE
引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。对于同一个域名,大多数浏览器允许同时建立6个持久连接引入了管道机制,即在同一个TCP连接里,客户端可以同时发送多个请求,进一步改进了HTTP协议的效率,同一个TCP连接里,所有的数据通信是按次序进行的。服务器只能顺序处理回应,前面的回应慢,会有许多请求排队,造成"队头堵塞"(Head-of-line blocking),为避免上述问题,两种方法:一是减少请求数,二是同时多开持久连接
Http2.0
1.头信息和数据体都是二进制,称为头信息帧和数据帧
2.复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,避免了“队头堵塞“,此双向的实时通信称为多工(Multiplexing)
3.引入头信息压缩机制(header compression),头信息使用gzip或compress压缩后再发送;客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,不发送同样字段,只发送索引号,提高速度
4.HTTP/2 允许服务器未经请求,主动向客户端发送资源,即服务器推送(server push)
可以参考:https://www.cnblogs.com/luck-pig/p/12006908.html
4.http的工作原理
4.1 在浏览器地址栏键入URL,按下回车之后会经历以下流程:
1.首先我们获取到服务器的地址,如果是ip地址就可以直接访问,如果是域名,这时候我们就需要使用DNS协议进行域名解析得到对应的ip地址。
什么是DNS协议呢?
DNS:域名系统,用于进行域名解析,通过域名获取服务器的IP地址。
层级划分的管理方式:不同的域名服务器管理着不同的域名。
域名我服务器:根域名服务器-》顶级域名服务器-》二级域名服务器-》三级域名服务器。。。。
域名解析的流程:
1.查看浏览器的缓存-》2.查看本地的hosts文件-》3.请求本地dns服务器-》4.1访问根域名服务器返回找到或者是顶级域名服务器|||4.2访问根域名服务器返回或者继续访问顶级域名服务器-》5.1访问顶级域名服务器返回找到或者是二级域名服务器|||5.2访问顶级域名服务器返回或者继续访问二级域名服务器。。。。。。
从第4步开始 都有两种方式:递归(根域名服务器直接一直向下,找到最后)或者是迭代(每次返回给我下一层域名服务器,我去访问下一层服务器)。直到找到,或者是走到了末尾就结束了。
2.得到ip地址后,我们就通过tcp协议进行三次握手并建立连接。
3.客服端发送http的请求操作。
4.服务器对请求进行响应,并将对应的html文本发送给浏览器。
5.客户端与服务器断开连接,客户端对于收到的html文本进行渲染后呈现。
4.2 请求/响应报文的头部信息:
1.在请求中:
eg:
首部:以空格分开,以\r\n进行结尾, 请求方法 URL 协议版本。
请求方法:
GET:获取资源,
GET 方法用来请求访问已被 URL识别的资源。指定的资源经服务器 端解析后返回响应内容。也就是说,如果请求的资源是文本,那就保 持原样返回。
POST:方法用来传输实体的主体。
POST方法主要用于向服务器端提交表单数据,提交的数据在正文中。
PUT:传输文件
PUT 方法用来传输文件。就像 FTP 协议的文件上传一样,要求在请 求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。
HEAD:获得报文首部
HEAD 方法和 GET 方法一样,只是不返回报文主体部分。用于确认 URI 的有效性及资源更新的日期时间等。
DELETE:删除文件
DELETE 方法用来删除文件,是与 PUT 相反的方法。DELETE 方法按 请求 URI 删除指定的资源。
OPTIONS:询问支持的方法
OPTIONS 方法用来查询针对请求 URI 指定的资源支持的方法。
TRACE:追踪路径
TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的方 法。
CONNECT:要求用隧道协议连接代理
CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协 议进行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接 层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容 加 密后经网络隧道传输。
注意:
GET和POST的区别:
https://www.cnblogs.com/logsharing/p/8448446.html
对于这个问题,我们在百度上有些各种各样的答案,我们要分清楚的是,这两种方法是http协议中定义的两种方法,但是又很多在http协议中,并没有严格的定义这两种方法分一些区别,而是在不断的使用和软件的更新中,人们意识上强加的区别。
2.在响应中:
eg:
1.首部:以空格分开,以\r\n进行结尾, 协议版本,响应的状态码 响应的描述。
状态码:
常见的状态码:
4.3http协议的特点:
1.无连接:
1.HTTP 协议的初始版本中,每进行一次 HTTP 通信就要断开一次 TCP 连接。(短连接)
2. 持久连接 为解决上述 TCP 连接的问题,HTTP/1.1 和一部分的 HTTP/1.0 想出了 持久连接(HTTP Persistent Connections,也称为 HTTP keep-alive 或 HTTP connection reuse)的方法。持久连接的特点是,只要任意一端 没有明确提出断开连接,则保持 TCP 连接状态。
3. 管线化 持久连接使得多数请求以管线化(pipelining)方式发送成为可能。从 前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术 出现后,不用等待响应亦可直接发送下一个请求。 44 这样就能够做到同时并行发送多个请求,而不需要一个接一个地等待 响应了。
2.无状态
HTTP 是无状态协议,它不对之前发生过的请求和响应的状态进行管 理。也就是说,无法根据之前的状态进行本次的请求处理。
这时候引入了Cookie 的状态管理。
Cookie 技术通过在请求和响应报文中写入 Cookie 信 息来控制客户端的状态。 Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的 首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器 发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。 服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
例如:我们登录到某个网站上操作的时候,我们不能跳转一个页面就得重新登录,是特别麻烦的事情。
但是 cookie并不安全,这时候我们就使用Session 管理及 Cookie 应用。
步骤 1: 客户端把用户 ID 和密码等登录信息放入报文的实体部分, 通常是以 POST 方法把请求发送给服务器。而这时,会使用 HTTPS 通信来进行 HTML表单画面的显示和用户输入数据的发送。
步骤 2: 服务器会发放用以识别用户的 Session ID。通过验证从客户 端发送过来的登录信息进行身份认证,然后把用户的认证状态与 Session ID 绑定后记录在服务器端。
步骤 3: 客户端接收到从服务器端发来的 Session ID 后,会将其作为 Cookie 保存在本地。下次向服务器发送请求时,浏览器会自动发送 Cookie,所以 Session ID 也随之发送到服务器。服务器端可通过验证 接收到的 Session ID 识别用户和其认证状态。
5.https协议:
首先我们要知道http协议的一些缺点:
通信使用明文(不加密),内容可能会被窃听
不验证通信方的身份,因此有可能遭遇伪装
无法证明报文的完整性,所以有可能已遭篡改
这时候我们就引入了一种由HTTP+ 加密 + 认证 + 完整性保护 =HTTPS协议。
可以参考如下,体会https的加密过程
https://blog.csdn.net/guolin_blog/article/details/104546558