diff --git a/notes/HTTP.md b/notes/HTTP.md index f67580ba..ca546a76 100644 --- a/notes/HTTP.md +++ b/notes/HTTP.md @@ -1,83 +1,84 @@ -* [基础概念](#基础概念) - * [Web基础](#web基础) +* [»ù´¡¸ÅÄî](#»ù´¡¸ÅÄî) + * [Web»ù´¡](#web»ù´¡) * [URL](#url) - * [请求和å“�应报文](#请求和å“�应报文) -* [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首部) - * [通用首部字段](#通用首部字段) - * [请求首部字段](#请求首部字段) - * [å“�应首部字段](#å“�应首部字段) - * [实体首部字段](#实体首部字段) -* [具体应用](#具体应用) + * [ÇëÇóºÍÏìÓ¦±¨ÎÄ](#ÇëÇóºÍÏìÓ¦±¨ÎÄ) +* [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) - * [加密](#加密) - * [认è¯�](#认è¯�) - * [完整性](#完整性) + * [¼ÓÃÜ](#¼ÓÃÜ) + * [ÈÏÖ¤](#ÈÏÖ¤) + * [ÍêÕûÐÔ](#ÍêÕûÐÔ) + * [HTTP/1.0 Óë HTTP/1.1 µÄÇø±ð](#http10-Óë-http11-µÄÇø±ð) -# 基础概念 +# »ù´¡¸ÅÄî -## 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 主è¦�目的ä¸�是获å�–资æº�,而是传输实体主体数æ�®ã€‚ +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 +89,319 @@ 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 ·½·¨Ò»Ñù£¬µ«ÊDz»·µ»Ø±¨ÎÄʵÌåÖ÷Ì岿·Ö¡£ -主è¦�用于确认 URL 的有效性以å�Šèµ„æº�更新的日期时间等。 +Ö÷ÒªÓÃÓÚÈ·ÈÏ URL µÄÓÐЧÐÔÒÔ¼°×ÊÔ´¸üеÄÈÕÆÚʱ¼äµÈ¡£ -## PUT:上传文件 +## PUT£ºÉÏ´«Îļþ -由于自身ä¸�带验è¯�机制,任何人都å�¯ä»¥ä¸Šä¼ æ–‡ä»¶ï¼Œå› æ­¤å­˜åœ¨å®‰å…¨æ€§é—®é¢˜ï¼Œä¸€èˆ¬ WEB 网站ä¸�使用该方法。 +ÓÉÓÚ×ÔÉí²»´øÑéÖ¤»úÖÆ£¬ÈκÎÈ˶¼¿ÉÒÔÉÏ´«Îļþ£¬Òò´Ë´æÔÚ°²È«ÐÔÎÊÌ⣬һ°ã WEB ÍøÕ¾²»Ê¹Óø÷½·¨¡£ -## DELETE:删除文件 +## DELETE£ºÉ¾³ýÎļþ -与 PUT 功能相å��,并且å�Œæ ·ä¸�带验è¯�机制。 +Óë PUT ¹¦ÄÜÏà·´£¬²¢ÇÒͬÑù²»´øÑéÖ¤»úÖÆ¡£ -## OPTIONS:查询支æŒ�的方法 +## OPTIONS£º²éѯ֧³ÖµÄ·½·¨ -查询指定的 URL 能够支æŒ�的方法。 +²éѯָ¶¨µÄ URL Äܹ»Ö§³ÖµÄ·½·¨¡£ -会返回 Allow: GET, POST, HEAD, OPTIONS 这样的内容。 +»á·µ»Ø Allow: GET, POST, HEAD, OPTIONS ÕâÑùµÄÄÚÈÝ¡£ -## TRACE:追踪路径 +## 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**:请求已ç»�æˆ�功处ç�†ï¼Œä½†æ˜¯è¿”回的å“�应报文ä¸�包å�«å®žä½“的主体部分。一般在å�ªéœ€è¦�从客户端往æœ�务器å�‘é€�ä¿¡æ�¯ï¼Œè€Œä¸�需è¦�返回数æ�®æ—¶ä½¿ç”¨ã€‚ +**204 No Content**£ºÇëÇóÒѾ­³É¹¦´¦Àí£¬µ«ÊÇ·µ»ØµÄÏìÓ¦±¨ÎIJ»°üº¬ÊµÌåµÄÖ÷Ì岿·Ö¡£Ò»°ãÔÚÖ»ÐèÒª´Ó¿Í»§¶ËÍù·þÎñÆ÷·¢ËÍÐÅÏ¢£¬¶ø²»ÐèÒª·µ»ØÊý¾ÝʱʹÓᣠ**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**£ºÈç¹ûÇëÇó±¨ÎÄÊײ¿°üº¬Ò»Ð©Ìõ¼þ£¬ÀýÈ磺If-Match£¬If-ModifiedSince£¬If-None-Match£¬If-Range£¬If-Unmodified-Since£¬µ«ÊDz»Âú×ãÌõ¼þ£¬Ôò·þÎñÆ÷»á·µ»Ø 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 ÈÏÖ¤£¨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开始,所有的连接默认都是æŒ�久连接。 +µ±ä¯ÀÀÆ÷·ÃÎÊÒ»¸ö°üº¬¶àÕÅͼƬµÄ HTML Ò³ÃæÊ±£¬³ýÁËÇëÇó·ÃÎÊ HTML Ò³Ãæ×ÊÔ´£¬»¹»áÇëÇóͼƬ×ÊÔ´£¬Èç¹ûÿ½øÐÐÒ»´Î HTTP ͨОÍÒª¶Ï¿ªÒ»´Î TCP Á¬½Ó£¬Á¬½Ó½¨Á¢ºÍ¶Ï¿ªµÄ¿ªÏú»áºÜ´ó¡£**³Ö¾ÃÁ¬½Ó** Ö»ÐèÒª½øÐÐÒ»´Î TCP Á¬½Ó¾ÍÄܽøÐжà´Î HTTP ͨÐÅ¡£HTTP/1.1¿ªÊ¼£¬ËùÓеÄÁ¬½ÓĬÈ϶¼Êdz־ÃÁ¬½Ó¡£ ![](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 Êײ¿×ֶνøÐйÜÀí¡£HTTP/1.1 ¿ªÊ¼HTTP ĬÈÏÊdz־û¯Á¬½ÓµÄ£¬Èç¹ûÒª¶Ï¿ª TCP Á¬½Ó£¬ÐèÒªÓɿͻ§¶Ë»òÕß·þÎñÆ÷¶ËÌá³ö¶Ï¿ª£¬Ê¹Óà Connection: close £»¶øÔÚHTTP/1.1֮ǰĬÈÏÊǷdz־û¯Á¬½ÓµÄ£¬Èç¹ûҪά³Ö³ÖÐøÁ¬½Ó£¬ÐèҪʹÓà 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 ÕâÌ׿ªÔ´³ÌÐò£¬Ã¿¸öÈ˶¼¿ÉÒÔ¹¹½¨Ò»Ì×ÊôÓÚ×Ô¼ºµÄÈÏÖ¤»ú¹¹£¬´Ó¶ø×Ô¼º¸ø×Ô¼º°ä·¢·þÎñÆ÷Ö¤Êé¡£ä¯ÀÀÆ÷ÔÚ·ÃÎʸ÷þÎñÆ÷ʱ£¬»áÏÔʾ¡°ÎÞ·¨È·ÈÏÁ¬½Ó°²È«ÐÔ¡±»ò¡°¸ÃÍøÕ¾µÄ°²È«Ö¤Êé´æÔÚÎÊÌ⡱µÈ¾¯¸æÏûÏ¢¡£ -客户端è¯�书需è¦�用户自行安装,å�ªæœ‰åœ¨ä¸šåŠ¡éœ€è¦�é�žå¸¸é«˜å®‰å…¨æ€§æ—¶æ‰�使用客户端è¯�书,例如网上银行。 +¿Í»§¶ËÖ¤ÊéÐèÒªÓû§×ÔÐа²×°£¬Ö»ÓÐÔÚÒµÎñÐèÒª·Ç³£¸ß°²È«ÐÔʱ²ÅʹÓÿͻ§¶ËÖ¤Ê飬ÀýÈçÍøÉÏÒøÐС£ -## 完整性 +## ÍêÕûÐÔ -SSL æ��供摘è¦�功能æ�¥éªŒè¯�完整性。 +SSL ÌṩժҪ¹¦ÄÜÀ´ÑéÖ¤ÍêÕûÐÔ¡£ +## HTTP/1.0 Óë HTTP/1.1 µÄÇø±ð + +- HTTP/1.1 ĬÈÏÊdz¤Á¬½Ó£» +- HTTP/1.1 ÌṩÁË·¶Î§ÇëÇó¹¦ÄÜ£» +- HTTP/1.1 ÌṩÁËÐéÄâÖ÷»úµÄ¹¦ÄÜ£» +- HTTP/1.1 ¶àÁËһЩ»º´æ´¦Àí×ֶΣ» +- HTTP/1.1 ¶àÁËһЩ״̬Â룻