diff --git a/notes/HTTP.md b/notes/HTTP.md index f17b79c62e..f67580baf9 100644 --- a/notes/HTTP.md +++ b/notes/HTTP.md @@ -1,83 +1,83 @@ -* [��������](#��������) - * [Web����](#web����) +* [基础概念](#基础概念) + * [Web基础](#web基础) * [URL](#url) - * [�������Ӧ����](#�������Ӧ����) -* [HTTP ����](#http-����) - * [GET����ȡ��Դ](#get��ȡ��Դ) - * [POST������ʵ������](#post����ʵ������) - * [HEAD����ȡ�����ײ�](#head��ȡ�����ײ�) - * [PUT���ϴ��ļ�](#put�ϴ��ļ�) - * [DELETE��ɾ���ļ�](#deleteɾ���ļ�) - * [OPTIONS����ѯ֧�ֵķ���](#options��ѯ֧�ֵķ���) - * [RACE��׷��·��](#race׷��·��) - * [CONNECT��Ҫ��������Э�����Ӵ���](#connectҪ��������Э�����Ӵ���) -* [HTTP ״̬��](#http-״̬��) - * [2XX �ɹ�](#2xx-�ɹ�) - * [3XX �ض���](#3xx-�ض���) - * [4XX �ͻ��˴���](#4xx-�ͻ��˴���) - * [5XX ����������](#5xx-����������) -* [HTTP�ײ�](#http�ײ�) - * [ͨ���ײ��ֶ�](#ͨ���ײ��ֶ�) - * [�����ײ��ֶ�](#�����ײ��ֶ�) - * [��Ӧ�ײ��ֶ�](#��Ӧ�ײ��ֶ�) - * [ʵ���ײ��ֶ�](#ʵ���ײ��ֶ�) -* [����Ӧ��](#����Ӧ��) + * [请求和响应报文](#请求和响应报文) +* [HTTP 方法](#http-方法) + * [GET:获取资源](#get获取资源) + * [POST:传输实体主体](#post传输实体主体) + * [HEAD:获取报文首部](#head获取报文首部) + * [PUT:上传文件](#put上传文件) + * [DELETE:删除文件](#delete删除文件) + * [OPTIONS:查询支持的方法](#options查询支持的方法) + * [TRACE:追踪路径](#trace追踪路径) + * [CONNECT:要求用隧道协议连接代理](#connect要求用隧道协议连接代理) +* [HTTP 状态码](#http-状态码) + * [2XX 成功](#2xx-成功) + * [3XX 重定向](#3xx-重定向) + * [4XX 客户端错误](#4xx-客户端错误) + * [5XX 服务器错误](#5xx-服务器错误) +* [HTTP首部](#http首部) + * [通用首部字段](#通用首部字段) + * [请求首部字段](#请求首部字段) + * [响应首部字段](#响应首部字段) + * [实体首部字段](#实体首部字段) +* [具体应用](#具体应用) * [Cookie](#cookie) - * [����](#����) - * [�־�����](#�־�����) - * [����](#����) - * [�ֿ鴫��](#�ֿ鴫��) - * [�ಿ�ֶ��󼯺�](#�ಿ�ֶ��󼯺�) - * [��Χ����](#��Χ����) - * [����Э��](#����Э��) - * [��������](#��������) - * [ͨ������ת��](#ͨ������ת��) + * [缓存](#缓存) + * [持久连接](#持久连接) + * [编码](#编码) + * [分块传输](#分块传输) + * [多部分对象集合](#多部分对象集合) + * [范围请求](#范围请求) + * [内容协商](#内容协商) + * [虚拟主机](#虚拟主机) + * [通信数据转发](#通信数据转发) * [HTTPs](#https) - * [����](#����) - * [��֤](#��֤) - * [������](#������) + * [加密](#加密) + * [认证](#认证) + * [完整性](#完整性) -# �������� +# 基础概念 -## Web���� +## Web基础 -HTTP��HyperText Transfer Protocol����Ϊ������Э�飩�� +HTTP(HyperText Transfer Protocol,超为本传输协议)。 -WWW��Word Wide Web�������ּ�����HTML��HTTP��URL�� +WWW(Word Wide Web)的三种技术:HTML、HTTP、URL。 -RFC��Request for Comments��������������飩��������������ĵ��� +RFC(Request for Comments,征求修正意见书),互联网的设计文档。 ## URL -URI��Uniform Resource Indentifier��ͳһ��Դ��ʶ������URL��Uniform Resource Locator��ͳһ��Դ��λ������URN��Uniform Resource Name��ͳһ��Դ���ƣ������� urn:isbn:0-486-27557-4 ��URI ���� URL �� URN��Ŀǰ WEB ֻ�� URL �Ƚ����У����Լ����Ļ������� URL�� +URI(Uniform Resource Indentifier,统一资源标识符),URL(Uniform Resource Locator,统一资源定位符),URN(Uniform Resource Name,统一资源名称),例如 urn:isbn:0-486-27557-4 。URI 包含 URL 和 URN,目前 WEB 只有 URL 比较流行,所以见到的基本都是 URL。 -URL��ʽ�� +URL格式: ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/4102b7d0-39b9-48d8-82ae-ac4addb7ebfb.jpg) -## �������Ӧ���� +## 请求和响应报文 -**������** +**请求报文** ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/9dbb5fc2-936b-4c6d-b3a7-9617aae45080.jpg) -**��Ӧ����** +**响应报文** ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c634b5ed-a14b-4302-b40e-3ee387dd3c8a.jpg) -# HTTP ���� +# HTTP 方法 -�ͻ��˷��͵������ĵ�һ��Ϊ�����У������˷����ֶΡ� +客户端发送的请求报文第一行为请求行,包含了方法字段。 -## GET����ȡ��Դ +## GET:获取资源 -## POST������ʵ������ +## POST:传输实体主体 -POST ��ҪĿ�IJ��ǻ�ȡ��Դ�����Ǵ���ʵ���������ݡ� +POST 主要目的不是获取资源,而是传输实体主体数据。 -GET �� POST ��������ʹ�ö���IJ��������� GET �IJ������Բ�ѯ�ַ��������� URL�У��� POST �IJ����洢��ʵ�����岿�֡� +GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL中,而 POST 的参数存储在实体主体部分。 ``` GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1 @@ -88,312 +88,312 @@ Host: w3schools.com name1=value1&name2=value2 ``` -GET �Ĵ��η�ʽ����� POST ��ȫ�Խϲ��Ϊ GET ���IJ����� URL �ǿɼ��ģ����ܻ�й¶˽����Ϣ������ GET ֻ֧�� ASCII �ַ����������Ϊ��������ܻ�������룬�� POST ֧�ֱ�׼�ַ����� +GET 的传参方式相比于 POST 安全性较差,因为 GET 传的参数在 URL 是可见的,可能会泄露私密信息。并且 GET 只支持 ASCII 字符,如果参数为中文则可能会出现乱码,而 POST 支持标准字符集。 -## HEAD����ȡ�����ײ� +## HEAD:获取报文首部 -�� GET ����һ�������Dz����ر���ʵ�����岿�֡� +和 GET 方法一样,但是不返回报文实体主体部分。 -��Ҫ����ȷ�� URL ����Ч���Լ���Դ���µ�����ʱ��ȡ� +主要用于确认 URL 的有效性以及资源更新的日期时间等。 -## PUT���ϴ��ļ� +## PUT:上传文件 -��������������֤���ƣ��κ��˶������ϴ��ļ�����˴��ڰ�ȫ�����⣬һ�� WEB ��վ��ʹ�ø÷����� +由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般 WEB 网站不使用该方法。 -## DELETE��ɾ���ļ� +## DELETE:删除文件 -�� PUT �����෴������ͬ��������֤���ơ� +与 PUT 功能相反,并且同样不带验证机制。 -## OPTIONS����ѯ֧�ֵķ��� +## OPTIONS:查询支持的方法 -��ѯָ���� URL �ܹ�֧�ֵķ����� +查询指定的 URL 能够支持的方法。 -�᷵�� Allow: GET, POST, HEAD, OPTIONS ���������ݡ� +会返回 Allow: GET, POST, HEAD, OPTIONS 这样的内容。 -## RACE��׷��·�� +## TRACE:追踪路径 -�������Ὣͨ��·�����ظ��ͻ��ˡ� +服务器会将通信路径返回给客户端。 -��������ʱ���� Max-Forwards �ײ��ֶ���������ֵ��ÿ����һ���������ͻ�� 1������ֵΪ 0 ʱ��ֹͣ���䡣 +发送请求时,在 Max-Forwards 首部字段中填入数值,每经过一个服务器就会减 1,当数值为 0 时就停止传输。 -TRACE һ�㲻��ʹ�ã������������ܵ� XST ������Cross-Site Tracing����վ׷�٣�����˸�����ȥʹ������ +TRACE 一般不会使用,并且它容易受到 XST 攻击(Cross-Site Tracing,跨站追踪),因此更不会去使用它。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/ca711108-e937-4d7d-99aa-61b325c61f1a.jpg) -## CONNECT��Ҫ��������Э�����Ӵ��� +## CONNECT:要求用隧道协议连接代理 -������Э����� TCP ͨ�š� +用隧道协议进行 TCP 通信。 -��Ҫʹ�� SSL��Secure Sokets Layer����ȫ�׽��֣��� TLS��Transport Layer Security������㰲ȫ��Э���ͨ�����ݼ��ܺ������������䡣 +主要使用 SSL(Secure Sokets Layer,安全套接字)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/d8355d56-aa2b-4452-8001-8475cc095af1.jpg) -# HTTP ״̬�� +# HTTP 状态码 -���������ص���Ӧ�����е�һ��Ϊ״̬�У�������״̬���Լ�ԭ��������֪�ͻ�������Ľ���� +服务器返回的响应报文中第一行为状态行,包含了状态码以及原因短语,来告知客户端请求的结果。 -| ״̬�� | ��� | ԭ����� | +| 状态码 | 类别 | 原因短语 | | --- | --- | --- | -| 1XX | Informational����Ϣ��״̬�룩 | ���յ��������ڴ��� | -| 2XX | Success���ɹ�״̬�룩 | ��������������� | -| 3XX | Redirection���ض���״̬�룩 | ��Ҫ���и��Ӳ������������ | -| 4XX | Client Error���ͻ��˴���״̬�룩 | �������޷��������� | -| 5XX | Server Error������������״̬�룩 | ����������������� | +| 1XX | Informational(信息性状态码) | 接收的请求正在处理 | +| 2XX | Success(成功状态码) | 请求正常处理完毕 | +| 3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 | +| 4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 | +| 5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 | -## 2XX �ɹ� +## 2XX 成功 **200 OK** -**204 No Content**�������Ѿ��ɹ����������Ƿ��ص���Ӧ���IJ�����ʵ������岿�֡�һ����ֻ��Ҫ�ӿͻ�����������������Ϣ��������Ҫ��������ʱʹ�á� +**204 No Content**:请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。 **206 Partial Content** -## 3XX �ض��� +## 3XX 重定向 -**301 Moved Permanently**���������ض��� +**301 Moved Permanently**:永久性重定向 -**302 Found**����ʱ���ض��� +**302 Found**:临时性重定向 **303 See Other** -ע����Ȼ HTTP Э��涨 301��302 ״̬���ض���ʱ�������� POST �����ij� GET ���������Ǵ�������������� 301��302 �� 303 ״̬�µ��ض���� POST �����ij� GET ������ +注:虽然 HTTP 协议规定 301、302 状态下重定向时不允许把 POST 方法改成 GET 方法,但是大多数浏览器都会把 301、302 和 303 状态下的重定向把 POST 方法改成 GET 方法。 -**304 Not Modified**������������ײ�����һЩ���������磺If-Match��If-ModifiedSince��If-None-Match��If-Range��If-Unmodified-Since�����Dz�������������������᷵�� 304 ״̬�롣 +**304 Not Modified**:如果请求报文首部包含一些条件,例如:If-Match,If-ModifiedSince,If-None-Match,If-Range,If-Unmodified-Since,但是不满足条件,则服务器会返回 304 状态码。 -**307 Temporary Redirect**����ʱ�ض����� 302 �ĺ������ƣ����� 307 Ҫ�������������ض�������� POST �����ij� GET ������ +**307 Temporary Redirect**:临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。 -## 4XX �ͻ��˴��� +## 4XX 客户端错误 -**400 Bad Request**���������д����﷨���� +**400 Bad Request**:请求报文中存在语法错误 -**401 Unauthorized**����״̬���ʾ���͵�������Ҫ��ͨ�� HTTP ��֤��BASIC ��֤��DIGEST ��֤������֤��Ϣ�����֮ǰ�ѽ��й�һ���������ʾ�û���֤ʧ�ܡ� +**401 Unauthorized**:该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。如果之前已进行过一次请求,则表示用户认证失败。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/b1b4cf7d-c54a-4ff1-9741-cd2eea331123.jpg) -**403 Forbidden**�����󱻾ܾ�����������û�б�Ҫ�����ܾ�����ϸ���ɡ� +**403 Forbidden**:请求被拒绝,服务器端没有必要给出拒绝的详细理由。 **404 Not Found** -## 5XX ���������� +## 5XX 服务器错误 -**500 Internal Server Error**������������ִ������ʱ�������� +**500 Internal Server Error**:服务器正在执行请求时发生错误 -**503 Service Unavilable**����״̬�������������ʱ���ڳ����ػ����ڽ���ͣ��ά���������޷��������� +**503 Service Unavilable**:该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。 -# HTTP�ײ� +# HTTP首部 -HTTP ���İ������ײ������������֡��� 4 �����͵��ײ��ֶΣ�ͨ���ײ��ֶΡ������ײ��ֶΡ���Ӧ�ײ��ֶκ�ʵ���ײ��ֶΡ������ײ��ֶμ��京�����£�����Ҫȫ�ǣ��������ģ��� +HTTP 报文包含了首部和主体两部分。有 4 种类型的首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段。各种首部字段及其含义如下(不需要全记,仅供查阅): -## ͨ���ײ��ֶ� +## 通用首部字段 -| �ײ��ֶ��� | ˵�� | +| 首部字段名 | 说明 | | -- | -- | -| Cache-Control | ���ƻ������Ϊ | -| Connection | �����ײ��� ���ӵĹ��� | -| Date | �������ĵ�����ʱ�� | -| Pragma | ����ָ�� | -| Trailer | ����ĩ�˵��ײ�һ�� | -| Transfer-Encoding | ָ����������Ĵ�����뷽ʽ | -| Upgrade | ����Ϊ����Э�� | -| Via | �����������������Ϣ | -| Warning | ����֪ͨ | - -## �����ײ��ֶ� - -| �ײ��ֶ��� | ˵�� | +| Cache-Control | 控制缓存的行为 | +| Connection | 逐跳首部、 连接的管理 | +| Date | 创建报文的日期时间 | +| Pragma | 报文指令 | +| Trailer | 报文末端的首部一览 | +| Transfer-Encoding | 指定报文主体的传输编码方式 | +| Upgrade | 升级为其他协议 | +| Via | 代理服务器的相关信息 | +| Warning | 错误通知 | + +## 请求首部字段 + +| 首部字段名 | 说明 | | -- | -- | -| Accept | �û������ɴ�����ý������ | -| Accept-Charset | ���ȵ��ַ��� | -| Accept-Encoding | ���ȵ����ݱ��� | -| Accept-Language | ���ȵ����ԣ���Ȼ���ԣ� | -| Authorization | Web��֤��Ϣ | -| Expect | �ڴ����������ض���Ϊ | -| From | �û��ĵ��������ַ | -| Host | ������Դ���ڷ����� | -| If-Match | �Ƚ�ʵ���ǣ�ETag�� | -| If-Modified-Since | �Ƚ���Դ�ĸ���ʱ�� | -| If-None-Match | �Ƚ�ʵ���ǣ��� If-Match �෴�� | -| If-Range | ��Դδ����ʱ����ʵ�� Byte �ķ�Χ���� | -| If-Unmodified-Since | �Ƚ���Դ�ĸ���ʱ�䣨��If-Modified-Since�෴�� | -| Max-Forwards | ����������� | -| Proxy-Authorization | ����������Ҫ��ͻ��˵���֤��Ϣ | -| Range | ʵ����ֽڷ�Χ���� | -| Referer | �������� URI ��ԭʼ��ȡ�� | -| TE | �����������ȼ� | -| User-Agent | HTTP �ͻ��˳������Ϣ | - -## ��Ӧ�ײ��ֶ� - -| �ײ��ֶ��� | ˵�� | +| Accept | 用户代理可处理的媒体类型 | +| Accept-Charset | 优先的字符集 | +| Accept-Encoding | 优先的内容编码 | +| Accept-Language | 优先的语言(自然语言) | +| Authorization | Web认证信息 | +| Expect | 期待服务器的特定行为 | +| From | 用户的电子邮箱地址 | +| Host | 请求资源所在服务器 | +| If-Match | 比较实体标记(ETag) | +| If-Modified-Since | 比较资源的更新时间 | +| If-None-Match | 比较实体标记(与 If-Match 相反) | +| If-Range | 资源未更新时发送实体 Byte 的范围请求 | +| If-Unmodified-Since | 比较资源的更新时间(与If-Modified-Since相反) | +| Max-Forwards | 最大传输逐跳数 | +| Proxy-Authorization | 代理服务器要求客户端的认证信息 | +| Range | 实体的字节范围请求 | +| Referer | 对请求中 URI 的原始获取方 | +| TE | 传输编码的优先级 | +| User-Agent | HTTP 客户端程序的信息 | + +## 响应首部字段 + +| 首部字段名 | 说明 | | -- | -- | -| Accept-Ranges | �Ƿ�����ֽڷ�Χ���� | -| Age | ������Դ��������ʱ�� | -| ETag | ��Դ��ƥ����Ϣ | -| Location | ��ͻ����ض�����ָ��URI | -| Proxy-Authenticate | �����������Կͻ��˵���֤��Ϣ | -| Retry-After | ���ٴη��������ʱ��Ҫ�� | -| Server | HTTP�������İ�װ��Ϣ | -| Vary | ��������������Ĺ�����Ϣ | -| WWW-Authenticate | �������Կͻ��˵���֤��Ϣ | - -## ʵ���ײ��ֶ� - -| �ײ��ֶ��� | ˵�� | +| Accept-Ranges | 是否接受字节范围请求 | +| Age | 推算资源创建经过时间 | +| ETag | 资源的匹配信息 | +| Location | 令客户端重定向至指定URI | +| Proxy-Authenticate | 代理服务器对客户端的认证信息 | +| Retry-After | 对再次发起请求的时机要求 | +| Server | HTTP服务器的安装信息 | +| Vary | 代理服务器缓存的管理信息 | +| WWW-Authenticate | 服务器对客户端的认证信息 | + +## 实体首部字段 + +| 首部字段名 | 说明 | | -- | -- | -| Allow | ��Դ��֧�ֵ�HTTP���� | -| Content-Encoding | ʵ���������õı��뷽ʽ | -| Content-Language | ʵ���������Ȼ���� | -| Content-Length | ʵ������Ĵ�С����λ�� �ֽڣ� | -| Content-Location | �����Ӧ��Դ��URI | -| Content-MD5 | ʵ������ı���ժҪ | -| Content-Range | ʵ�������λ�÷�Χ | -| Content-Type | ʵ�������ý������ | -| Expires | ʵ��������ڵ�����ʱ�� | -| Last-Modified | ��Դ������޸�����ʱ�� | - -# ����Ӧ�� +| Allow | 资源可支持的HTTP方法 | +| Content-Encoding | 实体主体适用的编码方式 | +| Content-Language | 实体主体的自然语言 | +| Content-Length | 实体主体的大小(单位: 字节) | +| Content-Location | 替代对应资源的URI | +| Content-MD5 | 实体主体的报文摘要 | +| Content-Range | 实体主体的位置范围 | +| Content-Type | 实体主体的媒体类型 | +| Expires | 实体主体过期的日期时间 | +| Last-Modified | 资源的最后修改日期时间 | + +# 具体应用 ## Cookie -HTTP Э������״̬�ģ���Ҫ��Ϊ���� HTTP Э�龡���ܼ򵥣�ʹ�����ܹ�������������HTTP/1.1 ���� Cookie ������״̬��Ϣ�� +HTTP 协议是无状态的,主要是为了让 HTTP 协议尽可能简单,使得它能够处理大量事务。HTTP/1.1 引入 Cookie 来保存状态信息。 -�������ᷢ�͵���Ӧ���İ��� Set-Cookie �ֶΣ��ͻ��˵õ�����Ӧ��� Cookie ���ݱ��浽������С��´��ٷ�������ʱ����������ж��� Cookie ֵ�����������а��� Cookie �ֶΣ�������������֪���ͻ��˵�״̬��Ϣ�ˡ�Cookie ״̬��Ϣ�����ڿͻ���������У������Ƿ������ϡ� +服务器会发送的响应报文包含 Set-Cookie 字段,客户端得到该相应后把 Cookie 内容保存到浏览器中。下次再发送请求时,从浏览器中读出 Cookie 值,在请求报文中包含 Cookie 字段,这样服务器就知道客户端的状态信息了。Cookie 状态信息保存在客户端浏览器中,而不是服务器上。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/ff17c103-750a-4bb8-9afa-576327023af9.png) -Set-Cookie �ֶ����������ԣ� +Set-Cookie 字段有以下属性: -| ���� | ˵�� | +| 属性 | 说明 | | -- | -- | -| NAME=VALUE | ���� Cookie �����ƺ���ֵ������� | -| expires=DATE | Cookie ����Ч�ڣ�������ȷָ����Ĭ��Ϊ������ر�ǰΪֹ�� | -| path=PATH | ���������ϵ��ļ�Ŀ¼��Ϊ Cookie �����ö�������ָ����Ĭ��Ϊ�ĵ����ڵ��ļ�Ŀ¼�� | -| domain=���� | ��Ϊ Cookie ���ö��������������ָ����Ĭ��Ϊ���� Cookie �ķ������������� | -| Secure | ���� HTTPS ��ȫͨ��ʱ�Żᷢ�� Cookie | -| HttpOnly | �������ƣ�ʹ Cookie ���ܱ� JavaScript �ű����� | +| NAME=VALUE | 赋予 Cookie 的名称和其值(必需项) | +| expires=DATE | Cookie 的有效期(若不明确指定则默认为浏览器关闭前为止) | +| path=PATH | 将服务器上的文件目录作为 Cookie 的适用对象(若不指定则默认为文档所在的文件目录) | +| domain=域名 | 作为 Cookie 适用对象的域名(若不指定则默认为创建 Cookie 的服务器的域名) | +| Secure | 仅在 HTTPS 安全通信时才会发送 Cookie | +| HttpOnly | 加以限制,使 Cookie 不能被 JavaScript 脚本访问 | -**Session �� Cookie ����** +**Session 和 Cookie 区别** -Session �Ƿ��������������û���һ���ֶΣ�ÿ�� Session ����һ��Ψһ��ʶ��Session ID����������������һ�� Session ʱ�����ͻ��˷��͵���Ӧ���ľͰ����� Set-Cookie �ֶΣ�������һ����Ϊ sid �ļ�ֵ�ԣ������ֵ�Ծ��� Session ID���ͻ����յ���Ͱ� Cookie ������������У�����֮���͵������Ķ����� Session ID��HTTP ���� Session �� Cookie �����ַ�ʽһ�������ʵ�ָ����û�״̬�ģ��� Session ���ڷ������ˣ�Cookie ���ڿͻ��ˡ� +Session 是服务器用来跟踪用户的一种手段,每个 Session 都有一个唯一标识:Session ID。当服务器创建了一个 Session 时,给客户端发送的响应报文就包含了 Set-Cookie 字段,其中有一个名为 sid 的键值对,这个键值对就是 Session ID。客户端收到后就把 Cookie 保存在浏览器中,并且之后发送的请求报文都包含 Session ID。HTTP 就是 Session 和 Cookie 这两种方式一起合作来实现跟踪用户状态的,而 Session 用于服务器端,Cookie 用于客户端。 -**��������� Cookie �����** +**浏览器禁用 Cookie 的情况** -��ʹ�� URL ��д�������� URL ������� sid=xxx �� +会使用 URL 重写技术,在 URL 后面加上 sid=xxx 。 -**ʹ�� Cookie ʵ���û�����������Զ���д** +**使用 Cookie 实现用户名和密码的自动填写** -��վ�ű����Զ��� Cookie �ж�ȡ�û��������룬�Ӷ�ʵ���Զ���д�� +网站脚本会自动从 Cookie 中读取用户名和密码,从而实现自动填写。 -## ���� +## 缓存 -�����ֻ��淽�����ô������������л�����ÿͻ�����������л��档 +有两种缓存方法:让代理服务器进行缓存和让客户端浏览器进行缓存。 -Cache-Control ���ڿ��ƻ������Ϊ�� +Cache-Control 用于控制缓存的行为。 -Cache-Control: no-cache �����ֺ��壬����ǿͻ����򻺴���������͵��������к��и�ָ���ʾ�ͻ��˲���Ҫ�������Դ�������Դ�������򻺴���������͵���Ӧ�����к��и�ָ���ʾ������������ܶ���Դ���л��档 +Cache-Control: no-cache 有两种含义,如果是客户端向缓存服务器发送的请求报文中含有该指令,表示客户端不想要缓存的资源;如果是源服务器向缓存服务器发送的响应报文中含有该指令,表示缓存服务器不能对资源进行缓存。 -Expires �ֶο������ڸ�֪�������������Դʲôʱ�����ڡ����ײ��ֶ� Cache-Control ��ָ�� max-age ָ��ʱ�������ײ��ֶ� Expires�������ȴ��� max-age ָ� +Expires 字段可以用于告知缓存服务器该资源什么时候会过期。当首部字段 Cache-Control 有指定 max-age 指令时,比起首部字段 Expires,会优先处理 max-age 指令。 -## �־����� +## 持久连接 -�����������һ����������ͼƬ�� HTML ҳ��ʱ������������� HTML ҳ����Դ����������ͼƬ��Դ�����ÿ����һ�� HTTP ͨ�ž�Ҫ�Ͽ�һ�� TCP ���ӣ����ӽ����ͶϿ��Ŀ�����ܴ�**�־�����** ֻ��Ҫ����һ�� TCP ���Ӿ��ܽ��ж�� HTTP ͨ�š�HTTP/1.1��ʼ�����е�����Ĭ�϶��dz־����ӡ� +当浏览器访问一个包含多张图片的 HTML 页面时,除了请求访问 HTML 页面资源,还会请求图片资源,如果每进行一次 HTTP 通信就要断开一次 TCP 连接,连接建立和断开的开销会很大。**持久连接** 只需要进行一次 TCP 连接就能进行多次 HTTP 通信。HTTP/1.1开始,所有的连接默认都是持久连接。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c73a0b78-5f46-4d2d-a009-dab2a999b5d8.jpg) -�־�������Ҫʹ�� Connection �ײ��ֶν��й�����HTTP/1.1 ��ʼHTTP Ĭ���dz־û����ӵģ����Ҫ�Ͽ� TCP ���ӣ���Ҫ�ɿͻ��˻��߷�����������Ͽ���ʹ�� Connection: close ������HTTP/1.1֮ǰĬ���Ƿdz־û����ӵģ����Ҫά�ֳ������ӣ���Ҫʹ�� Keep-Alive�� +持久连接需要使用 Connection 首部字段进行管理。HTTP/1.1 开始HTTP 默认是持久化连接的,如果要断开 TCP 连接,需要由客户端或者服务器端提出断开,使用 Connection: close ;而在HTTP/1.1之前默认是非持久化连接的,如果要维持持续连接,需要使用 Keep-Alive。 -���߻���ʽ����ͬʱ���Ͷ���������Ӧ��������Ҫ����һ������Ȼ��ȴ���Ӧ֮���ٷ���һ������ +管线化方式可以同时发送多个请求和响应,而不需要发送一个请求然后等待响应之后再发下一个请求。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/6943e2af-5a70-4004-8bee-b33d60f39da3.jpg) -## ���� +## 编码 -���루Encoding����Ҫ��Ϊ�˶�ʵ�����ѹ�������õı����У�gzip��compress��deflate��identity������ identity ��ʾ��ִ��ѹ���ı����ʽ�� +编码(Encoding)主要是为了对实体进行压缩。常用的编码有:gzip、compress、deflate、identity,其中 identity 表示不执行压缩的编码格式。 -## �ֿ鴫�� +## 分块传输 -�ֿ鴫�䣨Chunked Transfer Coding�����԰����ݷָ�ɶ�飬�����������ʾҳ�档 +分块传输(Chunked Transfer Coding)可以把数据分割成多块,让浏览器逐步显示页面。 -## �ಿ�ֶ��󼯺� +## 多部分对象集合 -һ�ݱ��������ڿɺ��ж����͵�ʵ��ͬʱ���ͣ�ÿ������֮���� boundary �ֶζ���ķָ������зָ���ÿ�����ֶ��������ײ��ֶΡ� +一份报文主体内可含有多类型的实体同时发送,每个部分之间用 boundary 字段定义的分隔符进行分隔;每个部分都可以有首部字段。 -���磬�ϴ��������ʱ����ʹ�����·�ʽ�� +例如,上传多个表单时可以使用如下方式: ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/decb0936-e83c-4a55-840a-fe8aa101ac61.png) -## ��Χ���� +## 范围请求 -�����������жϣ�������ֻ������һ�������ݣ���Χ����ʹ�ÿͻ����ܹ�ֻ����δ���͵��Dz������ݣ��Ӷ���������������·����������ݡ� +如果网络出现中断,服务器只发送了一部分数据,范围请求使得客户端能够只请求未发送的那部分数据,从而避免服务器端重新发送所有数据。 -���������ײ������� Range �ֶΣ�Ȼ��ָ������ķ�Χ������ Range : bytes = 5001-10000������ɹ��Ļ����������� 206 Partial Content ״̬�� +在请求报文首部中添加 Range 字段,然后指定请求的范围,例如 Range : bytes = 5001-10000。请求成功的话服务器发送 206 Partial Content 状态。 -## ����Э�� +## 内容协商 -ͨ������Э�̷�������ʵ����ݣ���������������Ĭ������ѡ�񷵻����Ľ��滹��Ӣ�Ľ��档 +通过内容协商返回最合适的内容,例如根据浏览器的默认语言选择返回中文界面还是英文界面。 -�漰�����ײ��ֶΣ�Accept��Accept-Charset��Accept-Encoding��Accept-Language��Content-Language�� +涉及以下首部字段:Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language。 -## �������� +## 虚拟主机 -ʹ����������������ʹ��һ̨������ӵ�ж���������������߼��Ͽ��Կ��ɶ���������� +使用虚拟主机技术,使得一台服务器拥有多个域名,并且在逻辑上可以看成多个服务器。 -## ͨ������ת�� +## 通信数据转发 -**����** +**代理** -�������������ܿͻ��˵����󣬲���ת��������������������������һ����͸���ģ�����ı� URL�� +代理服务器接受客户端的请求,并且转发给其它服务器。代理服务器一般是透明的,不会改变 URL。 -ʹ�ô�������ҪĿ���ǣ����桢������ʿ����Լ���¼������־�� +使用代理的主要目的是:缓存、网络访问控制以及记录访问日志。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c07035c3-a9ba-4508-8e3c-d8ae4c6ee9ee.jpg) -**����** +**网关** -�������������ͬ���ǣ����ط������Ὣ HTTP ת��Ϊ����Э�����ͨ�ţ��Ӷ������� HTTP �������ķ��� +与代理服务器不同的是,网关服务器会将 HTTP 转化为其它协议进行通信,从而其它非 HTTP 服务器的服务。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/81375888-6be1-476f-9521-42eea3e3154f.jpg) -**����** +**隧道** -ʹ�� SSL �ȼ����ֶΣ�Ϊ�ͻ��˺ͷ�����֮�佨��һ����ȫ��ͨ����·�� +使用 SSL 等加密手段,为客户端和服务器之间建立一条安全的通信线路。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/64b95403-d976-421a-8b45-bac89c0b5185.jpg) # HTTPs -HTTP �����°�ȫ�����⣺ +HTTP 有以下安全性问题: -1. ͨ��ʹ�����ģ����ݿ��ܻᱻ������ -2. ����֤ͨ�ŷ������ݣ�����п�������αװ�� -3. �޷�֤�����ĵ������ԣ������п�������۸ġ� +1. 通信使用明文,内容可能会被窃听; +2. 不验证通信方的身份,因此有可能遭遇伪装; +3. 无法证明报文的完整性,所以有可能已遭篡改。 -HTTPs ��������Э�飬���� HTTP �Ⱥ� SSL��Secure Socket Layer��ͨ�ţ����� SSL �� TCP ͨ�š�ͨ��ʹ�� SSL��HTTPs �ṩ�˼��ܡ���֤�������Ա����� +HTTPs 并不是新协议,而是 HTTP 先和 SSL(Secure Socket Layer)通信,再由 SSL 和 TCP 通信。通过使用 SSL,HTTPs 提供了加密、认证和完整性保护。 -## ���� +## 加密 -�����ּ��ܷ�ʽ���Գ���Կ���ܺ͹�����Կ���ܡ��Գ���Կ���ܵļ��ܺͽ���ʹ��ͬһ��Կ����������Կ����ʹ��һ����Կ���ڼ��ܺͽ��ܣ��ֱ�Ϊ������Կ��˽����Կ��������Կ�����˶����Ի�ã�ͨ�ŷ��ͷ���ý��շ��Ĺ�����Կ֮�󣬾Ϳ���ʹ�ù�����Կ���м��ܣ����շ��յ�ͨ�����ݺ�ʹ��˽����Կ���ܡ� +有两种加密方式:对称密钥加密和公开密钥加密。对称密钥加密的加密和解密使用同一密钥,而公开密钥加密使用一对密钥用于加密和解密,分别为公开密钥和私有密钥。公开密钥所有人都可以获得,通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。 -�Գ���Կ���ܵ�ȱ�㣺�޷���ȫ������Կ��������Կ���ܵ�ȱ�㣺�����˵����ʱ�� +对称密钥加密的缺点:无法安全传输密钥;公开密钥加密的缺点:相对来说更耗时。 -HTTPs ���� **��ϵļ��ܻ���**��ʹ�ù�����Կ�������ڴ���Գ���Կ��֮��ʹ�öԳ���Կ���ܽ���ͨ�š�����ͼ�У�������Կ���Գ���Կ�� +HTTPs 采用 **混合的加密机制**,使用公开密钥加密用于传输对称密钥,之后使用对称密钥加密进行通信。(下图中,共享密钥即对称密钥) ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/110b1a9b-87cd-45c3-a21d-824623715b33.jpg) -## ��֤ +## 认证 -ͨ��ʹ�� **֤��** ����ͨ�ŷ�������֤��֤�����й�����Կ���ݣ����������֤������Կ��ȷ����ͨ�ŷ��ģ���ô�Ϳ���ȷ��ͨ�ŷ��ǿɿ��ġ� +通过使用 **证书** 来对通信方进行认证。证书中有公开密钥数据,如果可以验证公开密钥的确属于通信方的,那么就可以确定通信方是可靠的。 -����֤����֤������CA��Certificate -Authority���䷢�Ĺ�����Կ֤�飬����ͨ�� CA ���������֤�� +数字证书认证机构(CA,Certificate +Authority)颁发的公开密钥证书,可以通过 CA 对其进行验证。 -���� HTTPs ͨ��ʱ�����������֤�鷢�͸��ͻ��ˣ��ͻ���ȡ�����еĹ�����Կ֮�󣬾Ϳ��Կ�ʼ���ܹ��̡� +进行 HTTPs 通信时,服务器会把证书发送给客户端,客户端取得其中的公开密钥之后,就可以开始加密过程。 -ʹ�� OpenSSL ���׿�Դ����ÿ���˶����Թ���һ�������Լ�����֤�������Ӷ��Լ����Լ��䷢������֤�顣������ڷ��ʸ÷�����ʱ������ʾ���޷�ȷ�����Ӱ�ȫ�ԡ��򡰸���վ�İ�ȫ֤��������⡱�Ⱦ�����Ϣ�� +使用 OpenSSL 这套开源程序,每个人都可以构建一套属于自己的认证机构,从而自己给自己颁发服务器证书。浏览器在访问该服务器时,会显示“无法确认连接安全性”或“该网站的安全证书存在问题”等警告消息。 -�ͻ���֤����Ҫ�û����а�װ��ֻ����ҵ����Ҫ�dz��߰�ȫ��ʱ��ʹ�ÿͻ���֤�飬�����������С� +客户端证书需要用户自行安装,只有在业务需要非常高安全性时才使用客户端证书,例如网上银行。 -## ������ +## 完整性 -SSL �ṩժҪ��������֤�����ԡ� +SSL 提供摘要功能来验证完整性。