HTTP你真的懂了吗?
最近面试踩了些坑,自己看书看过的内容,即使能记得差不多,回答起来就是很混乱(绝望脸)。比如HTTP的这几个问题,现在整理一下,一个点一个点的说!
1. 聊一聊你理解的HTTP
1) Http在OSI七层模型中属于应用层协议;
2) Http请求报文:主要由请求行、请求头、空行、请求正文(get请求没有正文)组成:
a) 请求行:请求方法(get/head/put/post/trace/delete/options)、URL、协议版本(http1.0/http1.1/http2.0);
b) 请求头:为请求报文添加附加信息(host/user-Agent/Accept-Charset/Accept-Encoding)
c) 空行:表示请求头部结束;
d) 请求正文:可选部分(get请求没有正文);
3) Http响应报文:主要由状态行、响应头、空行、响应正文:
a) 状态行:协议版本、状态码、状态码描述;
b) 响应头:附加信息(content-type/content-length);
c) 空行:响应头结束;
d) 响应正文
4) Http无状态:对于事务处理是无记忆的不保存客户端提交的信息,即当服务器返回应答之后,这次事务的所有信息会丢失,如果用户发来一个新的请求,服务器无法判断是否与前一次请求的联系;
a) 优点:服务器不需要为客户端连接分配内存记忆大量状态,也不用在客户端失去连接时清理内存节省服务器资源;
b) 缺点:缺少状态。在后续处理需要前面的信息,客户端需要重传,导致每次连接传送的数据量增大:
i. 采用会话跟踪技术解决这个缺点;
ii. 四种会话跟踪技术:(1)cookie、(2)session、(3)URL重写、(4)作为隐藏域嵌入到HTML表单中;
2. 说说http/1.0、http/1.1? HTTP/2.0你懂吗?
1) HTTP/1.0和HTTP/1.2区别:
a) 连接方式上:
i. HTTP/1.0默认使用短连接;要建立长连接需要在请求消息中包含Connection:keep-Alive的头阈;服务器端接受长连接也会包含一个Connection:keep-Alive的头阈;
ii. Http/1.1默认使用长连接,只要客户端/服务器端任意一端没有明确断开TCP连接就一直保持连接;同时,默认采用流水线方式发送请求。
b) 传输数据上,
i. HTTP/1.0指定长度机制是content-length字段,静态资源易确定;动态生成的响应,只有等它全部生成之后才能正确地填写content-length值,要求缓存整个响应,服务器端占用大量缓存,延长了响应用户时间;
ii. HTTP/1.1用分块传输的方法。消息体分割成组块,每个组块前面加上该组块的长度,末尾发送长度为0的组块,接收方据此判断整条消息都已经传输完毕。避免了服务器端占用大量的内存;
c) 状态码100 continue,HTTP/1.1增加新状态码100 Continue,用于客户端在发送POST数据传给服务器前,征询服务器的情况,看服务器是否处理POST数据;(POST数据大于1024时发起询问)
d) HOST阈,HTTP1.1在Request消息头里多了一个HOST阈;HTTP/1.0中,认为每台服务器都绑定一个唯一的IP地址,这个IP地址只有一个主机,实际上一台主机可以有多台虚拟机,共享一个IP地址;
2) HTTP/2.0(相比HTTP1.x增加了哪些?)
a) 新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
b) 多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
c) header压缩,HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
d) 服务端推送(server push),HTTP2.0具有server push功能。
3. HTTP浏览器缓存
客户端请求过程(这里针对请求-->缓存,不聊DNS /TCP /ARP过程)
1) 客户端请求一个页面page;
2) 服务器端返回页面page,并且给页面page加上一个Last-Modified和Etag标签;
3) 客户端展示页面page,并且将页面page、Last-Modified和Etag的值都缓存起来;
4) 客户端再次请求页面page,并将上次请求时服务器返回的Last-Modified和Etag的值一起传递给服务器;
5) 服务器检查该Last-Modified或者Etag(优先验证Etag)的值,判断该页面自上次客户端请求之后是否改变:
a) 如果未修改,直接返回响应状态码304和一个空响应体;
b) 如果已经修改,返回状态码200和新文件;丢弃旧文件,把新文件缓存起来
补充几个概念:
1. Last-Modified: 记录页面最后被修改时间的HTTP头信息(服务器发到客户端的,针对时间)
2. If-Modified-Since:记录页面最后被修改时间的HTTP头信息(客户端发到服务器端的,针对时间)
3. Etag、if-none-match: 判断资源是否有改变(针对任何属性资源,例如资源的MD5等等)
长连接和短连接的原理,改天补充
HTTP你真的懂了吗?的更多相关文章
- [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
- 【转】was mutated while being enumerated 你是不是以为你真的懂For...in... ??
原文网址:http://www.jianshu.com/p/ad80d9443a92 支持原创,如需转载, 请注明出处你是不是以为你真的懂For...in... ??哈哈哈哈, 我也碰到了这个报错 . ...
- javascript的语法作用域你真的懂了吗
原文:javascript的语法作用域你真的懂了吗 有段时间没有更新了,思绪一下子有点转不过来.正应了一句古话“一天不读书,无人看得出:一周不读书,开始会爆粗:一月不读书,智商输给猪.”.再加上周五晚 ...
- 你真的懂ajax吗?
前言 总括: 本文讲解了ajax的历史,工作原理以及优缺点,对XMLHttpRequest对象进行了详细的讲解,并使用原生js实现了一个ajax对象以方便日常开始使用. damonare的ajax库: ...
- “三次握手,四次挥手”你真的懂吗?TCP
“三次握手,四次挥手”你真的懂吗? mp.weixin.qq.com 来源:码农桃花源 解读:“拼多多”被薅的问题出在哪儿?损失将如何买单? 之前有推过一篇不错的干货<TCP之三次握手四次挥手 ...
- 你真的懂 ajax 吗?
前言 总括: 本文讲解了ajax的历史,工作原理以及优缺点,对XMLHttpRequest对象进行了详细的讲解,并使用原生js实现了一个ajax对象以方便日常开始使用. damonare的ajax库: ...
- 【转】先说IEnumerable,我们每天用的foreach你真的懂它吗?
[转]先说IEnumerable,我们每天用的foreach你真的懂它吗? 我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq ...
- 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截
程序猿修仙之路--数据结构之你是否真的懂数组? 数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构 .要想在之后的江湖历练中通关,数据结构必不可少. ...
- C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
- 你真的懂printf么?
自从你进入程序员的世界,就开始照着书本编写着各种helloworld,大笔一挥: printf("Hello World!\n"); 于是控制台神奇地出现了一行字符串,计算机一句温 ...
随机推荐
- lua循环,减少不必要的循环
lua中for循环的理解 for i=1, 10 do i = i+3 cclog("i=======%d",i) end 输出:4,5,6,7,8,9,10,11,12,13 相 ...
- oracle导入dmp文件的2种方法
使用imp.impdp方式导入数据 1.使用imp导入数据 打开cmd窗口,然后直接敲入一下命令即可,需要注意的是,要事先把dmp文件放到正确的路径中去 imp yx_base/@yx_192. fi ...
- 听翁恺老师mooc笔记(9)--枚举
枚举类型的定义 用符号而不是具体的数字来表示程序中的数字,这么表示的好处是可读性,当别人看你的程序,看到的是单词,很容易理解这些数字背后的含义,那么用什么符号来表示名字哪?需要const int常量的 ...
- Beta冲刺-用户测试报告
一.项目概述 1.1项目名称 高校学生征信系统 1.2项目简介 此项目基于SSH框架,力图为学生提供征信服务和信用相关的借款和申请活动.其中以信用统计和管理为主,信用使用为辅,构建出一个集信用收集和使 ...
- 20162318 实验三《 敏捷开发与XP实践》实验报告
北京电子科技学院(BESTI) 实 验 报 告 课程:程序设计与数据结构 班级:1623班 姓名:张泰毓 指导老师:娄老师.王老师 实验日期:2017年5月12日 实验密级:非密级 实验器材:带Lin ...
- 201621123060《JAVA程序设计》第一周学习总结
1.本周学习总结 1.讲述了JAVA的发展史,关于JDK.JRE.JVM的联系和区别 2.JDK是用JAVA开发工具.做项目的关键.JRE是JAVA的运行环境(JAVA也是JAVA语言开发的).JVM ...
- 学号:201621123032 《Java程序设计》第3周学习总结
1:本周学习总结 1. 写出你认为本周学习中比较重要的知识点关键词. 类,对象,封装,继承,方法. 2. 用思维导图或者Onenote或其他工具将这些关键词组织起来 2:书面作业 2.1:以面向对象方 ...
- C++类型萃取
stl中的迭代器和C++中的类型萃取: http://www.itnose.net/detail/6487058.html 赐教!
- iOS中CocoaPods的安装及错误详解
什么是CocoaPods CocoaPods是OS X和iOS下的一个第三类库管理工具,通过CocoaPods工具我们可以为项目添加被称为"Pods"的依赖库(这些类库必须是Coc ...
- Hibernate之HQL
SQL语句的DML操作不外乎:增,删,改,查 增加 : save(),persist() 删除 : delete() 改动 : update() 查询 : get() ,load() 其 ...