HTTP协议

1.举例
Cache-Control缓存控制是WEB开发中对性能提升最大的一部分,不仅仅是设置缓存过期时间。可以设置是否适用缓存,只在客户端缓存,缓存验证(last-modified配合if-modified-since验证或者stag配合if-none-match验证)
Cookie用来保持会话信息
Content-Type、Content-Encoding等用来约束数据类型
CORS实现跨域并保持安全性限制
问题:HTTPS为什么安全
    什么是长链接,为什么需要
    HTTP2的信道复用为什么可以提高性能

2.浏览器输入URL后HTTP请求返回的完整过程:

对于开发者来讲,可以根据哪个时间段耗时最长 针对性的去优化

首先要redirect,因为浏览器可能记录的地址已经永久跳转成了新地址,所以一开始浏览器需要先去判断是否需要redirect以及redirect到哪里
 第二步:看缓存,因为请求的资源可能已经缓存过了,如果没有的话要去服务器请求资源
 第三步:DNS查找,如果向服务器请求资源的话,因为我们输入的是域名,域名要对应到ip地址才能够访问服务器,所以需要DNS查找
 第四步:有了ip之后去创建tcp连接,HTTP是基于TCP的;如果本次请求是HTTPS的要同时创建HTTPS的连接
 第五步:连接创建完成后才真正开始发送请求的数据包
 第六步:服务器收到请求后返回数据
一个HTTP请求才真正完成

3.相关概念

物理层定义物理设备如何传输数据

数据链路层在通信实体间建立数据链路连接

网络层为数据在结点之间传输创建逻辑链路,比如我的电脑要访问百度的服务器,如何去寻找百度服务器所在地址

传输层向用户提供可靠的端到端(end-to-end)的服务,和百度的服务器建立连接后两端如何传输数据,大的数据分包,组装之类的

应用层用为应用软件提供了很多服务,屏蔽网络传输细节

HTTP请求与TCP连接不是一回事,HTTP1.1之后在同一个TCP连接中可以发送多个HTTP请求
1.1大部分数据通过字符串传输 
2通过二进制帧传输,所以同一个连接里面发送多个请求可以不按顺序,并行传输效率升高,头信息压缩提高效率/服务器端新增推送功能主动发起会话


3.HTTP的三次握手
在同一个TCP连接中可以发送多个HTTP请求;降低多次三次握手的开销
多个请求可以并行:同一个用户对同一个服务器发起请求时只需要一个TCP连接

为什么要三次握手:防止服务端开启一些无用的连接,规避因网络传输时延导致的连接开销。因为网络传输有延时,如果客户端发起请求,服务端直接创建连接返回数据给客户端的话,该数据包可能丢失,客户端一直收不到,假如超时关闭,服务器端不知道连接是否关闭,浪费。让客户端和服务端及时察觉到连接状态。
可以wireshark抓包查看同一端口号到80端口建立连接的三次数据包

4.URI/URL/URN为了找到资源并访问
HTTP中主要用URL
URI【uniform resouce identifier统一资源标志符,用来标唯一识互联网上的信息资源】包含URL【uniform resouce locator统一资源定位符】和URN【永久统一资源定位符,内容搬了一个位置,也可以通过URN找到资源】
很多不同协议的标识符都可以叫URL,不仅仅是HTTP
URL:http://user:pass@host.com:80/path?query=string#hash
    http协议类型 ,也可以是ftp等   
    user:pass这种账户输入不安全,现在很少用
    host.com用来定位资源所在服务器在互联网中的位置,可以是ip也可以是域名
    :80端口号,http的端口是80,定位一个物理服务器上存放的许多WEB服务器中的一个,不带端口 默认传80端口,一版发布都不带端口
    /path:路由,找路径,类似linux下目录的写法,定位web服务目录下的路径,但现在数据都存放在数据库中,所以用它辨别本次请求的啥数据,在程序中判断而不是直接对应目录关系
    query=string搜索参数,要请求的资源如何搜索查找,基本上web服务用它传参
    hash假设找到文档但只看一部分,用hash 代表文档某个分片

5.HTTP报文格式


请求报文
首行,首行与header不是一回事。
    首行首先包含一个method,HTTP有很多种method,GET获取/POST创建/PUT更新/DELETE,有各自的语义,一个完成度非常高的Web服务会对于同一个源L的不同的请求方法会有不同的处理。语义化定义,无强约束/可以违反但不建议
    首行第二部分 源L(请求的资源的地址,一般只存放路由相关信息而不会包含http://协议)  服务端需要解析此部分及连接 ,在发起请求时连接已建立完成所以没必要再放这部分(路由),只需告诉服务器具体请求的资源是哪个地方
    首行第三部分 版本1.1
首部
主体
响应报文
首行第一部分 协议版本
第二部分 code本次请求目前处于啥状态 200 OK(code及其解释) 3xx4xx
首部  空行与主体区分开
主体

HTTP方法:定义对资源的操作
    常用:GET获取/POST创建/PUT更新/DELETE删除数据
HTTP CODE:定义服务器对请求的处理结果,各个区间的CODE有各自的语义 比如:401未认证无权限(网上有很多)
    一个好的HTTP服务可以通过CODE判断结果
6.HTTP客户端
浏览器是最常用的HTTP客户端

比如打开csdn,在浏览器调试工具中可以看到如下界面:

在git.bash输入curl baidu.com

区别在于浏览器会去解析HTML的内容

再输入curl www.baidu.com

这个返回内容就跟浏览器差不多,但是浏览器有渲染

加上-v参数,可以看到

可以看到域名查到了百度服务器的IP

请求的报文头

返回的报文头

8.缓存头cache-control的含义与使用(声明性,建议这么做,但不强制)1常用
public 返回的内容所经过的任何路径上的节点都可以进行缓存操作1
private只有发起请求的浏览器可以进行缓存1
no-cache 可以缓存但每次使用需要去服务器验证可以使用1
max-age=<seconds>缓存过期时间1
s-maxage=<seconds>只在代理服务器生效,浏览器只关心max-age
max-stale=<seconds>浏览器主动添加的头,即便缓存已经过期 在此时间内可以使用已经过期的缓存
must-revalidate 如果已经过期,必须去源服务器获取数据,而不能直接使用缓存
proxy-revalidate 对缓存服务器而言,如缓存过期 去源服务器获取
no-store 彻底不可以缓存
no-transform 不允许代理服务器改动内容
实际我们需要在客户端缓存这样打开页面快但是不希望服务器已经更新了但是客户端不知道依然使用缓存中的东西:
常用方案:在名字上加上一串根据内容算hash码,若内容没有变化hash就不变,反映在浏览器中就是url没变。若有变化发起请求时嵌入在url中的路径就会变化,hash会变,这样就会发起新的请求而不是用缓存

9.返回验证Last-Modified和ETag的使用


当设置no-chche时每次请求需要服务器验证是否可以使用缓存

 

10HTTPS

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值