深入HTTP协议
一、HTTP定义
超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。
HTTP是一个属于应用层的面向对象协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出。
HTTP协议是构建再TCP/IP协议之上的,是TCP/IP协议的一个子集。
二、TCP/IP协议
TCP/IP协议族是由一个四层协议组成的系统,这四层分别是:应用层、传输层、网络层、数据链路层
应用层:一般是我们编写的应用程序,决定了向用户提供的应用服务。应用层可以通过系统调用与传输层进行通信。
如FTP、DNS、HTTP等。
传输层:通过系统调用向应用层提供处于网络连接中的两台计算机之间的数据传输功能。
传输层由两个性质不同的协议:TCP和UDP。TCP面向连接,UDP无连接。
网络层:用来处理在网络上流动的数据包,数据包是网络传输的最小数据单位。
网络层规定了通过怎样的路径(传输路线)到达对方计算机,并把数据包传输给对方。
链路层:用来处理连接网络硬件部分,包括控制操作系统、硬件设备驱动、NIC网络适配器以及光纤等物理可见部分。硬件范畴均在链路层作用范围。
三、数据包封装过程
四、HTTP数据传输过程
发送端发送数据,数据会从上层传输到下层,且每经过一层都会被打上该层的头部信息。
接收端接受数据,数据会从下层传输到上层,传输前会把下层头部信息删除。
五、传输层TCP三次握手
使用TCP协议进行通信的双方必须先建立连接,然后才能开始传输数据。为了确保连接双方可靠性,在建立连接时,TCP协议采用了三次握手策略。
三次握手主要是为了判断客户端和服务端的收发能力都是正常。
第一次握手服务端能判断客户端发送能力正常
第二次握手客户端能判断服务端接收能力正常和自己发送能力正常
第三次握手服务端能判断服务端发送能力正常
TCP连接全过程:
六、HTTP协议特点
1、支持客户/服务器模式,必须是客户端发起的请求
2、简单快速,发送请求时只需传送请求方法和路径
3、灵活,允许传输任意类型的数据对象,正在传输的类型由Content-Type来标记
4、无连接,限制每次连接只处理一个请求
5、无状态,对于事务处理没有记忆能力
七、URI与URL
URI:一个紧凑的字符串用来标示抽象或物理资源
URI可以进一步被分为定位符、名字或两者都是
术语“Uniform Resource Locator”(URL)是URI的子集,除了确定一个资源,还提供一种定位该资源的主要访问机制(如网络“位置”)
URI可以分为URL,URN或同时具备locators和names特性的一个东西
URN作用就好像一个人的名字,URL就像一个人的地址
URN确定了东西的身份,URL提供了找到它的方式
八、HTTP报文结构
请求报文:
HTTP的报文头可分四类:
1、通用报文头
2、请求报文头
3、响应报文头
4、实体报文头
HTTP1.1中一共定义了47种报文头
响应报文:
九、HTTP请求方法
1、GET
2、POST
3、PUT,PUT和POST的区别,PUT是幂等,而POST是不幂等。
4、HEAD,类似于GET请求,只不过返回的响应中没有具体内容,用于获取报文头。
5、DELETE
6、OPTIONS,用来查询针对请求URI指定的资源支持的方法。
7、TRACE,回显服务器收到的请求,主要用于测试或诊断,容易引发XST的攻击。
8、CONNECT,开启一个客户端与所请求资源之间的双向沟通的通道,它可以用来创建隧道。一般代理服务会使用。
十、状态码
1XX:表示消息,代表请求已被接受。
2XX:表示成功。
2XX常见状态码:
3XX:表示重定向。
3XX常见状态码
4XX:表示请求错误,一般是客户端发生错误。
4XX常见状态码
5XX:表示服务端错误。
5XX常见状态码
十一、HTTP状态管理
Cookies 与 Session
Cookies工作原理
Session工作原理
Cookies与Session的不同
1、存放位置
2、安全性(隐私策略)
3、有效期
4、对服务器压力
十二、HTTP协议身份认证
1、BASIC认证(基本认证)
2、DIGEST认证(摘要认证)
3、SSL客户端认证
4、FormBase认证(基于表单认证)
十三、HTTP的长连接和短连接
长连接和短连接本质是TCP长连接和短连接。
十四、代理
代理作用:抓包、FQ、匿名访问、过滤器。
代理是相同协议的转发。
十五、网关
网关可以作为某种翻译器使用,它抽象了一种能够到达资源的方。网关是资源和应用程序之间的粘合剂。
网关是不同协议的转发。
十六、HTTP缓存
1、Cache-Control:请求/响应头,缓存控制字段
no-store:所有内容都不缓存
no-cache:缓存,但是浏览器使用缓存前,都会请求服务器判断缓存资源是否是最新
max-age=x(单位秒)请求缓存后的X秒不再发起请求
s-maxage=x(单位秒)代理服务器请求源站缓存后的X秒不再发起请求,只对CDN缓存有效
public:客户端和代理服务器(CDN)都可缓存
private:只有客户端可以缓存
2、Expires:响应头,代表资源过期时间,由服务器返回提供,是http1.0的属性,在与max-age共存的情况下,优先级要低
3、Last-Modified,响应头,资源最新修改时间,由服务器告诉浏览器。
if-Modified-Since,请求头,资源最新修改时间,由浏览器告诉服务器,和Last-Modified是一对,两个进行比对。
4、Etag,响应头,资源标识,由服务器告诉浏览器。
if-None-Match,请求头,缓存资源标识,由浏览器告诉服务器(其实是上次服务器给的Etag),和Etag是一对,两个进行比对。
用户操作对缓存的影响:
十七、HTTP内容协商机制
指客户端和服务端就响应内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。
内容协商方式:
1、客户端驱动,几乎不用,因为需要两次请求才能进行正式内容的发送
2、服务器驱动,服务器检查客户端的请求头部集决定提供哪个版本的页面
请求头部集:
(1)Accept:告知服务器发送何种媒体类型
(2)Accept-Language:告知服务器发送何种语言
(3)Accept-Charset:告知服务器发送何种字符集
(4)Accept-Encoding:告知服务器采用何种编码
响应头部集:
(1)Content-Type
(2)Content-Language
(3)Content-Type
(4)Content-Encoding
3、透明协商,中间设备协商,不常用可能是未来趋势
服务器驱动内容协商的近似匹配
如:Accept-Language:en;q=0.5,fr;q=0.0,nl;q=1.0,tr;q=0.0
q1.0的优先级最高
十八、HTTP断点续传和多线程下载
断点续传实现方式:
HTTP是通过在Header里两个参数实现,客户端发请求时对应的时Range,服务端响应时对应的是Content-Range。
Range:用户请求头中,指定第一个字节位置和最后一个字节位置,
一般格式:Range:(unit=first byte pos)-(last byte pos)
Content-Range:用于响应头中,在发出带Range的请求后,服务器在Content-Range头部返回当前接受的范围和文件总大小,
一般格式:Content-Range:bytes(unit first byte pos)-[last byte pos]/[entity length]
使用断点续传的状态码是206 Partial Content
多线程下载就是利用断点续传进行主动的拆包下载。
十九、HTTPS
内容加密:非对称密钥交换、对称内容加密
身份认证:数字证书
二十、HTTP协议的瓶颈
一条连接上只能发送一次请i去
请求只能从客户端开始。客户端不可以接受除响应以外的指令
请求\响应头部不经压缩就发送
每次相互发送相同的头部造成的浪费
非强制压缩发送
二十一、WebSocket
二十二、HTTP2.0
优势点:
1、性能增强核心:二进制分帧
2、首部压缩
3、多路复用
4、并行双向字节流的请求和响应,即可以无序传输
5、服务器推送
仍存问题
1、队头阻塞
2、建立连接的握手延迟大
二十三、HTTP3.0
基于谷歌提出的QUIC协议进行的改造。
优势:
1、0 RTT
2、没有队头阻塞的多路复用
3、前包纠错功能
深入HTTP协议的更多相关文章
- HTTP协议系列(1)
一.为什么学习Http协议 首先明白我们为什么学习HTTP协议,也就是说明白HTTP协议的作用.HTTP协议是用于客户端与服务器之间的通讯.明白了HTTP协议的作用也就知道了为什么要学习H ...
- 重温Http协议--请求报文和响应报文
http协议是位于应用层的协议,我们在日常浏览网页比如在导航网站请求百度首页的时候,会先通过http协议把请求做一个类似于编码的工作,发送给百度的服务器,然后在百度服务器响应请求时把相应的内容再通过h ...
- 协议森林17 我和你的悄悄话 (SSL/TLS协议)
作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. TLS名为传输层安全协议(Transport Layer Protocol),这个协议是一套加密的 ...
- 协议森林16 小美的桌号(DHCP协议)
作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. DHCP协议用于动态的配置电脑的网络相关参数,如主机的IP地址,路由器出口地址.DNS域名服务器地 ...
- 简约之美Jodd-http--深入源码理解http协议
Jodd 是一个开源的 Java 工具集, 包含一些实用的工具类和小型框架.简单,却很强大! jodd-http是一个轻巧的HTTP客户端.现在我们以一个简单的示例从源码层看看是如何实现的? Http ...
- 【JavaScript】javascript中伪协议(javascript:)使用探讨
javascript:这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行. 比如下面这个死链接: <a href="javasc ...
- SNMP简单网络管理协议
声明:以下内容是学习谌玺老师视频整理出来(http://edu.51cto.com/course/course_id-861.html) SNMP(Simple Network Management ...
- 海鑫智圣:物联网漫谈之MQTT协议
什么是MQTT协议 MQTT(消息队列遥测传输协议)是IBM在1999年专门针对物联网等应用场景来制订的轻量级双向消息传输协议,它主要是为了解决物联网上使用到的设备的互相通信的问题,以及这些设备与后端 ...
- linux-图形化远程管理协议
远程管理控制方式: RDP(remote desktop protocol)协议: telnet: SSH(Secure Shell): RFB(Remote FrameBuffer)协议(图形化远程 ...
- RTP与RTCP协议介绍(转载)
RTSP发起/终结流媒体.RTP传输流媒体数据 .RTCP对RTP进行控制,同步.RTP中没有连接的概念,本身并不能为按序传输数据包提供可靠的保证,也不提供流量控制和拥塞控制,这些都由RTCP来负责完 ...
随机推荐
- httpHelper 从URL获取值
/// <summary> /// 从URL获取值(字符串) /// </summary> public static string GetValueFromUrl(strin ...
- 34 异常机制 异常体系结构 Java把异常当做对象来处理 并定义一个基类java.lang.Throwable作为所有异常的超类 Error Exception
异常体系结构 概念 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类. 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Erro ...
- LGP4284题解
这个题,题面是[],出题人也是个[] 真就只放前向星过,把 vector 和离线建图都卡了... 题意: 一棵树,一条边有 \(p_i\) 的概率连接两个节点,一个点有 \(P_i\) 的概率亮着,问 ...
- 如何用three.js(webgl)搭建3D粮仓、3D仓库、3D物联网设备监控-第十二课
序: 最近因为疫情,居家办公,索性翻翻之前的项目案例,总结总结. 这次疫情,深圳停摆,群众也挺恐慌的,封闭前一天,超市被抢购一空,虽然官方媒体一再强调,材米油盐蔬菜肉类管够,但是任然挡不住群众们的抢购 ...
- Python IO文件管理
文件操作 我们可以使用python来操作文件,比如读取文件内容.写入新的内容等,因为任何计算机文件的本质都是一些有不同后缀的字符组成的. python文件操作的两种模式 打开模式 while,写入模式 ...
- 基于AE的基础的GIS系统的开发
一个GIS系统需要的基本功能的代码 一些基本的拖拽操作就不讲了,直接上代码吧. 1. 打开.mxd文件 基本思路:判断mxd路径存在→打开mxd文件 string filename = Appli ...
- JavaWeb 11_jsp九大内置对象
1. out: 输出对象,向客户端输出内容2. request: 请求对象;存储"客户端向服务端发送的请求信息" request对象的常见方法: String getParamet ...
- USB接口定义 | USB Type C接口定义 | 制作Type A转Type C充电-数据线
1. USB接口定义 2. USB Type C接口定义 Type C接口母头(插座) Type C接口公头(插头) 引脚定义 参考:https://www.cnblogs.com/zhouhaoch ...
- Github使用指南(学习中随时更新)
注册好一个账号后先创建一个仓库 点击"Create repository"创建一个版本库 填好带*号的必填项,选择是要公开仓库还是私人使用,勾选自动添加README选项 READM ...
- 写clone()方法时,通常都有一行代码,是什么?
clone 有缺省行为,super.clone();因为首先要把父类中的成员复制到位,然后才是复制自己的成员.