diff --git a/notes/HTTP.md b/notes/HTTP.md index f17b79c6..f67580ba 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锛氳姹傜敤闅ч亾鍗忚杩炴帴浠g悊](#connect瑕佹眰鐢ㄩ毀閬撳崗璁繛鎺ヤ唬鐞) +* [HTTP 鐘舵佺爜](#http-鐘舵佺爜) + * [2XX 鎴愬姛](#2xx-鎴愬姛) + * [3XX 閲嶅畾鍚慮(#3xx-閲嶅畾鍚) + * [4XX 瀹㈡埛绔敊璇痌(#4xx-瀹㈡埛绔敊璇) + * [5XX 鏈嶅姟鍣ㄩ敊璇痌(#5xx-鏈嶅姟鍣ㄩ敊璇) +* [HTTP棣栭儴](#http棣栭儴) + * [閫氱敤棣栭儴瀛楁](#閫氱敤棣栭儴瀛楁) + * [璇锋眰棣栭儴瀛楁](#璇锋眰棣栭儴瀛楁) + * [鍝嶅簲棣栭儴瀛楁](#鍝嶅簲棣栭儴瀛楁) + * [瀹炰綋棣栭儴瀛楁](#瀹炰綋棣栭儴瀛楁) +* [鍏蜂綋搴旂敤](#鍏蜂綋搴旂敤) * [Cookie](#cookie) - * [缓存](#缓存) - * [持久连接](#持久连接) - * [编码](#编码) - * [分块传输](#分块传输) - * [多部分对象集合](#多部分对象集合) - * [范围请求](#范围请求) - * [内容协商](#内容协商) - * [虚拟主机](#虚拟主机) - * [通信数据转发](#通信数据转发) + * [缂撳瓨](#缂撳瓨) + * [鎸佷箙杩炴帴](#鎸佷箙杩炴帴) + * [缂栫爜](#缂栫爜) + * [鍒嗗潡浼犺緭](#鍒嗗潡浼犺緭) + * [澶氶儴鍒嗗璞¢泦鍚圿(#澶氶儴鍒嗗璞¢泦鍚) + * [鑼冨洿璇锋眰](#鑼冨洿璇锋眰) + * [鍐呭鍗忓晢](#鍐呭鍗忓晢) + * [铏氭嫙涓绘満](#铏氭嫙涓绘満) + * [閫氫俊鏁版嵁杞彂](#閫氫俊鏁版嵁杞彂) * [HTTPs](#https) - * [加密](#加密) - * [认证](#认证) - * [完整性](#完整性) + * [鍔犲瘑](#鍔犲瘑) + * [璁よ瘉](#璁よ瘉) + * [瀹屾暣鎬(#瀹屾暣鎬) -# 基础概念 +# 鍩虹姒傚康 -## Web基础 +## Web鍩虹 -HTTP(HyperText Transfer Protocol,超为本传输协议)。 +HTTP锛圚yperText Transfer Protocol锛岃秴涓烘湰浼犺緭鍗忚锛夈 -WWW(Word Wide Web)的三种技术:HTML、HTTP、URL。 +WWW锛圵ord Wide Web锛夌殑涓夌鎶鏈細HTML銆丠TTP銆乁RL銆 -RFC(Request for Comments,征求修正意见书),互联网的设计文档。 +RFC锛圧equest for Comments锛屽緛姹備慨姝f剰瑙佷功锛夛紝浜掕仈缃戠殑璁捐鏂囨。銆 ## 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锛圲niform Resource Indentifier锛岀粺涓璧勬簮鏍囪瘑绗︼級锛孶RL锛圲niform Resource Locator锛岀粺涓璧勬簮瀹氫綅绗︼級锛孶RN锛圲niform Resource Name锛岀粺涓璧勬簮鍚嶇О锛夛紝渚嬪 urn:isbn:0-486-27557-4 銆俇RI 鍖呭惈 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 主要目的不是获取资源,而是传输实体主体数据。 +POST 涓昏鐩殑涓嶆槸鑾峰彇璧勬簮锛岃屾槸浼犺緭瀹炰綋涓讳綋鏁版嵁銆 -GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL中,而 POST 的参数存储在实体主体部分。 +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 传的参数在 URL 是可见的,可能会泄露私密信息。并且 GET 只支持 ASCII 字符,如果参数为中文则可能会出现乱码,而 POST 支持标准字符集。 +GET 鐨勪紶鍙傛柟寮忕浉姣斾簬 POST 瀹夊叏鎬ц緝宸紝鍥犱负 GET 浼犵殑鍙傛暟鍦 URL 鏄彲瑙佺殑锛屽彲鑳戒細娉勯湶绉佸瘑淇℃伅銆傚苟涓 GET 鍙敮鎸 ASCII 瀛楃锛屽鏋滃弬鏁颁负涓枃鍒欏彲鑳戒細鍑虹幇涔辩爜锛岃 POST 鏀寔鏍囧噯瀛楃闆嗐 -## HEAD:获取报文首部 +## HEAD锛氳幏鍙栨姤鏂囬閮 -和 GET 方法一样,但是不返回报文实体主体部分。 +鍜 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 鏀诲嚮锛圕ross-Site Tracing锛岃法绔欒拷韪級锛屽洜姝ゆ洿涓嶄細鍘讳娇鐢ㄥ畠銆 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/ca711108-e937-4d7d-99aa-61b325c61f1a.jpg) -## CONNECT:要求用隧道协议连接代理 +## CONNECT锛氳姹傜敤闅ч亾鍗忚杩炴帴浠g悊 -用隧道协议进行 TCP 通信。 +鐢ㄩ毀閬撳崗璁繘琛 TCP 閫氫俊銆 -主要使用 SSL(Secure Sokets Layer,安全套接字)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。 +涓昏浣跨敤 SSL锛圫ecure Sokets Layer锛屽畨鍏ㄥ鎺ュ瓧锛夊拰 TLS锛圱ransport 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锛堟垚鍔熺姸鎬佺爜锛 | 璇锋眰姝e父澶勭悊瀹屾瘯 | +| 3XX | Redirection锛堥噸瀹氬悜鐘舵佺爜锛 | 闇瑕佽繘琛岄檮鍔犳搷浣滀互瀹屾垚璇锋眰 | +| 4XX | Client Error锛堝鎴风閿欒鐘舵佺爜锛 | 鏈嶅姟鍣ㄦ棤娉曞鐞嗚姹 | +| 5XX | Server Error锛堟湇鍔″櫒閿欒鐘舵佺爜锛 | 鏈嶅姟鍣ㄥ鐞嗚姹傚嚭閿 | -## 2XX 成功 +## 2XX 鎴愬姛 **200 OK** -**204 No Content**:请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。 +**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 方法改成 GET 方法,但是大多数浏览器都会把 301、302 和 303 状态下的重定向把 POST 方法改成 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,但是不满足条件,则服务器会返回 304 状态码。 +**304 Not Modified**锛氬鏋滆姹傛姤鏂囬閮ㄥ寘鍚竴浜涙潯浠讹紝渚嬪锛欼f-Match锛孖f-ModifiedSince锛孖f-None-Match锛孖f-Range锛孖f-Unmodified-Since锛屼絾鏄笉婊¤冻鏉′欢锛屽垯鏈嶅姟鍣ㄤ細杩斿洖 304 鐘舵佺爜銆 -**307 Temporary Redirect**:临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。 +**307 Temporary Redirect**锛氫复鏃堕噸瀹氬悜锛屼笌 302 鐨勫惈涔夌被浼硷紝浣嗘槸 307 瑕佹眰娴忚鍣ㄤ笉浼氭妸閲嶅畾鍚戣姹傜殑 POST 鏂规硶鏀规垚 GET 鏂规硶銆 -## 4XX 客户端错误 +## 4XX 瀹㈡埛绔敊璇 -**400 Bad Request**:请求报文中存在语法错误 +**400 Bad Request**锛氳姹傛姤鏂囦腑瀛樺湪璇硶閿欒 -**401 Unauthorized**:该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。如果之前已进行过一次请求,则表示用户认证失败。 +**401 Unauthorized**锛氳鐘舵佺爜琛ㄧず鍙戦佺殑璇锋眰闇瑕佹湁閫氳繃 HTTP 璁よ瘉锛圔ASIC 璁よ瘉銆丏IGEST 璁よ瘉锛夌殑璁よ瘉淇℃伅銆傚鏋滀箣鍓嶅凡杩涜杩囦竴娆¤姹傦紝鍒欒〃绀虹敤鎴疯璇佸け璐ャ ![](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**锛氭湇鍔″櫒姝e湪鎵ц璇锋眰鏃跺彂鐢熼敊璇 -**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 | 浠g悊鏈嶅姟鍣ㄧ殑鐩稿叧淇℃伅 | +| 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 | 鐢ㄦ埛浠g悊鍙鐞嗙殑濯掍綋绫诲瀷 | +| Accept-Charset | 浼樺厛鐨勫瓧绗﹂泦 | +| Accept-Encoding | 浼樺厛鐨勫唴瀹圭紪鐮 | +| Accept-Language | 浼樺厛鐨勮瑷锛堣嚜鐒惰瑷锛 | +| Authorization | Web璁よ瘉淇℃伅 | +| Expect | 鏈熷緟鏈嶅姟鍣ㄧ殑鐗瑰畾琛屼负 | +| From | 鐢ㄦ埛鐨勭數瀛愰偖绠卞湴鍧 | +| Host | 璇锋眰璧勬簮鎵鍦ㄦ湇鍔″櫒 | +| If-Match | 姣旇緝瀹炰綋鏍囪锛圗Tag锛 | +| If-Modified-Since | 姣旇緝璧勬簮鐨勬洿鏂版椂闂 | +| If-None-Match | 姣旇緝瀹炰綋鏍囪锛堜笌 If-Match 鐩稿弽锛 | +| If-Range | 璧勬簮鏈洿鏂版椂鍙戦佸疄浣 Byte 鐨勮寖鍥磋姹 | +| If-Unmodified-Since | 姣旇緝璧勬簮鐨勬洿鏂版椂闂达紙涓嶪f-Modified-Since鐩稿弽锛 | +| Max-Forwards | 鏈澶т紶杈撻愯烦鏁 | +| Proxy-Authorization | 浠g悊鏈嶅姟鍣ㄨ姹傚鎴风鐨勮璇佷俊鎭 | +| 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 | 浠g悊鏈嶅姟鍣ㄥ瀹㈡埛绔殑璁よ瘉淇℃伅 | +| Retry-After | 瀵瑰啀娆″彂璧疯姹傜殑鏃舵満瑕佹眰 | +| Server | HTTP鏈嶅姟鍣ㄧ殑瀹夎淇℃伅 | +| Vary | 浠g悊鏈嶅姟鍣ㄧ紦瀛樼殑绠$悊淇℃伅 | +| 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 | 鏇夸唬瀵瑰簲璧勬簮鐨刄RI | +| Content-MD5 | 瀹炰綋涓讳綋鐨勬姤鏂囨憳瑕 | +| Content-Range | 瀹炰綋涓讳綋鐨勪綅缃寖鍥 | +| Content-Type | 瀹炰綋涓讳綋鐨勫獟浣撶被鍨 | +| Expires | 瀹炰綋涓讳綋杩囨湡鐨勬棩鏈熸椂闂 | +| Last-Modified | 璧勬簮鐨勬渶鍚庝慨鏀规棩鏈熸椂闂 | -# 具体应用 +# 鍏蜂綋搴旂敤 ## Cookie -HTTP 协议是无状态的,主要是为了让 HTTP 协议尽可能简单,使得它能够处理大量事务。HTTP/1.1 引入 Cookie 来保存状态信息。 +HTTP 鍗忚鏄棤鐘舵佺殑锛屼富瑕佹槸涓轰簡璁 HTTP 鍗忚灏藉彲鑳界畝鍗曪紝浣垮緱瀹冭兘澶熷鐞嗗ぇ閲忎簨鍔°侶TTP/1.1 寮曞叆 Cookie 鏉ヤ繚瀛樼姸鎬佷俊鎭 -服务器会发送的响应报文包含 Set-Cookie 字段,客户端得到该相应后把 Cookie 内容保存到浏览器中。下次再发送请求时,从浏览器中读出 Cookie 值,在请求报文中包含 Cookie 字段,这样服务器就知道客户端的状态信息了。Cookie 状态信息保存在客户端浏览器中,而不是服务器上。 +鏈嶅姟鍣ㄤ細鍙戦佺殑鍝嶅簲鎶ユ枃鍖呭惈 Set-Cookie 瀛楁锛屽鎴风寰楀埌璇ョ浉搴斿悗鎶 Cookie 鍐呭淇濆瓨鍒版祻瑙堝櫒涓備笅娆″啀鍙戦佽姹傛椂锛屼粠娴忚鍣ㄤ腑璇诲嚭 Cookie 鍊硷紝鍦ㄨ姹傛姤鏂囦腑鍖呭惈 Cookie 瀛楁锛岃繖鏍锋湇鍔″櫒灏辩煡閬撳鎴风鐨勭姸鎬佷俊鎭簡銆侰ookie 鐘舵佷俊鎭繚瀛樺湪瀹㈡埛绔祻瑙堝櫒涓紝鑰屼笉鏄湇鍔″櫒涓娿 ![](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 鐨勯傜敤瀵硅薄锛堣嫢涓嶆寚瀹氬垯榛樿涓烘枃妗f墍鍦ㄧ殑鏂囦欢鐩綍锛 | +| 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 閮芥湁涓涓敮涓鏍囪瘑锛歋ession ID銆傚綋鏈嶅姟鍣ㄥ垱寤轰簡涓涓 Session 鏃讹紝缁欏鎴风鍙戦佺殑鍝嶅簲鎶ユ枃灏卞寘鍚簡 Set-Cookie 瀛楁锛屽叾涓湁涓涓悕涓 sid 鐨勯敭鍊煎锛岃繖涓敭鍊煎灏辨槸 Session ID銆傚鎴风鏀跺埌鍚庡氨鎶 Cookie 淇濆瓨鍦ㄦ祻瑙堝櫒涓紝骞朵笖涔嬪悗鍙戦佺殑璇锋眰鎶ユ枃閮藉寘鍚 Session ID銆侶TTP 灏辨槸 Session 鍜 Cookie 杩欎袱绉嶆柟寮忎竴璧峰悎浣滄潵瀹炵幇璺熻釜鐢ㄦ埛鐘舵佺殑锛岃 Session 鐢ㄤ簬鏈嶅姟鍣ㄧ锛孋ookie 鐢ㄤ簬瀹㈡埛绔 -**浏览器禁用 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开始,所有的连接默认都是持久连接。 +褰撴祻瑙堝櫒璁块棶涓涓寘鍚寮犲浘鐗囩殑 HTML 椤甸潰鏃讹紝闄や簡璇锋眰璁块棶 HTML 椤甸潰璧勬簮锛岃繕浼氳姹傚浘鐗囪祫婧愶紝濡傛灉姣忚繘琛屼竴娆 HTTP 閫氫俊灏辫鏂紑涓娆 TCP 杩炴帴锛岃繛鎺ュ缓绔嬪拰鏂紑鐨勫紑閿浼氬緢澶с**鎸佷箙杩炴帴** 鍙渶瑕佽繘琛屼竴娆 TCP 杩炴帴灏辫兘杩涜澶氭 HTTP 閫氫俊銆侶TTP/1.1寮濮嬶紝鎵鏈夌殑杩炴帴榛樿閮芥槸鎸佷箙杩炴帴銆 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c73a0b78-5f46-4d2d-a009-dab2a999b5d8.jpg) -持久连接需要使用 Connection 首部字段进行管理。HTTP/1.1 开始HTTP 默认是持久化连接的,如果要断开 TCP 连接,需要由客户端或者服务器端提出断开,使用 Connection: close ;而在HTTP/1.1之前默认是非持久化连接的,如果要维持持续连接,需要使用 Keep-Alive。 +鎸佷箙杩炴帴闇瑕佷娇鐢 Connection 棣栭儴瀛楁杩涜绠$悊銆侶TTP/1.1 寮濮婬TTP 榛樿鏄寔涔呭寲杩炴帴鐨勶紝濡傛灉瑕佹柇寮 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 表示不执行压缩的编码格式。 +缂栫爜锛圗ncoding锛変富瑕佹槸涓轰簡瀵瑰疄浣撹繘琛屽帇缂┿傚父鐢ㄧ殑缂栫爜鏈夛細gzip銆乧ompress銆乨eflate銆乮dentity锛屽叾涓 identity 琛ㄧず涓嶆墽琛屽帇缂╃殑缂栫爜鏍煎紡銆 -## 分块传输 +## 鍒嗗潡浼犺緭 -分块传输(Chunked Transfer Coding)可以把数据分割成多块,让浏览器逐步显示页面。 +鍒嗗潡浼犺緭锛圕hunked Transfer Coding锛夊彲浠ユ妸鏁版嵁鍒嗗壊鎴愬鍧楋紝璁╂祻瑙堝櫒閫愭鏄剧ず椤甸潰銆 -## 多部分对象集合 +## 澶氶儴鍒嗗璞¢泦鍚 -一份报文主体内可含有多类型的实体同时发送,每个部分之间用 boundary 字段定义的分隔符进行分隔;每个部分都可以有首部字段。 +涓浠芥姤鏂囦富浣撳唴鍙惈鏈夊绫诲瀷鐨勫疄浣撳悓鏃跺彂閫侊紝姣忎釜閮ㄥ垎涔嬮棿鐢 boundary 瀛楁瀹氫箟鐨勫垎闅旂杩涜鍒嗛殧锛涙瘡涓儴鍒嗛兘鍙互鏈夐閮ㄥ瓧娈点 -例如,上传多个表单时可以使用如下方式: +渚嬪锛屼笂浼犲涓〃鍗曟椂鍙互浣跨敤濡備笅鏂瑰紡锛 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/decb0936-e83c-4a55-840a-fe8aa101ac61.png) -## 范围请求 +## 鑼冨洿璇锋眰 -如果网络出现中断,服务器只发送了一部分数据,范围请求使得客户端能够只请求未发送的那部分数据,从而避免服务器端重新发送所有数据。 +濡傛灉缃戠粶鍑虹幇涓柇锛屾湇鍔″櫒鍙彂閫佷簡涓閮ㄥ垎鏁版嵁锛岃寖鍥磋姹備娇寰楀鎴风鑳藉鍙姹傛湭鍙戦佺殑閭i儴鍒嗘暟鎹紝浠庤岄伩鍏嶆湇鍔″櫒绔噸鏂板彂閫佹墍鏈夋暟鎹 -在请求报文首部中添加 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。 +娑夊強浠ヤ笅棣栭儴瀛楁锛欰ccept銆丄ccept-Charset銆丄ccept-Encoding銆丄ccept-Language銆丆ontent-Language銆 -## 虚拟主机 +## 铏氭嫙涓绘満 -使用虚拟主机技术,使得一台服务器拥有多个域名,并且在逻辑上可以看成多个服务器。 +浣跨敤铏氭嫙涓绘満鎶鏈紝浣垮緱涓鍙版湇鍔″櫒鎷ユ湁澶氫釜鍩熷悕锛屽苟涓斿湪閫昏緫涓婂彲浠ョ湅鎴愬涓湇鍔″櫒銆 -## 通信数据转发 +## 閫氫俊鏁版嵁杞彂 -**代理** +**浠g悊** -代理服务器接受客户端的请求,并且转发给其它服务器。代理服务器一般是透明的,不会改变 URL。 +浠g悊鏈嶅姟鍣ㄦ帴鍙楀鎴风鐨勮姹傦紝骞朵笖杞彂缁欏叾瀹冩湇鍔″櫒銆備唬鐞嗘湇鍔″櫒涓鑸槸閫忔槑鐨勶紝涓嶄細鏀瑰彉 URL銆 -使用代理的主要目的是:缓存、网络访问控制以及记录访问日志。 +浣跨敤浠g悊鐨勪富瑕佺洰鐨勬槸锛氱紦瀛樸佺綉缁滆闂帶鍒朵互鍙婅褰曡闂棩蹇椼 ![](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锛圫ecure Socket Layer锛夐氫俊锛屽啀鐢 SSL 鍜 TCP 閫氫俊銆傞氳繃浣跨敤 SSL锛孒TTPs 鎻愪緵浜嗗姞瀵嗐佽璇佸拰瀹屾暣鎬т繚鎶ゃ -## 加密 +## 鍔犲瘑 -有两种加密方式:对称密钥加密和公开密钥加密。对称密钥加密的加密和解密使用同一密钥,而公开密钥加密使用一对密钥用于加密和解密,分别为公开密钥和私有密钥。公开密钥所有人都可以获得,通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。 +鏈変袱绉嶅姞瀵嗘柟寮忥細瀵圭О瀵嗛挜鍔犲瘑鍜屽叕寮瀵嗛挜鍔犲瘑銆傚绉板瘑閽ュ姞瀵嗙殑鍔犲瘑鍜岃В瀵嗕娇鐢ㄥ悓涓瀵嗛挜锛岃屽叕寮瀵嗛挜鍔犲瘑浣跨敤涓瀵瑰瘑閽ョ敤浜庡姞瀵嗗拰瑙e瘑锛屽垎鍒负鍏紑瀵嗛挜鍜岀鏈夊瘑閽ャ傚叕寮瀵嗛挜鎵鏈変汉閮藉彲浠ヨ幏寰楋紝閫氫俊鍙戦佹柟鑾峰緱鎺ユ敹鏂圭殑鍏紑瀵嗛挜涔嬪悗锛屽氨鍙互浣跨敤鍏紑瀵嗛挜杩涜鍔犲瘑锛屾帴鏀舵柟鏀跺埌閫氫俊鍐呭鍚庝娇鐢ㄧ鏈夊瘑閽ヨВ瀵嗐 -对称密钥加密的缺点:无法安全传输密钥;公开密钥加密的缺点:相对来说更耗时。 +瀵圭О瀵嗛挜鍔犲瘑鐨勭己鐐癸細鏃犳硶瀹夊叏浼犺緭瀵嗛挜锛涘叕寮瀵嗛挜鍔犲瘑鐨勭己鐐癸細鐩稿鏉ヨ鏇磋楁椂銆 -HTTPs 采用 **混合的加密机制**,使用公开密钥加密用于传输对称密钥,之后使用对称密钥加密进行通信。(下图中,共享密钥即对称密钥) +HTTPs 閲囩敤 **娣峰悎鐨勫姞瀵嗘満鍒**锛屼娇鐢ㄥ叕寮瀵嗛挜鍔犲瘑鐢ㄤ簬浼犺緭瀵圭О瀵嗛挜锛屼箣鍚庝娇鐢ㄥ绉板瘑閽ュ姞瀵嗚繘琛岄氫俊銆傦紙涓嬪浘涓紝鍏变韩瀵嗛挜鍗冲绉板瘑閽ワ級 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/110b1a9b-87cd-45c3-a21d-824623715b33.jpg) -## 认证 +## 璁よ瘉 -通过使用 **证书** 来对通信方进行认证。证书中有公开密钥数据,如果可以验证公开密钥的确属于通信方的,那么就可以确定通信方是可靠的。 +閫氳繃浣跨敤 **璇佷功** 鏉ュ閫氫俊鏂硅繘琛岃璇併傝瘉涔︿腑鏈夊叕寮瀵嗛挜鏁版嵁锛屽鏋滃彲浠ラ獙璇佸叕寮瀵嗛挜鐨勭‘灞炰簬閫氫俊鏂圭殑锛岄偅涔堝氨鍙互纭畾閫氫俊鏂规槸鍙潬鐨勩 -数字证书认证机构(CA,Certificate -Authority)颁发的公开密钥证书,可以通过 CA 对其进行验证。 +鏁板瓧璇佷功璁よ瘉鏈烘瀯锛圕A锛孋ertificate +Authority锛夐鍙戠殑鍏紑瀵嗛挜璇佷功锛屽彲浠ラ氳繃 CA 瀵瑰叾杩涜楠岃瘉銆 -进行 HTTPs 通信时,服务器会把证书发送给客户端,客户端取得其中的公开密钥之后,就可以开始加密过程。 +杩涜 HTTPs 閫氫俊鏃讹紝鏈嶅姟鍣ㄤ細鎶婅瘉涔﹀彂閫佺粰瀹㈡埛绔紝瀹㈡埛绔彇寰楀叾涓殑鍏紑瀵嗛挜涔嬪悗锛屽氨鍙互寮濮嬪姞瀵嗚繃绋嬨 -使用 OpenSSL 这套开源程序,每个人都可以构建一套属于自己的认证机构,从而自己给自己颁发服务器证书。浏览器在访问该服务器时,会显示“无法确认连接安全性”或“该网站的安全证书存在问题”等警告消息。 +浣跨敤 OpenSSL 杩欏寮婧愮▼搴忥紝姣忎釜浜洪兘鍙互鏋勫缓涓濂楀睘浜庤嚜宸辩殑璁よ瘉鏈烘瀯锛屼粠鑰岃嚜宸辩粰鑷繁棰佸彂鏈嶅姟鍣ㄨ瘉涔︺傛祻瑙堝櫒鍦ㄨ闂鏈嶅姟鍣ㄦ椂锛屼細鏄剧ず鈥滄棤娉曠‘璁よ繛鎺ュ畨鍏ㄦр濇垨鈥滆缃戠珯鐨勫畨鍏ㄨ瘉涔﹀瓨鍦ㄩ棶棰樷濈瓑璀﹀憡娑堟伅銆 -客户端证书需要用户自行安装,只有在业务需要非常高安全性时才使用客户端证书,例如网上银行。 +瀹㈡埛绔瘉涔﹂渶瑕佺敤鎴疯嚜琛屽畨瑁咃紝鍙湁鍦ㄤ笟鍔¢渶瑕侀潪甯搁珮瀹夊叏鎬ф椂鎵嶄娇鐢ㄥ鎴风璇佷功锛屼緥濡傜綉涓婇摱琛屻 -## 完整性 +## 瀹屾暣鎬 -SSL 提供摘要功能来验证完整性。 +SSL 鎻愪緵鎽樿鍔熻兘鏉ラ獙璇佸畬鏁存с