写在前面的话
昨晚接到阿里巴巴的电话,是CDN运维工程师岗位的面试内容。从这个角度上来说,我得承认阿里巴巴在互联网上的专业性,很多集团都没有为CDN单独开设一个运维工程师的岗位,而阿里巴巴却这么做,可见阿里巴巴在互联网上的细节和挖掘程度的确是全国前列的水平。
既然是CDN运维,何为CDN?CDN就是内容分发网络,要知道服务器是固定的,但是服务器上的软件是可以更新/调优的,通过更改软件的配置也能尽大的达到网页快速响应的效果。CDN运维工程师的要求不多,但是较难,因为每一块挖掘都很深,主要几个大块是:http协议,tcp/ip协议,DNS协议,cdn基础和nginx等软件的应用。所以我就趁热打铁看了一些文章,写一下自己的心得。如果阿里巴巴还有第二次电话面试的机会,我可以比上一次多说一点。
Http是啥?
Http就是HyperText Transfer Protocol(超文本传输协议)的缩写,它是一个应用层的协议也是一个无状态协议。(ftp也是应用层协议,tcp是传输层协议,ip是网络层协议)
何为应用层协议?也就是说http协议是在tcp这个传输层协议基础之上实现的,有时也会承载在CLS和SSL协议之上的,使用ssl的话,这个时候http协议就成了https协议,https更安全一些。http的端口是常见80端口,https端口是443端口。
何为无状态协议?http协议是“请求——>响应”这个模式工作的,客户端点击鼠标发送“我要看这个网页”请求,服务器收到请求,然后做出响应。但是客户端再次点击鼠标发送新的请求,服务器会重新响应。也就说每一次请求和相应跟上一次相应是否成功是没有关系的。
用户点一点鼠标就能一张网页一张网页的翻阅,操作很简单,但是原理步骤却不是那么容易的,具体的步骤如下:
1)点击某个网页超级链接,这个时候http请求发送到服务器,http协议开始执行;
2)客户端向服务器发出请求:“我需要url,协议版本号,MIME信息”;
3)服务器接收到请求,把上面能提供的都提供了,如果成功,状态码是200或者是其他2字头的。如果失败,那状态码就是404;
4)客户端索要的信息返回成功,以网页的形式出现在客户的屏幕上,双方断开连接。如果返回信息失败,返回404错误信息到客户的屏幕上,双方断开连接。
浏览器是啥?
浏览器就是IE,浏览器是火狐,浏览器是360,浏览器是UC,浏览器是chome,浏览器是opera。不同的厂家生产出不同的浏览器,但是浏览器究竟在整个数据传输中扮演什么角色呢?
比如客户机向web服务器(apache、nginx and so on)发送“我要看‘西甲新闻’这个网页”的要求,web服务器收到之后,如果都正常的话,web服务器就会把前端码农们编写好的“西甲新闻”的网页源代码返送给客户端,然后客户端收到这个网页之后,使用浏览器把这些源代码“翻译”成我们常见的网站。整个网站都出现在屏幕上之后,客户端和web服务器断开了链接。(基本上这又是重复了一遍上面的四步骤。)
由此可见浏览器的主要任务就是将前端码农们编写的html文件转化成可视的一张又一张图片和文字,然后组合成一个网页,供我们翻阅浏览。浏览器和web服务器都遵从http协议,但是要知道浏览器是可以发送HTTP协议的,但是HTTP协议不一定非要浏览器才能发送,用cmd里的telnet命令也可以,但是使用telnet发送了请求,服务器返回了应答,得到的是一个网页的源代码,也就是html的代码,没有经过浏览器的翻译,也就而不是我们常见的网页的样子。
win10的telnet
很多人都把自己的win7/8升级成了10,微软为了保证自己系统的开机时间,在win 7的版本就把telnet默认禁用掉了。到了win10做的更绝,直接把tcp的服务端给阉割掉了。所以很多用户即使在“启用或关闭windows功能”里对telnet服务器打了勾,在本地服务里也看不到telnet,在cmd里使用telnet自然也会被提示“不是内部或外部命令"。遇到这种情况,怎么办呢?win10自带一个“应用商店”,类似apple store,在里面搜索telnet,会有两个软件,一个就是原来的telnet,收费的,12美元多,可以免费试用30天,真心叫人骂娘。另一个就是"Remote Terminal",这个是免费的,就可以用它。
使用telnet实验
在windows里启动cmd,然后随便telnet一个目标,比如百度网。
telnet www.baidu.com 80
输入之后,按下ctrl+[启动“回显”功能。然后输入如下内容:
GET /index.html html/1.1
这个东西就是“请求行”,其中GET叫做“请求方法”,/index.html是请求资源路径,html/1.1是http协议版本。这句代码的意思就是“用GET这个请求方法和http1.1的版本来请求index.html的内容”。
两次回车之后,得到如下图片:
显而易见,得到了返回的信息以及百度首页的源代码。
先说请求方法,GET不是唯一的请求方法,还有如下几个:
POST(添加某内容)
OPTIONS(查询性能选项以及可执行那些方法)
TRACE(远程诊断服务器)
DELETE(删除)
CONNECT(使用其他代理进行传输)
PUT(修改某内容)
PATCH(对于某项进行更改)
HEAD(类似于GET,但是不返回大片大片的网页源代码信息,比如仅仅是确认一个照片依旧存在)
还有什么LOCK,UNLOCK,MOVE,COPY等其他的方法,一共是14个方法左右。这些方法不一定全部都会被远程服务器所识别,但是GET和POST是肯定会被识别的。
继续说http版本,现在的版本基本都是1.1,1.0和0.9版本已经淘汰了。
上面这个request信息仅仅是一个请求行。request还会有“请求头信息”和“请求主信息”。
请求头信息的模样是类似这样的,可以在浏览器里使用“审查元素”:
Accept-Language: zh-cn,zh;q=0.5 #浏览器的语言是中文
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7 #浏览器的编码是GB2312
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
#浏览器支持的 MIME 类型分别是 text/html、application/xhtml+xml、application/xml 和 */*,优先顺序是它们从左到右的排列顺序。
Accept-Encoding: gzip, deflate #浏览器支持的方法是gzip
User-Agent: Mozilla/5.0 (compatible; 域名) #浏览器的代理
Host: 域名 #浏览器请求的网址
Connection: Keep-Alive #链接的状态是Keep_Alive
请求主信息在GET方法里是可以省略的,但是在POST方法里确实必不可少的,因为post本身就是要添加内容,主信息就是要添加的内容。但是http的添加不像是记事本直接往里写东西。它需要先指定type,这个type有点类似ajax的一个东西,同时还要注定输入的字符长度,最后才是输入内容。比较鸡贼的是,type先设定长度,一旦输入的内容达到了长度将会自动停止并且上传到服务器,哪怕内容其实没有输入完毕。
至于返回的信息,看上面那张图就显而易见了。第一行的http/1.1就是确认http协议的版本,之后跟着的200就是状态码。1字头的状态码是消息,2字头的状态码基本都是0K,3字头的是需要代理转接,4字头基本都是请求出错,比如说400就是请求语法有错误,403是forbidden,404是not found,5字头和6字头的状态码是服务器出了错误,比如500就是服务器有错误,需要管理员检查一下服务器的配置,503是服务器暂时没有链接到,稍等一会可能会链接成功。
具体各状态码信息:http://baike.baidu.com/link?url=lwIIa3dEAIXeS201K_sXZRcgv7sf9d9UoPMysGrdvGIEQXexAC5BcHzbU8yl8WnYan8sUOSfrmdO3He6F07GfK
本文转自 苏幕遮618 51CTO博客,原文链接:http://blog.51cto.com/chenx1242/1736004