http学习笔记

一、了解 Web 及网络基础

①TCP/IP 的分层管理

TCP/IP 协议族各层的作用如下。

应用层

16应用层决定了向用户提供应用服务时通信的活动。

TCP/IP 协议族内预存了各类通用的应用服务。比如,FTP(File

Transfer Protocol,文件传输协议)和 DNS(Domain Name System,域

名系统)服务就是其中两类。

HTTP 协议也处于该层。

传输层

传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据

传输。

在传输层有两个性质不同的协议:TCP(Transmission Control

Protocol,传输控制协议)和 UDP(User Data Protocol,用户数据报

协议)。

网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数

据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计

算机,并把数据包传送给对方。

与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所

起的作用就是在众多的选项内选择一条传输路线。

链路层(又名数据链路层,网络接口层)

用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱

动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等

物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在

链路层的作用范围之内。

利用 TCP/IP 协议族进行网络通信时,会通过分层顺序与对方进行通

信。发送端从应用层往下走,接收端则往应用层往上走。

我们用 HTTP 举例来说明,首先作为发送端的客户端在应用层

(HTTP 协议)发出一个想看某个 Web 页面的 HTTP 请求。

接着,为了传输方便,在传输层(TCP 协议)把从应用层处收到的数

据(HTTP 请求报文)进行分割,并在各个报文上打上标记序号及端

口号后转发给网络层。

在网络层(IP 协议),增加作为通信目的地的 MAC 地址后转发给链

路层。这样一来,发往网络的通信请求就准备齐全了。

接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用

层。当传输到应用层,才能算真正接收到由客户端发送过来的 HTTP

请求。

②负责传输的 IP 协议

IP 协议的作用是把各种数据包传送给对方。而要保证确实传送到对方

那里,则需要满足各类条件。其中两个重要的条件是 IP 地址和 MAC

地址(Media Access Control Address)。

IP 地址指明了节点被分配到的地址,MAC 地址是指网卡所属的固定

地址。IP 地址可以和 MAC 地址进行配对。IP 地址可变换,但 MAC

地址基本上不会更改。

ARP 是一种用以解析地址的协议,根据通信方

的 IP 地址就可以反查出对应的 MAC 地址。

③确保可靠性的 TCP 协议

1、分割数据

按层次分,TCP 位于传输层,提供可靠的字节流服务。

所谓的字节流服务(Byte Stream Service)是指,为了方便传输,将大

块数据分割成以报文段(segment)为单位的数据包进行管理。而可

靠的传输服务是指,能够把数据准确可靠地传给对方。一言以蔽之,

TCP 协议为了更容易传送大数据才把数据分割,而且 TCP 协议能够

确认数据最终是否送达到对方。

确保数据能到达目标

2、确保可靠性的 TCP 协议-三次握手

发送端首先发送一个带 SYN 标志的数据包给对方。接收端收到后,

回传一个带有 SYN/ACK 标志的数据包以示传达确认信息。最后,发

送端再回传一个带 ACK 标志的数据包,代表“握手”结束。

④负责域名解析的 DNS 服务

DNS 服务应运而生。DNS 协议提供通过域名

查找 IP 地址,或逆向从 IP 地址反查域名的服务。

⑤、各种协议与 HTTP 协议的关系

⑥URI 和 URL

  首先给大家举个例子,有一家公司的总经理,某天,给了我一张名片,上面写了他的头衔,北京XXX公司总经理 张三,还有他的办公室地址,北京市海淀区长安街35号北京XXX公司总经理办公室,那么,我以后给我的朋友吹牛,我认识北京XXX公司的总经理张三,我的朋友都知道北京XXX公司的总经理是一个叫张三的人,那么,这个头衔就和张三对应起来了,只要一说到这个头衔,大家都知道说的是张三,反应到网络世界,这个头衔就叫做URI,只要你给我一个URI,我就知道它代表了什么,比如,http://www.sina.com.cn代表了新浪网,admin@qq.com代表了某一个人的qq邮箱,你的qq号也是一个URI(腾讯服务器内可以识别就是你的QQ账户),URI就是网络资源的头衔,通过URI标记可以把网络世界里面的每一个事物都加以标记并区分开来。

    好的,现在出现了一个问题,你现在知道北京XXX公司总经理是张三,“北京XXX公司总经理”就是张三这个人的URI,可是,我让你亲自去和张三见一面,你做得到吗?你肯定做不到,因为你不知道他的地址,虽然你有他的URI头衔,但是除此以外,你对他具体的情况一无所知,于是你要定位到他,你就必须得到他的办公室地址,通过“北京市海淀区长安街35号北京XXX公司总经理办公室”这个地址,你就找到了张三。反应到网络世界,网络世界里面的每一个资源不光有自己的头衔,还要能够被人访问,被人找到,所以,网络地址是必须的,否则,这个网络资源的存在没有任何意义,这个地址就叫做URL。

    通过上面的描述,可以发现,URI强调的是给资源标记命名,URL强调的是给资源定位,但是你会发现,URL显然比URI包含信息更多,我通过URL也可以知道张三是总经理,并且我还知道了他的地址,所以大多数情况下大家觉得给一个网络资源分别命名和给出地址太麻烦,干脆就用地址既当地址用,又当标记名用,所以,URL也充当了WWW万维网里面URI的角色,但是他比URI多了一层意义,我不光知道你叫什么,我还知道你在哪里。我们在浏览器输入的都是URL,因为我们输入的目的是为了找到某一个资源,当然你输入的是URI也是没错的,因为URL也是URI。

    总结:URI标记了一个网络资源,仅此而已;  URL标记了一个WWW互联网资源(用地址标记),并给出了他的访问地址。(URI是Uniform Resource Identifier,表示是一个资源; URL是Uniform Resource Locator,表示是一个地址,光看英文缩写确实难懂)
 

URL是URI的子集,所有的URL都是URI,但不是每个URI都是URL,还有可能是URN

二、简单的 HTTP 协议

①通过请求和响应的交换达成通信

HTTP 协议规定,请求从客户端发出,最后服务器端响应该请求并返

回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有

接收到请求之前不会发送响应。

②HTTP 是不保存状态的协议

协议本身并不保留之前一切的请求或响应报文的信息。这是为了

更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设

计成如此简单的。HTTP/1.1 虽然是无状态协议,但为了实现期望的保持状态功能,于

是引入了 Cookie 技术。有了 Cookie 再用 HTTP 协议通信,就可以管

理状态了

③告知服务器意图的 HTTP 方法

1、GET :获取资源

GET 方法用来请求访问已被 URI 识别的资源。指定的资源经服务器

端解析后返回响应内容。也就是说,如果请求的资源是文本,那就保

持原样返回;如果是像 CGI(Common Gateway Interface,通用网关接

口)那样的程序,则返回经过执行后的输出结果。

2、POST:传输实体主体

POST 方法用来传输实体的主体。

虽然用 GET 方法也可以传输实体的主体,但一般不用 GET 方法进行

传输,而是用 POST 方法。虽说 POST 的功能与 GET 很相似,但

POST 的主要目的并不是获取响应的主体内容。

 

3、PUT:传输文件

PUT 方法用来传输文件。就像 FTP 协议的文件上传一样,要求在请

求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。

36但是,鉴于 HTTP/1.1 的 PUT 方法自身不带验证机制,任何人都可以

上传文件 , 存在安全性问题,因此一般的 Web 网站不使用该方法。若

配合 Web 应用程序的验证机制,或架构设计采用

REST(REpresentational State Transfer,表征状态转移)标准的同类

Web 网站,就可能会开放使用 PUT 方法。

4、HEAD:获得报文首部

HEAD 方法和 GET 方法一样,只是不返回报文主体部分。用于确认

URI 的有效性及资源更新的日期时间等。

5、DELETE:删除文件

DELETE 方法用来删除文件,是与 PUT 相反的方法。DELETE 方法按

请求 URI 删除指定的资源。

但是,HTTP/1.1 的 DELETE 方法本身和 PUT 方法一样不带验证机

制,所以一般的 Web 网站也不使用 DELETE 方法。当配合 Web 应用

程序的验证机制,或遵守 REST 标准时还是有可能会开放使用的

 

6、OPTIONS:询问支持的方法

OPTIONS 方法用来查询针对请求 URI 指定的资源支持的方法。

7、TRACE:追踪路径

TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的方

法。

发送请求时,在 Max-Forwards 首部字段中填入数值,每经过一个服

务器端就将该数字减 1,当数值刚好减到 0 时,就停止继续传输,最

后接收到请求的服务器端则返回状态码 200 OK 的响应。

客户端通过 TRACE 方法可以查询发送出去的请求是怎样被加工修改

/ 篡改的。这是因为,请求想要连接到源目标服务器可能会通过代理

中转,TRACE 方法就是用来确认连接过程中发生的一系列操作。

但是,TRACE 方法本来就不怎么常用,再加上它容易引发

XST(Cross-Site Tracing,跨站追踪)攻击,通常就更不会用到了。

8、CONNECT:要求用隧道协议连接代理

CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协

议进行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接

层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容

加 密后经网络隧道传输。

CONNECT 方法的格式如下所示。

CONNECT 代理服务器名:端口号 HTTP版本

使用 CONNECT 方法的请求·响应的例子

请求

CONNECT proxy.hackr.jp:8080 HTTP/1.1

Host: proxy.hackr.jp

响应 HTTP/1.1 200 OK(之后进入网络隧道)

④、持久连接

为解决上述 TCP 连接的问题,HTTP/1.1 和一部分的 HTTP/1.0 想出了

持久连接(HTTP Persistent Connections,也称为 HTTP keep-alive 或

HTTP connection reuse)的方法。持久连接的特点是,只要任意一端

没有明确提出断开连接,则保持 TCP 连接状态。

⑤、管线化

持久连接使得多数请求以管线化(pipelining)方式发送成为可能。从

前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术

出现后,不用等待响应亦可直接发送下一个请求。

这样就能够做到同时并行发送多个请求,而不需要一个接一个地等待

响应了。

比如,当请求一个包含 10 张图片的 HTML Web 页面,与挨个连接相

比,用持久连接可以让请求更快结束。而管线化技术则比持久连接还

要快。请求数越多,时间差就越明显。

⑥、使用 Cookie 的状态管理

Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的

首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器

发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出

去。

服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一

个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前

的状态信息。

三、返回结果的 HTTP 状态码

1、200 OK

表示从客户端发来的请求在服务器端被正常处理了。

在响应报文内,随状态码一起返回的信息会因方法的不同而发生改

变。比如,使用 GET 方法时,对应请求资源的实体会作为响应返

回;而使用 HEAD 方法时,对应请求资源的实体首部不随报文主体

作为响应返回(即在响应中只返回首部,不会返回实体的主体部

分)。

2、204 No Content

该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中

不含实体的主体部分。另外,也不允许返回任何实体的主体。比如,

当从浏览器发出请求处理后,返回 204 响应,那么浏览器显示的页面

不发生更新。

一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新

信息内容的情况下使用。

3、206 Partial Content

该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的

GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。

4、301 Moved Permanently

永久性重定向。该状态码表示请求的资源已被分配了新的 URI,以后

应使用资源现在所指的 URI。也就是说,如果已经把资源对应的 URI

保存为书签了,这时应该按 Location 首部字段提示的 URI 重新保存。

像下方给出的请求 URI,当指定资源路径的最后忘记添加斜杠“/”,就

会产生 301 状态码。

http://example.com/sample

5、302 Found

临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望

用户(本次)能使用新的 URI 访问。

和 301 Moved Permanently 状态码相似,但 302 状态码代表的资源不

是被永久移动,只是临时性质的。换句话说,已移动的资源对应的

URI 将来还有可能发生改变。比如,用户把 URI 保存成书签,但不会

像 301 状态码出现时那样去更新书签,而是仍旧保留返回 302 状态码

的页面对应的 URI。

6、303 See Other

比如,当使用 POST 方法访问 CGI 程序,其执行后的处理结果是希望

客户端能以 GET 方法重定向到另一个 URI 上去时,返回 303 状态

码。虽然 302 Found 状态码也可以实现相同的功能,但这里使用 303

状态码是最理想的。1

该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET

方法定向获取请求的资源。

303 状态码和 302 Found 状态码有着相同的功能,但 303 状态码明确

表示客户端应当采用 GET 方法获取资源,这点与 302 状态码有区

别。

7、304 Not Modified

该状态码表示客户端发送附带条件的请求 2 时,服务器端允许请求访

问资源,但未满足条件的情况。304 状态码返回时,不包含任何响应

的主体部分。304 虽然被划分在 3XX 类别中,但是和重定向没有关

系。

8、307 Temporary Redirect

临时重定向。该状态码与 302 Found 有着相同的含义。尽管 302 标准

64禁止 POST 变换成 GET,但实际使用时大家并不遵守。

307 会遵照浏览器标准,不会从 POST 变成 GET。但是,对于处理响

应时的行为,每种浏览器有可能出现不同的情况。

9、400 Bad Request

该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求

的内容后再次发送请求。另外,浏览器会像 200 OK 一样对待该状态

码。

10、401 Unauthorized

该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、

DIGEST 认证)的认证信息。另外若之前已进行过 1 次请求,则表示

用 户认证失败。

返回含有 401 的响应必须包含一个适用于被请求资源的 WWW-

Authenticate 首部用以质询(challenge)用户信息。当浏览器初次接收

到 401 响应,会弹出认证用的对话窗口。

11、403 Forbidden

该状态码表明对请求资源的访问被服务器拒绝了。服务器端没有必要

给出拒绝的详细理由,但如果想作说明的话,可以在实体的主体部分

66对原因进行描述,这样就能让用户看到了。

未获得文件系统的访问授权,访问权限出现某些问题(从未授权的发

送源 IP 地址试图访问)等列举的情况都可能是发生 403 的原因。

12、404 Not Found

13、500 Internal Server Error

该状态码表明服务器端在执行请求时发生了错误。也有可能是 Web

应用存在的 bug 或某些临时的故障。

14、503 Service Unavailable

该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法

处理请求。如果事先得知解除以上状况需要的时间,最好写入

RetryAfter 首部字段再返回给客户端。

四、与 HTTP 协作的 Web 服务器

①用单台虚拟主机实现多个域名

HTTP/1.1 规范允许一台 HTTP 服务器搭建多个 Web 站点。比如,提

供 Web 托管服务(Web Hosting Service)的供应商,可以用一台服务

器为多位客户服务,也可以以每位客户持有的域名运行各自不同的网

站。这是因为利用了虚拟主机(Virtual Host,又称虚拟服务器)的功

能。

在相同的 IP 地址下,由于虚拟主机可以寄存多个不同主机名和域名

的 Web 网站,因此在发送 HTTP 请求时,必须在 Host 首部内完整指

定主机名或域名的 URI。

②通信数据转发程序 :代理、网关、隧道

1、代理

代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务

器。代理不改变请求 URI,会直接发送给前方持有资源的目标服务

器。

持有资源实体的服务器被称为源服务器。从源服务器返回的响应经过

代理服务器后再传给客户端。

图:每次通过代理服务器转发请求或响应时,会追加写入 Via 首

部信息

在 HTTP 通信过程中,可级联多台代理服务器。请求和响应的转发会

经过数台类似锁链一样连接起来的代理服务器。转发时,需要附加

Via 首部字段以标记出经过的主机信息。

使用代理服务器的理由有:利用缓存技术(稍后讲解)减少网络带宽

的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要

目的,等等。

代理有多种使用方法,按两种基准分类。一种是是否使用缓存,另一

种是是否会修改报文。

缓存代理

代理转发响应时,缓存代理(Caching Proxy)会预先将资源的副本

(缓存)保存在代理服务器上。

当代理再次接收到对相同资源的请求时,就可以不从源服务器那里获

取资源,而是将之前缓存的资源作为响应返回。

透明代理

转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理

(Transparent Proxy)。反之,对报文内容进行加工的代理被称为非

透明代理。

2、网关

网关的工作机制和代理十分相似。而网关能使通信线路上的服务器提

供非 HTTP 协议服务。

利用网关能提高通信的安全性,因为可以在客户端与网关之间的通信

线路上加密以确保连接的安全。比如,网关可以连接数据库,使用

SQL 语句查询数据。另外,在 Web 购物网站上进行信用卡结算时,

网关可以和信用卡结算系统联动。

3、隧道

隧道可按要求建立起一条与其他服务器的通信线路,届时使用 SSL 等

加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的

通信。

隧道本身不会去解析 HTTP 请求。也就是说,请求保持原样中转给之

后的服务器。隧道会在通信双方断开连接时结束。

图:通过隧道的传输,可以和远距离的服务器安全通信。隧道本

身是透明的,客户端不用在意隧道的存在

五、HTTP/1.1 首部字段一览

表 6-2:请求首部字段

表 6-3:响应首部字段

表 6-4:实体首部字段

表 6-5:缓存请求指令

表 6-6:缓存响应指令

Warning

六、确保 Web 安全的HTTPS

①http缺点

通信使用明文(不加密),内容可能会被窃听

不验证通信方的身份,因此有可能遭遇伪装

无法证明报文的完整性,所以有可能已遭篡改

②HTTPS

HTTP+ 加密 + 认证 + 完整性保护=HTTPS

HTTPS 是身披 SSL 外壳的 HTTP

通常,HTTP 直接和 TCP 通信。当使用 SSL 时,则演变成先和 SSL 通

信,再由 SSL 和 TCP 通信了。简言之,所谓 HTTPS,其实就是身披

SSL 协议这层外壳的 HTTP。

HTTPS 采用混合加密机制

HTTPS 采用共享密钥加密和公开密钥加密两者并用的混合加密

机制。若密钥能够实现安全交换,那么有可能会考虑仅使用公开

密钥加密来通信。但是公开密钥加密与共享密钥加密相比,其处

理速度要慢。

所以应充分利用两者各自的优势,将多种方法组合起来用于通

信。在交换密钥环节使用公开密钥加密方式,之后的建立通信交

换报文阶段则使用共享密钥加密方式。

七、用户验证

Session 管理及 Cookie 应用

我们会使用 Cookie 来

管理 Session,以弥补 HTTP 协议中不存在的状态管理功能。

步骤 1: 客户端把用户 ID 和密码等登录信息放入报文的实体部分,

通常是以 POST 方法把请求发送给服务器。而这时,会使用 HTTPS

通信来进行 HTML 表单画面的显示和用户输入数据的发送。

步骤 2: 服务器会发放用以识别用户的 Session ID。通过验证从客户

端发送过来的登录信息进行身份认证,然后把用户的认证状态与

Session ID 绑定后记录在服务器端。

向客户端返回响应时,会在首部字段 Set-Cookie 内写入 Session

ID(如 PHPSESSID=028a8c…)。

你可以把 Session ID 想象成一种用以区分不同用户的等位号。

168然而,如果 Session ID 被第三方盗走,对方就可以伪装成你的身份进

行恶意操作了。因此必须防止 Session ID 被盗,或被猜出。为了做到

这点,Session ID 应使用难以推测的字符串,且服务器端也需要进行

有效期的管理,保证其安全性。

另外,为减轻跨站脚本攻击(XSS)造成的损失,建议事先在 Cookie

内加上 httponly 属性。

步骤 3: 客户端接收到从服务器端发来的 Session ID 后,会将其作为

Cookie 保存在本地。下次向服务器发送请求时,浏览器会自动发送

Cookie,所以 Session ID 也随之发送到服务器。服务器端可通过验证

接收到的 Session ID 识别用户和其认证状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿的十万个为什么

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值