前言:
最近面了360搜索的后台开发,面试内容比较一般,问了问项目,再问了问算法,都答了上来,但是最后自己脑残问了个面试官不喜欢的问题,结果就挂了。想来没什么好总结的,就说说之后的打算把。
4月份以来,一直在找实习,准备面试,笔试的过程中,结果这个月基本没有怎么学习了。看看自己的博客更新记录和github的push记录,简直惭愧。以前那个一心奋斗,一定要进入bat的那个人哪里去了。在离目标这么接近的时候放弃了,我对不起我自己一年多的努力,也只会让我的前女友更加看不起我了。
之后的日子,打算先花两周看完《STL源码解析》,并且中间必须要更新博客,然后再花两周时间写一个HTTP服务器,不一定要多复杂,要让自己熟悉写一个复杂服务器的过程。然后再后面的时间查漏补缺,看看有什么可以研究的源码,让自己的项目经历上可以多写一写东西。
除此之外,保证每天做3到leetcode的题目。而且我买的剑指offer也还没有读。没有时间再拿来浪费了。
我的github:
github又快一个月没有更新过了,不过现在已经做了200题,按照一天3题的速度应该一个月可以做完第一遍吧。
https://github.com/YinWenAtBIT
一、HTTP知识树:
该图记录了http协议需要了解的各个部分,我将从上往下解说。
二、知识点总结:
2.1:关键词:
平时会经常接触到URL,他就是我们访问web的一个字符串地址,那么URI是什么呢?他们是什么关系呢?先看看官方的解释:
URL:uniform resource location 统一资源定位符
URI:uniform resource identifier 统一资源标识符
这也就是说,URI是一种资源的标识;而URL也是一种URI,也是一种资源的标识,但它也指明了如何定位Locate到这个资源。
URI是一种抽象的资源标识,既可以是绝对的,也可以是相对的。但是URL是一种URI,它指明了定位的信息,必须是绝对的。
而我们平时所说的相对地址,仅仅是相对于另一个绝对地址而言。
2.2:基本概念:
1. http用于客户端和服务端之间的通信,运行在应用层之上。2. 客户端发送请求,服务端回复相应达成通信。(客户端没有发送请求时,服务端不会发送相应)
3. HTTP是不可以保存状态的协议(不保存通信状态,因此之后引入了cookie)
4. 使用URI定位资源
5. 可以使用持久链接节省通信量,使用持久链接时,TCP连接不会断开
6. 使用持久链接时,可以使用管线化技术,即可以一次发送多个http请求,不必等回复。
2.3:HTTP方法:
1. GET方法,用于获取资源,POST与GET都用于获取信息,但是GET方式仅仅是查询,并不对服务器上的内容产生任何作用结果;每次GET的内容都是相同的,GET方法必须把查询的URL放在HTTP首部中,大小会有限制。(查)2. POST方法:POST则常用于发送一定的内容进行某些修改操作,POST方法可以把内容放在报文中,大小不受限制(改)
3. 在GET方法中传递的参数在报文首部,而POST方法中的数据在报文段,相对来说,POST方法安全性更高。
4. PUT方法:用来上传文件,保存在URI指定位置,一般不用(增)
5. DELETE方法:删除URI所指向的内容,一般不用(删)
6. HEAD方法:和GET方法一样,但是不返回报文主体部分,用于确定URI的有效性和更新时间日期等。
7. OPTIONS方法:用来确定HTTP服务器支持的方法。
8. TRACE方法:用来追踪http报文是如何被代理中转的,一般不用(类比traceroute)
9. CONNECT方法:在于代理服务器建立隧道时使用,主要使用SSL协议吧通信内容加密后经隧道传输。
2.4:HTTP报文:
报文格式:
其中空行用于区分报文首部和报文主体内容,是由一个回车符和一个换行符组成。
无论是请求报文还是响应报文都需要有报文首部,当然报文主体有的请求报文是没有的。
请求报文首部由以下组成:
1. 请求行:包含请求方法,请求URI,和HTTP版本
2 请求字段:包含首部请求字段,通用首部字段,实体首部字段(用来传递KEY——VALUE对,实际表示的各种参数)
相应报文首部:
1. 状态行:包含HTTP版本,响应结果的状态码,原因短语
2. 各种字段:同上
报文主体:
由于某些报文的内容过大,因此在传输时,为了减少传输的时间,会采取一些压缩的措施。
例如上面的报文信息中,Accept-Encoding就定义了内容编码的格式:gzip
有下面几种方式:
gzip:GNU压缩格式
compress:UNIX系统的标准压缩格式
deflate:是一种同时使用了LZ77和哈弗曼编码的无损压缩格式
identity:不进行压缩
部分请求:
有些场景下,http报文请求一些很大的图片,但是加载过程很慢。
比如我们登录一些大图片的网址,会发现有时候图片是一块一块加载的。
这就是因为设置了http请求的长度,这样就可以分块的加载资源文件。
在请求报文中使用Range属性,在响应报文中使用Content-Type属性都可以指定一定字节范围的http请求。