blog icon indicating copy to clipboard operation
blog copied to clipboard

HTTP 实体和编码

Open Pines-Cheng opened this issue 6 years ago • 1 comments

每夊éƒŊ有数äģĨäēŋ莥įš„各į§åĒ’äŊ“å¯ščąĄįģį”ą HTTP äŧ é€īŧŒåĻ‚回像、文æœŦ、åŊąį‰‡äģĨ及čŊ¯äģļį¨‹åēį­‰ã€‚HTTP čĻįĄŽäŋåŽƒæ‰€æ‰ŋčŊŊįš„â€œč´§į‰Šâ€æģĄ čļŗäģĨä¸‹æĄäģļ:

  • 可äģĨčĸĢæ­ŖįĄŽåœ°č¯†åˆĢ(通čŋ‡Content-TypeéĻ–éƒ¨č¯´æ˜ŽåĒ’äŊ“æ ŧåŧīŧŒContent- Language éĻ–éƒ¨č¯´æ˜Žč¯­č¨€)īŧŒäģĨäžŋæĩč§ˆå™¨å’Œå…ļäģ–åŽĸæˆˇįĢ¯čƒŊæ­ŖįĄŽå¤„į†å†…厚。
  • 可äģĨčĸĢæ­ŖįĄŽåœ°č§Ŗ包(通čŋ‡Content-LengthéĻ–部和Content-EncodingéĻ–部)。
  • 是最新įš„(通čŋ‡åŽžäŊ“éĒŒč¯į å’Œįŧ“å­˜čŋ‡æœŸæŽ§åˆļ)
  • įŦĻ合į”¨æˆˇįš„需čĻ(åŸēäēŽAcceptįŗģ列įš„内厚协商éĻ–部)
  • 在įŊ‘įģœä¸Šå¯äģĨåŋĢ速有效地äŧ čž“(通čŋ‡čŒƒå›´č¯ˇæą‚ã€åˇŽåŧ‚įŧ–į äģĨ及å…ļäģ–数捎压įŧŠæ–šæŗ•)
  • åŽŒæ•´åˆ°čžžã€æœĒčĸĢį¯Ąæ”š(通čŋ‡äŧ čž“įŧ–į éĻ–部和Content-MD5æ ĄéĒŒå’ŒéĻ–部)

HTTP 厞äŊ“éĻ–部

HTTP 厞äŊ“éĻ–部描čŋ°äē† HTTP æŠĨ文įš„内厚。HTTP/1.1 į‰ˆåŽšäš‰äē†äģĨ下 10 ä¸ĒåŸēæœŦ字äŊ“éĻ–部字æŽĩ。

  • Content-TypeīŧšåŽžäŊ“中所æ‰ŋčŊŊå¯ščąĄįš„įąģ型。
  • Content-Lengthīŧš 所äŧ é€åŽžäŊ“ä¸ģäŊ“įš„é•ŋåēĻ或大小。
  • Content-Languageīŧš 与所äŧ é€å¯ščąĄæœ€į›¸é…įš„äēēįąģč¯­č¨€ã€‚
  • Content-Encodingīŧš å¯ščąĄæ•°æŽæ‰€åšįš„äģģ意变æĸ(比åĻ‚īŧŒåŽ‹įŧŠ)。
  • Content-Locationīŧš 一ä¸Ē备į”¨äŊįŊŽīŧŒč¯ˇæą‚æ—ļ可通čŋ‡åŽƒčŽˇåž—å¯ščąĄã€‚
  • Content-Rangeīŧš åĻ‚æžœčŋ™æ˜¯éƒ¨åˆ†åŽžäŊ“īŧŒčŋ™ä¸ĒéĻ–éƒ¨č¯´æ˜ŽåŽƒæ˜¯æ•´äŊ“įš„å“Ēä¸Ē部分。
  • Content-MD5īŧš 厞äŊ“ä¸ģäŊ“内厚įš„æ ĄéĒŒå’Œã€‚
  • Last-Modifiedīŧš 所äŧ čž“å†…åŽšåœ¨æœåŠĄå™¨ä¸Šåˆ›åģē或最后äŋŽæ”šįš„æ—Ĩ期æ—ļ间。
  • Expiresīŧš 厞äŊ“数捎将čĻå¤ąæ•ˆįš„æ—Ĩ期æ—ļ间。
  • Allowīŧš č¯Ĩčĩ„æēæ‰€å…čŽ¸įš„各į§č¯ˇæą‚æ–šæŗ•īŧŒäž‹åĻ‚īŧŒGET 和 HEAD。
  • ETagīŧš čŋ™äģŊ文æĄŖį‰šåŽšåŽžäž‹įš„唯一éĒŒč¯į ã€‚ETag éĻ–éƒ¨æ˛Ąæœ‰æ­ŖåŧåŽšäš‰ä¸ē厞äŊ“éĻ–部īŧŒäŊ†åŽƒå¯ščŽ¸å¤šæļ‰åŠåŽžäŊ“įš„操äŊœæĨč¯´īŧŒéƒŊ是一ä¸Ē重čĻįš„éĻ–部。
  • Cache-Controlīŧš 指å‡ēåē”č¯ĨåĻ‚äŊ•įŧ“å­˜č¯Ĩ文æĄŖ。和 ETag éĻ–部įąģäŧŧīŧŒCache-Control éĻ–éƒ¨äšŸæ˛Ąæœ‰æ­Ŗ åŧåŽšäš‰ä¸ē厞äŊ“éĻ–部。

厞äŊ“įš„大小īŧˆContent-Lengthīŧ‰

除非äŊŋį”¨äē†åˆ†å—įŧ–į īŧŒåĻ则 Content-Length éĻ–éƒ¨å°ąæ˜¯å¸Ļ有厞äŊ“ä¸ģäŊ“įš„æŠĨ文åŋ…éĄģäŊŋį”¨įš„。äŊŋį”¨ Content-Length éĻ–部是ä¸ēäē†čƒŊ够æŖ€æĩ‹å‡ēæœåŠĄå™¨å´Šæēƒč€Œå¯ŧ致įš„æŠĨ文æˆĒå°žīŧŒåšļå¯šå…ąäēĢ持䚅čŋžæŽĨįš„多ä¸ĒæŠĨ文čŋ›čĄŒæ­ŖįĄŽåˆ†æŽĩ。

Content-Length éĻ–部指į¤ēå‡ēæŠĨ文中厞äŊ“ä¸ģäŊ“įš„å­—čŠ‚å¤§å°ã€‚čŋ™ä¸Ē大小是包åĢäē†æ‰€æœ‰å†…厚įŧ–į įš„。åĻ‚æžœä¸ģäŊ“čŋ›čĄŒäē†å†…厚įŧ–į īŧŒContent-Length éĻ–éƒ¨č¯´æ˜Žįš„å°ąæ˜¯ įŧ–į åŽ(encoded) įš„ä¸ģäŊ“įš„å­—čŠ‚é•ŋåēĻīŧŒč€Œä¸æ˜¯æœĒįŧ–į įš„原始ä¸ģäŊ“įš„é•ŋåēĻ。

æ˛Ąæœ‰ Content-Length įš„č¯īŧŒåŽĸæˆˇįĢ¯æ— æŗ•åŒē分到åē•æ˜¯æŠĨ文įģ“束æ—ļæ­Ŗ常įš„čŋžæŽĨå…ŗ闭īŧŒčŋ˜æ˜¯æŠĨ文äŧ čž“中į”ąäēŽæœåŠĄå™¨å´Šæēƒč€Œå¯ŧ致įš„čŋžæŽĨå…ŗ闭。åŽĸæˆˇįĢ¯éœ€čĻé€ščŋ‡ Content-Length æĨæŖ€æĩ‹ æŠĨ文æˆĒ尞。

Content-Length éĻ–部寚äēŽæŒäš…čŋžæŽĨ是åŋ…不可少įš„。åĻ‚果响åē”通čŋ‡æŒäš…čŋžæŽĨäŧ é€īŧŒ å°ąå¯čƒŊ有åĻä¸€æĄ HTTP 响åē”į´§éšå…ļ后。åŽĸæˆˇįĢ¯é€ščŋ‡ Content-Length éĻ–éƒ¨å°ąå¯äģĨįŸĨ道æŠĨ文在äŊ•å¤„įģ“束īŧŒä¸‹ä¸€æĄæŠĨ文äģŽäŊ•å¤„åŧ€å§‹ã€‚å› ä¸ēčŋžæŽĨ是持䚅įš„īŧŒåŽĸæˆˇįĢ¯æ— æŗ•äžčĩ– čŋžæŽĨå…ŗ闭æĨ判åˆĢæŠĨ文įš„įģ“束。

有一į§æƒ…å†ĩ下īŧŒäŊŋį”¨æŒäš…čŋžæŽĨæ—ļ可äģĨæ˛Ąæœ‰ Content-Length éĻ–部īŧŒåŗ采į”¨åˆ†å—įŧ–į (chunked encoding)æ—ļ。在分块įŧ–į įš„情å†ĩ下īŧŒæ•°æŽæ˜¯åˆ†ä¸ē一įŗģ列įš„块æĨ发送įš„īŧŒæ¯å—éƒŊæœ‰å¤§å°č¯´æ˜Žã€‚å“Ēæ€•æœåŠĄå™¨åœ¨į”ŸæˆéĻ–部įš„æ—ļ候不įŸĨ道整ä¸Ē厞äŊ“įš„大小(通常是因ä¸ē厞äŊ“是动态į”Ÿæˆįš„)īŧŒäģį„ļ可äģĨäŊŋį”¨åˆ†å—įŧ–į äŧ čž“č‹Ĩåš˛åˇ˛įŸĨ大小įš„块。

厞äŊ“摘čĻīŧˆContent-MD5īŧ‰

æœåŠĄå™¨äŊŋį”¨ Content-MD5 éĻ–部发送寚厞äŊ“ä¸ģäŊ“čŋčĄŒ MD5 įŽ—æŗ•įš„įģ“果。åĒ有äē§į”Ÿå“åē”įš„åŽŸå§‹æœåŠĄå™¨å¯äģĨ莥įŽ—åšļ发送 Content-MD5 éĻ–部。åĻ‚果一äģŊ文æĄŖäŊŋį”¨ gzip įŽ—æŗ•čŋ› čĄŒåŽ‹įŧŠīŧŒį„ļ后į”¨åˆ†å—įŧ–į å‘送īŧŒé‚Ŗäšˆå°ąå¯šæ•´ä¸Ēįģ gzip 压įŧŠįš„ä¸ģäŊ“čŋ›čĄŒ MD5 莥įŽ—。

åĒ’äŊ“įąģ型īŧˆMIME Typeīŧ‰å’Œå­—įŦĻ集

Content-Type éĻ–部字æŽĩč¯´æ˜Žäē†åŽžäŊ“ä¸ģäŊ“įš„ MIME įąģ型。6MIME įąģ型是标准化įš„ 名字īŧŒį”¨äģĨč¯´æ˜ŽäŊœä¸ēč´§į‰ŠčŋčŊŊ厞äŊ“įš„åŸēæœŦåĒ’äŊ“įąģ型(比åĻ‚īŧšHTML 文äģļ、Microsoft Word 文æĄŖ或是 MPEG 视éĸ‘į­‰)。åŽĸæˆˇįĢ¯åē”į”¨į¨‹åēäŊŋį”¨ MIME įąģ型æĨč§Ŗ释和处į†å…ļ内厚。

Content-Type éĻ–éƒ¨č¯´æ˜Žįš„是原始厞äŊ“ä¸ģäŊ“įš„åĒ’äŊ“įąģ型。䞋åĻ‚īŧŒ åĻ‚果厞äŊ“įģčŋ‡å†…厚įŧ–į įš„č¯īŧŒContent-Type éĻ–éƒ¨č¯´æ˜Žįš„äģæ˜¯įŧ–į äš‹å‰įš„厞äŊ“ä¸ģäŊ“įš„įąģ型。

Content-Type éĻ–部čŋ˜æ”¯æŒå¯é€‰įš„参数æĨčŋ›ä¸€æ­Ĩč¯´æ˜Žå†…åŽšįš„įąģ型。charset(字įŦĻ集)å‚æ•°å°ąæ˜¯ä¸Ē䞋子īŧŒåŽƒč¯´æ˜ŽæŠŠåŽžäŊ“中įš„比į‰ščŊŦæĸä¸ē文æœŦ文äģļ中įš„å­—įŦĻįš„æ–šæŗ•:

Content-Type: text/html; charset=iso-8859-4

MIME 中įš„ multipart(多部分)į”ĩ子邎äģļæŠĨ文中包åĢ多ä¸ĒæŠĨ文īŧŒåŽƒäģŦ合在一čĩˇäŊœ ä¸ē单一įš„复杂æŠĨ文发送。每一部分éƒŊ是į‹ŦįĢ‹įš„īŧŒæœ‰å„č‡Ēįš„描čŋ°å…ļ内厚įš„集;不同įš„ 部分䚋间į”¨åˆ†į•Œå­—įŦĻ串čŋžæŽĨ在一čĩˇã€‚

HTTP 䚟支持多部分ä¸ģäŊ“。不čŋ‡īŧŒé€šå¸¸åĒį”¨åœ¨ä¸‹åˆ—两į§æƒ…åŊĸ之一īŧšæäē¤åĄĢ写åĨŊįš„襨æ ŧīŧŒæˆ–是äŊœä¸ēæ‰ŋčŊŊč‹Ĩåš˛æ–‡æĄŖį‰‡æŽĩįš„čŒƒå›´å“åē”。

内厚įŧ–į īŧˆContent-Encodingīŧ‰

内厚įŧ–į īŧŒæ˜¯å¯šæŠĨ文įš„ä¸ģäŊ“čŋ›čĄŒįš„可逆变æĸ。内厚įŧ–į æ˜¯å’Œå†…厚įš„å…ˇäŊ“æ ŧåŧįģ†čŠ‚į´§å¯†į›¸å…ŗįš„。䞋åĻ‚īŧŒäŊ å¯čƒŊäŧšį”¨ gzip 压įŧŠæ–‡æœŦ文äģļīŧŒäŊ†ä¸æ˜¯ JPEG 文 äģļīŧŒå› ä¸ē JPEG čŋ™įąģ东čĨŋį”¨ gzip 压įŧŠįš„不够åĨŊ。

HTTP 厚䚉äē†ä¸€äē›æ ‡å‡†įš„内厚įŧ–į įąģ型īŧŒåšļå…čŽ¸į”¨æ‰Šåą•įŧ–į įš„åŊĸåŧåĸžæˇģ更多įš„įŧ–į ã€‚ į”ą äē’联įŊ‘åˇį åˆ†é…æœē构(IANA)寚各į§įŧ–į čŋ›čĄŒæ ‡å‡†åŒ–īŧŒåŽƒįģ™æ¯ä¸Ē内厚įŧ–į įŽ—æŗ•åˆ†é…äē†å”¯ä¸€įš„äģŖåˇã€‚Content-Encoding éĻ–éƒ¨å°ąį”¨čŋ™äē›æ ‡å‡†åŒ–įš„äģŖåˇæĨč¯´æ˜Žįŧ–į æ—ļäŊŋ į”¨įš„įŽ—æŗ•ã€‚

  • gzipīŧščĄ¨æ˜ŽåŽžäŊ“采į”¨ GNU zip įŧ–į 
  • compressīŧščĄ¨æ˜ŽåŽžäŊ“采į”¨ Unix įš„æ–‡äģļ压įŧŠį¨‹åē
  • deflateīŧščĄ¨æ˜ŽåŽžäŊ“是į”¨ zlib įš„æ ŧåŧåŽ‹įŧŠįš„
  • identityīŧščĄ¨æ˜Žæ˛Ąæœ‰å¯šåŽžäŊ“čŋ›čĄŒįŧ–į ã€‚åŊ“æ˛Ąæœ‰ Content-Encoding éĻ–部æ—ļīŧŒå°ąéģ˜čŽ¤ä¸ēčŋ™į§æƒ…å†ĩ。

Accept-EncodingéĻ–部

æ¯Ģ无į–‘é—ŽīŧŒæˆ‘äģŦä¸å¸Œæœ›æœåŠĄå™¨į”¨åŽĸæˆˇįĢ¯æ— æŗ•č§Ŗį įš„æ–šåŧæĨ寚内厚čŋ›čĄŒįŧ–į ã€‚ä¸ēäē†éŋå…æœåŠĄå™¨äŊŋį”¨åŽĸæˆˇįĢ¯ä¸æ”¯æŒįš„įŧ–į æ–šåŧīŧŒåŽĸæˆˇįĢ¯å°ąæŠŠč‡Ēåˇąæ”¯æŒįš„内厚įŧ–į æ–šåŧåˆ—čĄ¨æ”žåœ¨č¯ˇæą‚įš„ Accept-Encoding éĻ–部里发å‡ēåŽģ。

åĻ‚æžœ HTTP č¯ˇæą‚ä¸­æ˛Ąæœ‰åŒ…åĢ Accept-Encoding éĻ–部īŧŒæœåŠĄå™¨å°ąå¯äģĨå‡čŽžåŽĸæˆˇįĢ¯čƒŊ够æŽĨ受äģģäŊ•įŧ–į æ–šåŧ(į­‰äģˇ äēŽå‘送 Accept-Encoding: *)。

åŽĸæˆˇįĢ¯å¯äģĨįģ™æ¯į§įŧ–į é™„å¸Ļ Q(质量)å€ŧ参数æĨč¯´æ˜Žįŧ–į įš„äŧ˜å…ˆįē§ã€‚Q å€ŧįš„čŒƒå›´äģŽ0.0 到 1.0īŧŒ0.0 č¯´æ˜ŽåŽĸæˆˇįĢ¯ä¸æƒŗæŽĨå—æ‰€č¯´æ˜Žįš„įŧ–į īŧŒ1.0 åˆ™čĄ¨æ˜Žæœ€å¸Œæœ›äŊŋį”¨įš„įŧ–į ã€‚ “*”表į¤ē“äģģäŊ•å…ļäģ–æ–šæŗ•â€ã€‚å†ŗ厚在响åē”中回送äģ€äšˆå†…厚įģ™åŽĸæˆˇįĢ¯æ˜¯ä¸Ē更通į”¨įš„čŋ‡į¨‹īŧŒč€Œé€‰æ‹ŠäŊŋį”¨äŊ•į§å†…厚įŧ–į åˆ™æ˜¯æ­¤čŋ‡į¨‹įš„一部分。

compress;q=0.5, gzip;q=1.0 gzip;q=1.0, identity; q=0.5, *;q=0

äŧ čž“įŧ–į īŧˆTransfer Codingsīŧ‰

äŧ čž“įŧ–į 

äŧ čž“įŧ–į äšŸæ˜¯äŊœį”¨åœ¨åŽžäŊ“ä¸ģäŊ“上įš„可逆变æĸīŧŒäŊ†äŊŋį”¨åŽƒäģŦ是į”ąäēŽæžļæž„æ–šéĸįš„原因īŧŒåŒå†…厚įš„æ ŧåŧæ— å…ŗ。äŊŋį”¨äŧ čž“įŧ–į æ˜¯ä¸ēäē†æ”šå˜ æŠĨ文中įš„数捎在įŊ‘įģœä¸Šäŧ čž“įš„æ–šåŧã€‚

Transfer-EncodingéĻ–部

HTTP åčŽŽä¸­åĒ厚䚉äē†ä¸‹éĸ两ä¸ĒéĻ–部æĨ描čŋ°å’ŒæŽ§åˆļäŧ čž“įŧ–į ã€‚

  • Transfer-Encoding 告įŸĨæŽĨæ”ļæ–šä¸ēäē†å¯é åœ°äŧ čž“æŠĨ文īŧŒåˇ˛įģå¯šå…ļčŋ›čĄŒäē†äŊ•į§įŧ–į ã€‚
  • TE į”¨åœ¨č¯ˇæą‚éĻ–部中īŧŒå‘ŠįŸĨæœåŠĄå™¨å¯äģĨäŊŋį”¨å“Ēäē›äŧ čž“įŧ–į æ‰Šåą•ã€‚

下éĸįš„䞋子中īŧŒč¯ˇæą‚äŊŋį”¨äē† TE éĻ–部æĨå‘Šč¯‰æœåŠĄå™¨åŽƒå¯äģĨæŽĨ受分块įŧ–į (åĻ‚果是 HTTP/1.1 åē”į”¨į¨‹åēįš„č¯īŧŒčŋ™å°ąæ˜¯åŋ…éĄģįš„)åšļ且æ„ŋ意æŽĨ受附在分块įŧ–į įš„æŠĨ文įģ“尞上 įš„拖挂:

GET /new_products.html HTTP/1.1
Host: www.joes-hardware.com
User-Agent: Mozilla/4.61 [en] (WinNT; I) TE: trailers, chunked
...

寚厃įš„响åē”中包åĢ Transfer-Encoding éĻ–部īŧŒį”¨äēŽå‘Šč¯‰æŽĨæ”ļæ–šåˇ˛įģį”¨åˆ†å—įŧ–į å¯š æŠĨ文čŋ›čĄŒäē†äŧ čž“įŧ–į :

HTTP/1.1 200 OK Transfer-Encoding: chunked Server: Apache/3.0
...

在čŋ™ä¸Ēčĩˇå§‹éĻ–部䚋后īŧŒæŠĨ文įš„įģ“æž„å°ąå°†å‘į”Ÿæ”šå˜ã€‚

äŧ čž“įŧ–į įš„å€ŧéƒŊ是大小写无å…ŗįš„。HTTP/1.1 č§„åŽšåœ¨ TE éĻ–部和 Transfer-Encoding éĻ–部中äŊŋį”¨äŧ čž“įŧ–į å€ŧ。最新įš„ HTTP 规范åĒ厚䚉äē†ä¸€į§äŧ čž“įŧ–į īŧŒå°ąæ˜¯åˆ†å—įŧ–į ã€‚

分块įŧ–į 

分块įŧ–į æŠŠæŠĨæ–‡åˆ†å‰˛ä¸ēč‹Ĩåš˛ä¸Ēå¤§å°åˇ˛įŸĨįš„块。块䚋间是į´§æŒ¨į€å‘送įš„īŧŒčŋ™æ ˇå°ąä¸éœ€čĻåœ¨å‘送䚋前įŸĨ道整ä¸ĒæŠĨ文įš„大小äē†ã€‚

čĻæŗ¨æ„įš„是īŧŒåˆ†å—įŧ–į æ˜¯ä¸€į§äŧ čž“įŧ–į īŧŒå› æ­¤æ˜¯æŠĨ文įš„åąžæ€§īŧŒč€Œä¸æ˜¯ä¸ģäŊ“įš„åąžæ€§ã€‚

分块与持䚅čŋžæŽĨ

č‹ĨåŽĸæˆˇįĢ¯å’ŒæœåŠĄå™¨äš‹é—´ä¸æ˜¯æŒäš…čŋžæŽĨīŧŒåŽĸæˆˇįĢ¯å°ąä¸éœ€čĻįŸĨ道厃æ­Ŗ在č¯ģ取įš„ä¸ģäŊ“įš„é•ŋåēĻīŧŒč€ŒåĒ需čĻč¯ģåˆ°æœåŠĄå™¨å…ŗ闭ä¸ģäŊ“čŋžæŽĨä¸ēæ­ĸ。

åŊ“äŊŋį”¨æŒäš…čŋžæŽĨæ—ļīŧŒåœ¨æœåŠĄå™¨å†™ä¸ģäŊ“䚋前īŧŒåŋ…éĄģįŸĨ道厃įš„大小åšļ在 Content- Length éĻ–部中发送。åĻ‚æžœæœåŠĄå™¨åŠ¨æ€åˆ›åģē内厚īŧŒå°ąå¯čƒŊ在发送䚋前无æŗ•įŸĨ道ä¸ģäŊ“įš„é•ŋåēĻ。

分块įŧ–į ä¸ēčŋ™į§å›°éšžæäž›äē†č§Ŗå†ŗæ–šæĄˆīŧŒåĒčĻå…čŽ¸æœåŠĄå™¨æŠŠä¸ģäŊ“逐块发送īŧŒč¯´æ˜Žæ¯å—įš„å¤§å°å°ąå¯äģĨäē†ã€‚å› ä¸ēä¸ģäŊ“是动态创åģēįš„īŧŒæœåŠĄå™¨å¯äģĨįŧ“å†˛åŽƒįš„一部分īŧŒå‘送å…ļ大小和į›¸åē”įš„块īŧŒį„ļ后在ä¸ģäŊ“发送厌䚋前重复čŋ™ä¸Ēčŋ‡į¨‹ã€‚æœåŠĄå™¨å¯äģĨį”¨å¤§å°ä¸ē 0 įš„块äŊœä¸ēä¸ģäŊ“įģ“束įš„äŋĄåˇīŧŒčŋ™æ ˇå°ąå¯äģĨįģ§įģ­äŋæŒčŋžæŽĨīŧŒä¸ē下一ä¸Ē响åē”做准备。

åŽĸæˆˇįĢ¯äšŸå¯äģĨ发送分块įš„数捎įģ™æœåŠĄå™¨ã€‚å› ä¸ēåŽĸæˆˇįĢ¯äē‹å…ˆä¸įŸĨé“æœåŠĄå™¨æ˜¯åĻæŽĨ受分块įŧ–į (čŋ™æ˜¯å› ä¸ēæœåŠĄå™¨ä¸äŧšåœ¨įģ™åŽĸæˆˇįĢ¯įš„响åē”中发送 TE éĻ–部)īŧŒæ‰€äģĨåŽĸæˆˇįĢ¯åŋ…éĄģ做åĨŊæœåŠĄå™¨į”¨411 Length Required(需čĻContent-LengthéĻ–部)响åē”æĨ拒įģåˆ†å—č¯ˇæą‚įš„准备。

分块æŠĨ文įš„拖挂

åĻ‚æžœåŽĸæˆˇįĢ¯įš„ TE éĻ–éƒ¨ä¸­č¯´æ˜ŽåŽƒå¯äģĨæŽĨ受拖挂įš„č¯īŧŒå°ąå¯äģĨ在分块įš„æŠĨ文最后加上拖挂。äē§į”ŸåŽŸå§‹å“åē”įš„æœåŠĄå™¨äšŸå¯äģĨ在分块įš„æŠĨ文最后加上拖挂。拖挂įš„内厚是可选įš„元数捎īŧŒåŽĸæˆˇįĢ¯ä¸ä¸€åŽšéœ€čĻį†č§Ŗ和äŊŋį”¨(åŽĸæˆˇįĢ¯å¯äģĨåŋŊį•Ĩåšļä¸ĸåŧƒæ‹–挂中įš„内厚)。

拖挂中可äģĨ包åĢ附å¸Ļįš„éĻ–部字æŽĩīŧŒåŽƒäģŦįš„å€ŧ在æŠĨ文åŧ€å§‹įš„æ—ļ候可čƒŊ是无æŗ•įĄŽåŽšįš„ (例åĻ‚īŧŒåŋ…éĄģčĻå…ˆį”Ÿæˆä¸ģäŊ“įš„内厚)。Content-MD5 éĻ–éƒ¨å°ąæ˜¯ä¸€ä¸Ē可äģĨ在拖挂中发送įš„éĻ–部īŧŒå› ä¸ē在文æĄŖį”Ÿæˆäš‹å‰īŧŒåžˆéšžįŽ—å‡ē厃įš„ MD5。

除äē† Transfer-Encoding、Trailer äģĨ及 Content-Length éĻ–部䚋外īŧŒå…ļäģ– HTTP éĻ–部éƒŊ可äģĨäŊœä¸ē拖挂发送。

éĒŒč¯į å’Œæ–°é˛œåēĻ

åŊ“æ–‡æĄŖ在åŽĸæˆˇįĢ¯â€œčŋ‡æœŸâ€äš‹åŽ(äšŸå°ąæ˜¯č¯´īŧŒåŽĸæˆˇįĢ¯ä¸å†čŽ¤ä¸ēč¯Ĩ副æœŦ有效)īŧŒåŽĸæˆˇįĢ¯åŋ…éĄģäģŽæœåŠĄå™¨č¯ˇæą‚一äģŊ新įš„副æœŦ。不čŋ‡īŧŒåĻ‚æžœč¯Ĩ文æĄŖåœ¨æœåŠĄå™¨ä¸ŠåšļæœĒ发į”Ÿæ”šå˜īŧŒåŽĸæˆˇ įĢ¯äšŸå°ąä¸éœ€čĻå†æŽĨæ”ļ一æŦĄäē†â€”—įģ§įģ­äŊŋį”¨įŧ“å­˜įš„副æœŦåŗ可。

čŋ™į§į‰šæŽŠįš„č¯ˇæą‚īŧŒį§°ä¸ē æĄäģļč¯ˇæą‚(conditional request)īŧŒčĻæą‚åŽĸæˆˇįĢ¯äŊŋį”¨ éĒŒč¯į  (validator) æĨ告įŸĨæœåŠĄå™¨åŽƒåŊ“前æ‹Ĩ有įš„į‰ˆæœŦåˇīŧŒåšļäģ…åŊ“厃įš„åŊ“前副æœŦ不再有效æ—ļ才čĻæą‚发送新įš„副æœŦ。

æ–°é˛œåēĻ

æœåŠĄå™¨åē”åŊ“å‘ŠįŸĨåŽĸæˆˇįĢ¯čƒŊ够将内厚įŧ“存多é•ŋæ—ļ间īŧŒåœ¨čŋ™ä¸Ēæ—ļé—´äš‹å†…å°ąæ˜¯æ–°é˛œįš„。 æœåŠĄå™¨å¯äģĨį”¨čŋ™ä¸¤ä¸ĒéĻ–部䚋一æĨ提䞛čŋ™į§äŋĄæ¯: Expires(čŋ‡æœŸ) 和 Cache- Control(įŧ“存控åˆļ)。

åŽĸæˆˇįĢ¯å’ŒæœåŠĄå™¨ä¸ēäē†čƒŊæ­ŖįĄŽäŊŋį”¨ Expires éĻ–部īŧŒåŽƒäģŦįš„æ—ļ钟åŋ…éĄģ同æ­Ĩ。

æĄäģļč¯ˇæą‚(Conditional Requests)

HTTP ä¸ēåŽĸæˆˇįĢ¯æäž›äē†ä¸€į§æ–šæŗ•īŧŒäģ…åŊ“čĩ„æēæ”šå˜æ—ļæ‰č¯ˇæą‚å‰¯æœŦīŧŒ čŋ™į§į‰šæŽŠč¯ˇæą‚į§°ä¸ēæœ‰æĄäģļįš„č¯ˇæą‚ã€‚æœ‰æĄäģļįš„č¯ˇæą‚æ˜¯æ ‡å‡†įš„ HTTP č¯ˇæą‚æŠĨ文īŧŒäŊ†äģ…åŊ“某ä¸Ēį‰šåŽšæĄäģļä¸ēįœŸæ—ļæ‰æ‰§čĄŒã€‚

例åĻ‚īŧŒæŸä¸Ēįŧ“å­˜æœåŠĄå™¨å¯čƒŊ发送下éĸįš„æœ‰æĄäģļ GET æŠĨ文įģ™æœåŠĄå™¨īŧŒäģ…åŊ“æ–‡äģļ /announce.html äģŽ 2002 åš´ 6 月 29 æ—Ĩ(čŋ™æ˜¯įŧ“å­˜įš„æ–‡æĄŖ最后 čĸĢäŊœč€…äŋŽæ”šįš„æ—ļ间)䚋后发į”Ÿæ”šå˜įš„情å†ĩ下才发送厃:

GET /announce.html HTTP/1.0
If-Modified-Since: Sat, 29 Jun 2002, 14:30:00 GMT

æœ‰æĄäģļįš„č¯ˇæą‚æ˜¯é€ščŋ‡äģĨ“If-”åŧ€å¤´įš„æœ‰æĄäģļįš„éĻ–部æĨ厞įŽ°įš„。

éĒŒč¯į 

每ä¸Ēæœ‰æĄäģļįš„č¯ˇæą‚éƒŊ通čŋ‡į‰šåŽšįš„éĒŒč¯į æĨ发æŒĨäŊœį”¨ã€‚éĒŒč¯į æ˜¯æ–‡æĄŖ厞䞋įš„一ä¸Ēį‰šæŽŠåąžæ€§īŧŒį”¨åŽƒæĨæĩ‹č¯•æĄäģļ是åĻä¸ēįœŸã€‚äģŽæĻ‚åŋĩä¸Šč¯´īŧŒäŊ å¯äģĨ把éĒŒč¯į įœ‹äŊœæ–‡äģļįš„åēåˆ—åˇã€ į‰ˆæœŦåˇīŧŒæˆ–č€…æœ€åŽå‘į”Ÿæ”šå˜įš„æ—Ĩ期æ—ļ间。

HTTP把éĒŒč¯į åˆ†ä¸ē两įąģīŧšåŧąéĒŒč¯į (weak validators)和 åŧēéĒŒč¯į (strong validators)。 åŧąéĒŒč¯į ä¸ä¸€åŽščƒŊå”¯ä¸€æ ‡č¯†čĩ„æēįš„一ä¸Ē厞䞋īŧŒč€ŒåŧēéĒŒč¯į åŋ…éĄģåĻ‚此。

最后äŋŽæ”šæ—ļ间īŧˆIf-Modified-Sinceīŧ‰čĸĢåŊ“äŊœåŧąéĒŒč¯į īŧŒå› ä¸ēå°ŊįŽĄåŽƒč¯´æ˜Žäē†čĩ„æēæœ€åŽčĸĢäŋŽæ”šįš„æ—ļ间īŧŒäŊ†åŽƒįš„描čŋ°į˛žåēĻæœ€å¤§å°ąæ˜¯ 1 į§’。

ETag éĻ–部čĸĢåŊ“äŊœåŧēéĒŒč¯į īŧŒå› ä¸ē每åŊ“čĩ„æēå†…厚攚变æ—ļīŧŒæœåŠĄå™¨éƒŊ可äģĨ在 ETag éĻ–部攞įŊŽä¸åŒįš„å€ŧ。

有æ—ļ候īŧŒåŽĸæˆˇįĢ¯å’ŒæœåŠĄå™¨å¯čƒŊ需čĻé‡‡į”¨ä¸é‚Ŗ䚈į˛žįĄŽįš„厞äŊ“æ ‡čŽ°éĒŒč¯æ–šæŗ•ã€‚äž‹åĻ‚īŧŒæŸæœåŠĄå™¨å¯čƒŊæƒŗ寚一ä¸Ē垈大、čĸĢåšŋæŗ›įŧ“å­˜įš„æ–‡æĄŖčŋ›čĄŒä¸€äē›įžŽåŒ–äŋŽéĨ°īŧŒäŊ†ä¸æƒŗ在įŧ“å­˜æœåŠĄå™¨å†éĒŒč¯æ—ļäē§į”Ÿåžˆå¤§įš„äŧ čž“æĩé‡ã€‚在čŋ™į§æƒ…å†ĩ下īŧŒč¯ĨæœåŠĄå™¨å¯äģĨåœ¨æ ‡čŽ°å‰éĸ加上“W/”前įŧ€æĨåšŋ播一ä¸Ē“åŧąâ€åŽžäŊ“æ ‡čŽ°ã€‚

čŒƒå›´č¯ˇæą‚īŧˆRange Requestsīŧ‰

å…ŗäēŽåŽĸæˆˇįĢ¯åĻ‚äŊ•čĻæą‚æœåŠĄå™¨åĒ在čĩ„æēįš„åŽĸæˆˇįĢ¯å‰¯æœŦ不再有效įš„情å†ĩ下才发送å…ļ副æœŦīŧŒ 我äģŦåˇ˛įģæ¸…æĨšåœ°į†č§Ŗäē†ã€‚HTTP čŋ˜čŋ›ä¸€æ­Ĩé”Ļ上æˇģ花īŧšåŽƒå…čŽ¸åŽĸæˆˇįĢ¯åŽžé™…上åĒč¯ˇæą‚æ–‡ æĄŖįš„一部分īŧŒæˆ–č€…č¯´æŸä¸ĒčŒƒå›´ã€‚

有äē†čŒƒå›´č¯ˇæą‚īŧŒHTTP åŽĸæˆˇįĢ¯å¯äģĨ通čŋ‡č¯ˇæą‚æ›žčŽˇå–å¤ąč´Ĩįš„厞äŊ“įš„一ä¸ĒčŒƒå›´(æˆ–č€…č¯´ä¸€éƒ¨åˆ†)īŧŒæĨæĸ复下čŊŊč¯Ĩ厞äŊ“。åŊ“į„ļčŋ™æœ‰ä¸€ä¸Ē前提īŧŒé‚Ŗå°ąæ˜¯äģŽåŽĸæˆˇįĢ¯ä¸Šä¸€æŦĄč¯ˇæą‚č¯Ĩ厞 äŊ“到čŋ™æŦĄå‘å‡ēčŒƒå›´č¯ˇæą‚įš„æ—ļæŽĩ内īŧŒč¯Ĩå¯ščąĄæ˛Ąæœ‰æ”šå˜čŋ‡ã€‚äž‹åĻ‚:

GET /bigfile.html HTTP/1.1
Host: www.joes-hardware.com
Range: bytes=4000-
User-Agent: Mozilla/4.61 [en] (WinNT; I) ...

在æœŦ例中īŧŒåŽĸæˆˇįĢ¯č¯ˇæą‚įš„是文æĄŖåŧ€å¤´ 4000 å­—čŠ‚äš‹åŽįš„部分(不åŋ…įģ™å‡ēįģ“å°žå­—čŠ‚æ•°īŧŒ 因ä¸ēč¯ˇæą‚æ–šå¯čƒŊ不įŸĨ道文æĄŖįš„大小)。在åŽĸæˆˇįĢ¯æ”ļ到äē†åŧ€å¤´įš„ 4000 å­—čŠ‚äš‹åŽå°ąå¤ąč´Ĩįš„情å†ĩ下īŧŒå¯äģĨäŊŋį”¨čŋ™į§åŊĸåŧįš„čŒƒå›´č¯ˇæą‚ã€‚

åšļä¸æ˜¯æ‰€æœ‰æœåŠĄå™¨éƒŊæŽĨå—čŒƒå›´č¯ˇæą‚īŧŒäŊ†åžˆå¤šæœåŠĄå™¨å¯äģĨã€‚æœåŠĄå™¨å¯äģĨ通čŋ‡åœ¨å“åē”中包åĢ Accept-Ranges éĻ–部įš„åŊĸåŧå‘åŽĸæˆˇįĢ¯č¯´æ˜Žå¯äģĨæŽĨ受įš„čŒƒå›´č¯ˇæą‚ã€‚čŋ™ä¸ĒéĻ–部įš„å€ŧæ˜¯čŽĄįŽ—čŒƒå›´įš„单äŊīŧŒé€šå¸¸æ˜¯äģĨå­—čŠ‚čŽĄįŽ—įš„。䞋åĻ‚īŧš

HTTP/1.1 200 OK
Date: Fri, 05 Nov 1999 22:35:15 GMT Server: Apache/1.2.4
Accept-Ranges: bytes

æļ‰åŠčŒƒå›´č¯ˇæą‚įš„一įŗģ列 HTTP äē‹åŠĄįš„䞋子īŧš image

Range éĻ–部在æĩčĄŒįš„ į‚šå¯šį‚š(Peer-to-PeerīŧŒP2P) 文äģļå…ąäēĢåŽĸæˆˇįĢ¯čŊ¯äģļ中垗到åšŋæŗ›åē”į”¨īŧŒåŽƒäģŦäģŽä¸åŒįš„寚į­‰åŽžäŊ“同æ—ļ下čŊŊ多åĒ’äŊ“æ–‡äģļįš„不同部分。

åˇŽåŧ‚įŧ–į īŧˆDelta encodingīŧ‰

åĻ‚æžœåŽĸæˆˇįĢ¯æœ‰ä¸€ä¸ĒéĄĩéĸįš„åˇ˛čŋ‡æœŸå‰¯æœŦīŧŒå°ąčĻč¯ˇæą‚éĄĩéĸįš„最新厞䞋。č‹Ĩ攚变įš„åœ°æ–šæ¯”čžƒå°‘īŧŒä¸Žå…ļ发送厌整įš„æ–°éĄĩéĸįģ™åŽĸæˆˇįĢ¯īŧŒåŽĸæˆˇįĢ¯æ›´æ„ŋæ„æœåŠĄå™¨åĒ发送éĄĩéĸ发į”Ÿæ”šå˜įš„部分īŧŒčŋ™æ ˇå°ąå¯äģĨ更åŋĢ地垗到最新įš„éĄĩéĸ。

åˇŽåŧ‚įŧ–į æ˜¯ HTTP åčŽŽįš„一ä¸Ēæ‰Šåą•īŧŒåŽƒé€ščŋ‡äē¤æĸå¯ščąĄæ”šå˜įš„éƒ¨åˆ†č€Œä¸æ˜¯åŽŒæ•´įš„å¯ščąĄæĨäŧ˜åŒ–äŧ čž“性čƒŊã€‚åˇŽåŧ‚įŧ–į äšŸæ˜¯ä¸€įąģ厞䞋操控īŧŒå› ä¸ē厃䞝čĩ–åŽĸæˆˇįĢ¯å’ŒæœåŠĄå™¨äš‹é—´é’ˆå¯šį‰šåŽšįš„å¯ščąĄåŽžäž‹æĨäē¤æĸäŋĄæ¯ã€‚RFC 3229 描čŋ°äē†åˇŽåŧ‚įŧ–į ã€‚

åĻ‚æžœåŽĸæˆˇįĢ¯æƒŗå‘Šč¯‰æœåŠĄå™¨åŽƒæ„ŋ意æŽĨ受č¯ĨéĄĩéĸįš„åˇŽåŧ‚īŧŒåĒčĻå‘送 A-IM éĻ–部 å°ąå¯äģĨäē†ã€‚A-IM 是 Accept-Instance-Manipulation(æŽĨ受厞䞋操控) įš„įŧŠå†™ã€‚

在 A-IM éĻ–部中īŧŒåŽĸæˆˇįĢ¯äŧšč¯´æ˜ŽåŽƒįŸĨ道å“Ēäē›įŽ—æŗ•å¯äģĨæŠŠåˇŽåŧ‚åē”į”¨äēŽč€į‰ˆæœŦč€Œåž—åˆ°æœ€æ–°į‰ˆæœŦ。

æœåŠĄįĢ¯å‘送回下éĸčŋ™äē›å†…厚īŧšä¸€ä¸Ēį‰šæŽŠįš„响åē”äģŖį â€”— 226 IM UsedīŧŒå‘ŠįŸĨåŽĸæˆˇįĢ¯åŽƒæ­Ŗ在发送įš„æ˜¯æ‰€č¯ˇæą‚å¯ščąĄįš„厞䞋操控īŧŒč€Œä¸æ˜¯é‚Ŗä¸Ē厌整įš„å¯ščąĄč‡ĒčēĢīŧ›ä¸€ä¸Ē IM(Instance-Manipulation įš„įŧŠå†™) éĻ–部īŧŒč¯´æ˜Žį”¨äēŽčŽĄįŽ—åˇŽåŧ‚įš„įŽ—æŗ•īŧ›æ–°įš„ ETag éĻ–部 和 Delta-Base éĻ–部īŧŒč¯´æ˜Žį”¨äēŽčŽĄįŽ—åˇŽåŧ‚įš„åŸēįēŋ文æĄŖįš„ ETag。

image

æœåŠĄå™¨äž§įš„â€œåˇŽåŧ‚į”Ÿæˆå™¨â€æ šæŽåŸēįēŋ文æĄŖ和č¯Ĩ文æĄŖįš„最新厞䞋īŧŒį”¨åŽĸæˆˇįĢ¯åœ¨ A-IM éĻ–部中指明įš„įŽ—æŗ•čŽĄįŽ—厃äģŦ之间įš„åˇŽåŧ‚。åŽĸæˆˇįĢ¯äž§įš„â€œåˇŽåŧ‚åē”į”¨å™¨â€ åž—åˆ°åˇŽåŧ‚īŧŒå°†å…ļåē”į”¨äēŽåŸēįēŋ文æĄŖīŧŒåž—到文æĄŖįš„最新厞䞋。䞋åĻ‚īŧŒåĻ‚æžœäē§į”ŸåˇŽåŧ‚įš„įŽ— æŗ•æ˜¯ Unix įŗģįģŸįš„ diff-e å‘Ŋäģ¤īŧŒåŽĸæˆˇįĢ¯å°ąå¯äģĨį”¨ Unix įŗģįģŸä¸­įš„æ–‡æœŦįŧ–čž‘å™¨ ed 提䞛įš„ 功čƒŊæĨåē”į”¨åˇŽåŧ‚。

åˇŽåŧ‚įŧ–į æ‰€į”¨įš„éĻ–部

ETag

文æĄŖ每ä¸Ē厞䞋įš„å”¯ä¸€æ ‡č¯†įŦĻ。į”ąæœåŠĄå™¨åœ¨å“åē”中发送;åŽĸæˆˇįĢ¯åœ¨åŽįģ§č¯ˇæą‚įš„ If-Match éĻ–部和 If-None-Match éĻ–部中可äģĨäŊŋį”¨åŽƒ

If-None-Match

åŽĸæˆˇįĢ¯å‘送įš„č¯ˇæą‚éĻ–部īŧŒåŊ“且äģ…åŊ“åŽĸæˆˇįĢ¯įš„æ–‡æĄŖį‰ˆæœŦä¸ŽæœåŠĄå™¨ä¸åŒæ—ļīŧŒæ‰å‘æœåŠĄå™¨č¯ˇæą‚č¯Ĩ文æĄŖ

A-IM

åŽĸæˆˇįĢ¯č¯ˇæą‚éĻ–部īŧŒč¯´æ˜Žå¯äģĨæŽĨ受įš„厞䞋操控įąģ型

IM

æœåŠĄå™¨å“åē”éĻ–部īŧŒč¯´æ˜ŽäŊœį”¨åœ¨å“åē”上įš„厞䞋操控įš„įąģ型。åŊ“响åē”äģŖį æ˜¯226 IM Used æ—ļīŧŒäŧšå‘送čŋ™ä¸ĒéĻ–部

Delta-Base

æœåŠĄå™¨å“åē”éĻ–部īŧŒč¯´æ˜Žį”¨äēŽčŽĄįŽ—åˇŽåŧ‚įš„åŸēįēŋ文æĄŖįš„ ETag å€ŧ(åē”åŊ“与åŽĸæˆˇįĢ¯č¯ˇæą‚ 中įš„ If-None-Match éĻ–部里įš„ ETag į›¸åŒ)

å‚č€ƒ

Pines-Cheng avatar Apr 11 '18 02:04 Pines-Cheng

给力,如果能有实际项目的抓包和代理就好了

fegg avatar Apr 16 '18 06:04 fegg