任职前端开发工程师已经有一段时间了,对于“前端知识”,也就是所谓的“html+css+javascript”及它们的延伸都掌握得还算可以,但是在此之外的更加基础的知识,却薄弱得令人发指。
感谢曾经的上司对我的评价与建议,使我认识到自己仍然有许多的知识急需补充。趁着最近回学校的好时机,专门去图书馆恶补了一下关于http协议的知识。
这篇文章用于记录我学习http协议的知识点,其中可能会穿插一些面试所遇到的题目,不定时更新,欢迎关注~
1、什么是http协议
超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是互联网上应用最为广泛的一种网络协议。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。
(摘自维基百科)
其主要概念有以下几个方面:
连接(Connection):传输层的实际环流,建立在两个相互通讯的应用程序之间。
消息(Message):基本通讯单位,通过连接传输。
请求(Request):从客户端到服务器的请求信息,包括应用于资源的方法、资源的标识符和协议的版本号。
响应(Response):从服务器返回的信息包括HTTP协议的版本号、请求的状态(例如”成功”或”没找到”)和文档的MIME类型。
资源(Resource):由URI标识的网络数据对象或服务。
实体(EMity):数据资源或来自服务资源的回映的特殊表示方法,它可能被包围在请求 或响应信息中。实体包括实体头信息和实体的本身内容。
客户(Client):为发送请求而建立连接的应用程序。
用户代理(Useragent):初始化请求的客户。它们可以是浏览器、编辑器或其他用户工具。
服务器(Server):接受连接并对请求返回信息的应用程序。
代理(Proxy):中间程序,它可以充当服务器,也可以充当客户,为其他客户建立请求。请求是通过可能的翻译在内部或经过传递到其他的服务器中。
网关(Gateway):作为其他服务器中间媒介的服务器。与代理不同的是,网关接受请求就好像对被请求的资源来说它就是源服务器;发出请求的客户机并没有意识到它在同网关打交道。网关经常作为通过防火墙的服务器端的门户,网关还可以作为协议翻译器以便存取那些存储在非HTTF系统中的资源。
(摘自 http://itindex.net/detail/53012-http-%E7%9F%A5%E8%AF%86?utm_source=tuicool&utm_medium=referral)
2、从输入地址到接收数据的过程
一般来说,我们在浏览器地址栏上输入的地址可能为 http://jrainlau.github.io/2016/01/19/Markcook-development/,在点击跳转以后会看到相应的页面。但是中间的过程是怎样的呢?首先我们分析一下这个地址,看看它是有哪些部分所组成——
http:它表示要通过HTTP协议来定位网络资源;
jrainlau.github.io:所访问主机的域名;
2016/01/19/Markcook-development:指定请求资源的URI。
整理一下,其实就是
协议类型://主机域名(或IP地址):端口(有默认值)/资源路径/
在输入网址并点击跳转以后,浏览器及服务器会进行一系列的工作:
若输入URL主机域名,将会进行DNS解析把域名解析为IP地址及端口,然后与之建立一个TCP链接。
若输入URL为IP地址及端口,将直接与之建立一个TCP连接。
浏览器发送一个带有信息的http请求报文到服务器,信息内容包括身份验证,需请求的资源列表等。
服务器接到了请求,然后进行处理(响应)。
服务器把处理的http响应报文返回给浏览器。
关闭TCP连接。
浏览器对响应报文进行处理,在页面上渲染,最终呈现给用户。
当中的每一步都涉及到更多复杂的内容,暂时先把过程理解了,以后再慢慢研究。
3、URI,URL,URN的区别与联系
URI(Uniform Resource Identifier):统一资源标识符。用来唯一的标识一个资源。
URL(Uniform Resource Locator):统一资源定位符。它是一种具体的URI,指明了通过路径找到该资源。
URN(Uniform Resource Name):统一资源名。它也是一种具体的URI,指明了通过名称找到该资源。
综上,URL和URN是子集,现多把URI等价于URL。
4、报文
http报文是在http应用程序之间发送的数据块。报文分为两种,一种是请求报文(request message),另一种是响应报文(response message)。它们的组成可以分为三个部分:起始行,首部,主体。
请求报文
格式一般为
<method><request-URL><version>
<headers>
<entity-body>
例子:
GET/path/xxx.gif HTTP/1.0
Host: www.xxx.com
响应报文
格式一般为
<version><status-code><reason-phrase>
<headers>
<entity-body>
例子:
HTTP/1.0 200 OK
Content-Type: image/gif
Content-length: 8572
[一幅图片]
下面对各部分进行简述
1、起始行
请求报文的起始行说明了要做些什么;响应报文的起始行说明了发生了什么
方法(method)
客户端希望服务器对资源执行的动作,如常见的有GET,POST,DELETE等。请求URL(request-URL)
命名了所请求资源,或者URL路径组件的完整URL。版本(version)
报文所使用的http版本,其格式看起来是这样的:HTTP/<主要版本号>.<次要版本号>状态码(status-code)
如显示为成功的200,重定向的302,无法访问的404等,后面将会详细说明状态码。原因短语(reason-phrase)
状态码的可读版本,可以理解为对状态的描述,对人类可读。
2、首部
首部主要存放着一些关于报文的附加信息,如Content-Type: image/gif
,说明了主体部分的MIME类型,类似的还有服务器发生响应的时间、客户端可以接收到的文件类型等。
3、主体部分
可选。为http要传输的内容。
(未完待续。。。)