一、HTTP 协议认识
●HTTP (HyperText Transfer Protocol),即超文本运输协议,是实现网络通信的一种规范协议(应用层协议),在可靠地网络层协议(TCP/IP)的基础上提供了在Web服务器和客户机之间传输信息的一种机制。并规定了两者之间信息交互的信息格式;
●使用HTTP通信的时候,一条线路上必然有一端是客户端,另一段是服务端;在实际应用中,HTTP常被用于在Web浏览器和网站服务器之间传递信息,以明文方式发送内容,不提供任何方式的数据加密。
1.web服务器
HTTP通信时候离不开服务器,因此先简单介绍一下web服务器。
(1)用虚拟主机可以实现一个web服务器上部署多个域名的网站;
●使用虚拟主机可以让一个服务器下寄存多个主机名和域名的网站,域名可以通过DNS服务映射到服务器的IP地址。所以在HTTP请求时候,在请求头中的HOST中必须完整指定主机名或者域名的url
(2)配合服务器工作的数据转发程序
●代理:一种有转发功能的应用程序,充当了客户端和服务器之间中间人的角色,有正向代理(代理客户端)和反向代理(代理服务端),常用的nginx就是反向代理
●网关:通过中间的网关进行处理后,能使客户端与非HTTP协议的服务进行通信
●隧道:隧道不会去处理HTTP请求,只会在客户端和服务端通过加密等手段建立安全的通信线路
Web是一种超文本信息系统,采用超文本信息组织方式,将信息资源链接到整个Internet上。以便所有进入互联网的用户访问。在Web系统中,每一个信息被称作资源,并用一个全局的统一资源标识符URI进行标识,这些资源再通过超文本传输协议传送给用户。用户通过链接访问到想要获取的资源。
互联网Internet和Web并非是一个概念,互联网是一个基础平台,而Web是一种应用层服务。如QQ Email都是互联网上的服务。
2.HTTP是无状态的协议,引入cookie技术管理状态
使用HTTP协议,每当有新的请求发送时,就会产生新的响应,不会保留之前的请求或者响应的一切信息。但是在使用中经常有需要保存状态的场景,比如识别是否登录状态,识别发送请求的用户身份。于是引入了Cookie技术。作用原理:
●客户发送请求,把用户名和密码等登录信息发送给服务器
●服务收到登录信息后进行验证,然后把认证状态和sessionID绑定记录在后端,在响应时候响应头中带有写入session ID的Set-Cookie字段
●客户端收到响应后,有set-cookie字段,会保存或者更新本地的cookie,下次发请求给服务端时候,会自动带上cookie信息发送给服务端,服务端就可以通过cookie字段里面的信息识别用户和用户的认证状态
3.HTTP协议的支持持久连接
在早期的时候每进行一次HTTP通信就要进行一次TCPL连接,下次再进行就又要开始一次TCP的连接,随着web技术的发展,大量的文字图片等内容需要传递和通信,所以每一次都要进行TCP连接就不能满足了,不仅让服务器负载压力大,http请求请求等也会很慢
因此自1999年的HTTP/1.1版本中增加了HTTP keep-alive即持久连接功能,只要建立连接后可多次发送HTTP请求,直到断开连接。
二、HTTP 的特点和缺点
\
特点:无连接、无状态、灵活、简单快速
●无连接:每一次请求都要连接一次,请求结束就会断掉,不会保持连接
●无状态:每一次请求都是独立的,请求结束不会记录连接的任何信息(提起裤子就不认人的意思),减少了网络开销,这是优点也是缺点
●灵活:通过http协议中头部的Content-Type标记,可以传输任意数据类型的数据对象(文本、图片、视频等等),非常灵活
●简单快速:发送请求访问某个资源时,只需传送请求方法和URL就可以了,使用简单,正由于http协议简单,使得http服务器的程序规模小,因而通信速度很快
●\
缺点:无状态、不安全、明文传输、队头阻塞
●无状态:请求不会记录任何连接信息,没有记忆,就无法区分多个请求发起者身份是不是同一个客户端的,意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大
●不安全:明文传输可能被窃听不安全,缺少身份认证也可能遭遇伪装,还有缺少报文完整性验证可能遭到篡改
●明文传输:报文(header部分)使用的是明文,直接将信息暴露给了外界,WIFI陷阱就是复用明文传输的特点,诱导你连上热点,然后疯狂抓取你的流量,从而拿到你的敏感信息
●队头阻塞:开启长连接(下面有讲)时,只建立一个TCP连接,同一时刻只能处理一个请求,那么当请求耗时过长时,其他请求就只能阻塞状态;
●\
三、HTTP 报文组成部分
http报文:由请求报文和响应报文组成;
\
1.请求报文
请求报文包含请求头和内容主体部分,请求头包含请求行(请求方法,url, http版本)和请求首部字段
请求行: 方法: GET 获取资源 POST 向服务器端发送数据,传输实体主体 PUT 传输文件 HEAD 获取报文首部 DELETE 删除文件 OPTIONS 询问支持的方法 TRACE 追踪路径 协议/版本号 URL
请求头: 通用首部(General Header) 请求首部(Request Header) 响应首部(Response Header) 实体首部(Entity Header Fields)
空行
请求体:
1.1请求报文拆解
1.1 get请求
1.2 ****post请求
\
2. 响应报文
响应报文也包含响应头和响应内容主题部分,响应头由响应行(HTTP版本、状态码)和响应首部字段组成组成
响应报文拆解:
响应行 (HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)
响应头 Date:生成响应的日期和时间; Content-Type:指定了MIME类型的HTML(text/html),编码类型是ISO-8859-1
响应体
四、首部
4.1 通用首部字段
4.2 请求首部字段
4.3 响应首部字段
4.4 实体首部字段
五、HTTP 请求方法
HTTP1.0: GET、POST、HEAD
HTTP1.1: PUT、PATCH、DELETE、OPTIONS、TRACE、CONNECT
GET 和 POST 的区别
●GET在浏览器回退时是无害的,而POST会再次发起请求
●GET请求会被浏览器主动缓存,而POST不会,除非手动设置
●GET请求参数会被安逗保留在浏览器历史记录里,而POST中的参数不会被保留
●GET请求在URL中传递的参数有长度限制(浏览器限制大小不同),而POST没有限制
●GET参数通过URL传递,POST放在Request body中
●GET产生的URL地址可以被收藏,而POST不可以
●GET没有POST安全,因为GET请求参数直接暴露在URL上,所以不能用来传递敏感信息
●GET请求只能进行URL编码,而POST支持多种编码方式
●对参数的数据类型,GET只接受ASCII字符,而POST没有限制
●GET产生一个TCP数据包,POST产生两个数据包(Firefox只发一次)。GET浏览器把 http header和data一起发出去,响应成功200,POST先发送header,响应100 continue,再发送data,响应成功200
六、HTTP状态码
(摘自:《图解HTTP》)具体的一些经常使用的状态码:
●200:请求成功
●204:请求成功,但是响应只有响应头没有响应内容
●206:客户端执行的是范围请求,服务端成功执行
●301:永久性重定向,请求的资源地址的url已经变更了
●302:暂时性重定向,请求的资源暂时被分配了新的url
●303: 与302功能一样,并且表示客户端应使用GET方法访问另外一个URI
●304:告诉客户端,所请求的内容距离上次访问并没有变化. 客户端可以直接从浏览器缓存里获取该资源
●400:语法错误,服务器无法解析
●401:表示发送的请求需要认证或者认证失败过期等
●403: 服务器拒绝提供服务,不允许访问
●404: 服务器上没有请求的资源
●500: 服务器内部执行过程中出现了错误
●503: 服务器当前无法处理请求.这个状况是临时的,并且将在一段时间以后恢复.如果能够预计延迟时间,那么响应中可以包含一个Retry-After:头用以标明这个延迟时间.如果没有给出这个Retry-After:信息,那么客户端应当以处理500响应的方式处理它
\
七、HTTP协议工作流程
一次HTTP操作称为一个事务,其工作过程大概如下:
1.用户在浏览器中键入需要访问网页的URL或者点击某个网页中链接;
2.浏览器根据URL中的域名,通过DNS解析出目标网页的IP地址;
浏览器请求这个页面:hackr.ip/index.html在… 20X.189.105.112。然后将上面结合本机自己的信息,封装成一个http请求数据包复制代码
1.在HTTP开始工作前,客户端首先会通过TCP/IP协议来和服务端建立链接(TCP三次握手)
2.建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可内容。
3.服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive,TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
\
\
●什么是持久化/长链接
长链接,指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。
长链接操作步骤:建立连接——数据传输...(保持连接)...数据传输——关闭连接
长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间
长链接分为 without pipelining 和 with pipelining,下图中是without pipelining,客户端只在收到前一个请求的响应后,才发出新的请求。
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
●什么短连接
短连接的操作步骤是: 建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接
如果客户请求频繁,将在TCP的建立和关闭操作上浪费较多时间和带宽。
●什么是管线化(管道化)
每次建立链接后无需等待请求回来就可以发送下一个请求
文章引用:
1.《HTTP基础知识总结》juejin.cn/post/697805…
2.《20分钟助你拿下HTTP和HTTPS,巩固你的HTTP知识体系》 juejin.cn/post/699462…
3.《5分钟让你明白HTTP协议》juejin.cn/post/684490…