1

任职前端开发工程师已经有一段时间了,对于“前端知识”,也就是所谓的“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要传输的内容。

(未完待续。。。)


jrainlau
12.9k 声望11.7k 粉丝

Hiphop dancer,