åå¼å§åè¿ç¯æç« è¿æ¯æºçº ç»çï¼å 为ç½ä¸æç´¢âä»è¾å ¥urlå°é¡µé¢å±ç¤ºå°åºåçäºä»ä¹âï¼ä½ å¯ä»¥æå°ä¸å¤§å çèµæãèä¸é¢è¯è¿éé¢åºæ¬æ¯å¿ èé¢ï¼äºæ份é¢è¯çæ¶åï¼è½ç¶ç¥éè¿ä¸ªè¿ç¨åçäºä»ä¹ï¼ä¸è¿å½é¢è¯å®ä¸æ¥æ¥è¿½é®ä¸å»çï¼å¾å¤ç»èå°±ä¸å¤ªæ¸ æ¥äºã
ããæè¿å好ä¹å¨çhttpåè®®ç¸å ³çä¸è¥¿ï¼æ以æ³å¯¹è¿ä¸ªè¯é¢æ¥ä¸ªæ·±å ¥çæ»ç»ï¼æ¬æçç®çæ¯éè¿è¾å ¥urlä¹ååççäºæ æ¥åç¥è¯çæ»ç»åæ©å±ãæ以æç« å¯è½ä¼å¾æã
  æ»çè¿ç¨å¤§æ¦å¦ä¸:
1ãè¾å ¥å°å
  å½æ们å¼å§å¨æµè§å¨ä¸è¾å ¥ç½åçæ¶åï¼æµè§å¨å ¶å®å°±å·²ç»å¨æºè½çå¹é å¯è½å¾ url äºï¼ä»ä¼ä»åå²è®°å½ï¼ä¹¦ç¾çå°æ¹ï¼æ¾å°å·²ç»è¾å ¥çå符串å¯è½å¯¹åºç urlï¼ç¶åç»åºæºè½æ示ï¼è®©ä½ å¯ä»¥è¡¥å ¨urlå°åã对äºÂ googleçchrome çæµè§å¨ï¼ä»çè³ä¼ç´æ¥ä»ç¼åä¸æç½é¡µå±ç¤ºåºæ¥ï¼å°±æ¯è¯´ï¼ä½ è¿æ²¡ææä¸ enterï¼é¡µé¢å°±åºæ¥äºã
2ãæµè§å¨æ¥æ¾ååç IP å°åãã
ãã1ã请æ±ä¸æ¦åèµ·ï¼æµè§å¨é¦å è¦åçäºæ å°±æ¯è§£æè¿ä¸ªååï¼ä¸è¬æ¥è¯´ï¼æµè§å¨ä¼é¦å æ¥çæ¬å°ç¡¬çç hosts æ件ï¼ççå ¶ä¸æ没æåè¿ä¸ªåå对åºçè§åï¼å¦ææçè¯å°±ç´æ¥ä½¿ç¨ hosts æ件éé¢ç ip å°åã
   2ãå¦æå¨æ¬å°ç hosts æ件没æè½å¤æ¾å°å¯¹åºç ip å°åï¼æµè§å¨ä¼ååºä¸ä¸ª DNS请æ±å°æ¬å°DNSæå¡å¨ ãæ¬å°DNSæå¡å¨ä¸è¬é½æ¯ä½ çç½ç»æ¥å ¥æå¡å¨åæä¾ï¼æ¯å¦ä¸å½çµä¿¡ï¼ä¸å½ç§»å¨ã
ã  3ãæ¥è¯¢ä½ è¾å ¥çç½åçDNS请æ±å°è¾¾æ¬å°DNSæå¡å¨ä¹åï¼æ¬å°DNSæå¡å¨ä¼é¦å æ¥è¯¢å®çç¼åè®°å½ï¼å¦æç¼åä¸ææ¤æ¡è®°å½ï¼å°±å¯ä»¥ç´æ¥è¿åç»æï¼æ¤è¿ç¨æ¯éå½çæ¹å¼è¿è¡æ¥è¯¢ãå¦æ没æï¼æ¬å°DNSæå¡å¨è¿è¦åDNSæ ¹æå¡å¨è¿è¡æ¥è¯¢ã
ãã4ãæ ¹DNSæå¡å¨æ²¡æè®°å½å ·ä½çåååIPå°åç对åºå ³ç³»ï¼èæ¯åè¯æ¬å°DNSæå¡å¨ï¼ä½ å¯ä»¥å°åæå¡å¨ä¸å»ç»§ç»æ¥è¯¢ï¼å¹¶ç»åºåæå¡å¨çå°åãè¿ç§è¿ç¨æ¯è¿ä»£çè¿ç¨ã
ãã5ãæ¬å°DNSæå¡å¨ç»§ç»ååæå¡å¨ååºè¯·æ±ï¼å¨è¿ä¸ªä¾åä¸ï¼è¯·æ±ç对象æ¯.comåæå¡å¨ã.comåæå¡å¨æ¶å°è¯·æ±ä¹åï¼ä¹ä¸ä¼ç´æ¥è¿ååååIPå°åç对åºå ³ç³»ï¼èæ¯åè¯æ¬å°DNSæå¡å¨ï¼ä½ çååç解ææå¡å¨çå°åã
ãã6ãæåï¼æ¬å°DNSæå¡å¨åååç解ææå¡å¨ååºè¯·æ±ï¼è¿æ¶å°±è½æ¶å°ä¸ä¸ªåååIPå°å对åºå ³ç³»ï¼æ¬å°DNSæå¡å¨ä¸ä» è¦æIPå°åè¿åç»ç¨æ·çµèï¼è¿è¦æè¿ä¸ªå¯¹åºå ³ç³»ä¿åå¨ç¼åä¸ï¼ä»¥å¤ä¸æ¬¡å«çç¨æ·æ¥è¯¢æ¶ï¼å¯ä»¥ç´æ¥è¿åç»æï¼å å¿«ç½ç»è®¿é®ã
Â
ä¸é¢è¿å¼ å¾å¾å®ç¾ç解éäºè¿ä¸è¿ç¨ï¼
ç¥è¯æ©å±ï¼
1)ä»ä¹æ¯DNSï¼
ããDNSï¼Domain Name Systemï¼ååç³»ç»ï¼ï¼å ç¹ç½ä¸ä½ä¸ºåååIPå°åç¸äºæ å°çä¸ä¸ªåå¸å¼æ°æ®åºï¼è½å¤ä½¿ç¨æ·æ´æ¹ä¾¿ç访é®äºèç½ï¼èä¸ç¨å»è®°ä½è½å¤è¢«æºå¨ç´æ¥è¯»åçIPæ°ä¸²ãéè¿ä¸»æºåï¼æç»å¾å°è¯¥ä¸»æºå对åºçIPå°åçè¿ç¨å«ååå解æï¼æ主æºå解æï¼ã
ããéä¿ç讲ï¼æ们æ´ä¹ æ¯äºè®°ä½ä¸ä¸ªç½ç«çååï¼æ¯å¦www.baidu.com,èä¸æ¯è®°ä½å®çipå°åï¼æ¯å¦ï¼167.23.10.2ãè计ç®æºæ´æ é¿è®°ä½ç½ç«çipå°åï¼èä¸æ¯åwww.baidu.comçé¾æ¥ãå 为ï¼DNSå°±ç¸å½äºä¸ä¸ªçµè¯æ¬ï¼æ¯å¦ä½ è¦æ¾www.baidu.comè¿ä¸ªååï¼é£æç¿»ä¸ç¿»æççµè¯æ¬ï¼æå°±ç¥éï¼å¦ï¼å®ççµè¯ï¼ipï¼æ¯167.23.10.2ã
Â
2)DNSæ¥è¯¢ç两ç§æ¹å¼ï¼éå½æ¥è¯¢åè¿ä»£æ¥è¯¢
1ãéå½è§£æ
  å½å±é¨DNSæå¡å¨èªå·±ä¸è½åç客æ·æºçDNSæ¥è¯¢æ¶ï¼å®å°±éè¦åå ¶ä»DNSæå¡å¨è¿è¡æ¥è¯¢ãæ¤æ¶æ两ç§æ¹å¼ï¼å¦å¾æ示çæ¯éå½æ¹å¼ãå±é¨DNSæå¡å¨èªå·±è´è´£åå ¶ä»DNSæå¡å¨è¿è¡æ¥è¯¢ï¼ä¸è¬æ¯å å该ååçæ ¹åæå¡å¨æ¥è¯¢ï¼åç±æ ¹ååæå¡å¨ä¸çº§çº§åä¸æ¥è¯¢ãæåå¾å°çæ¥è¯¢ç»æè¿åç»å±é¨DNSæå¡å¨ï¼åç±å±é¨DNSæå¡å¨è¿åç»å®¢æ·ç«¯ã
2ãè¿ä»£è§£æ
ããå½å±é¨DNSæå¡å¨èªå·±ä¸è½åç客æ·æºçDNSæ¥è¯¢æ¶ï¼ä¹å¯ä»¥éè¿è¿ä»£æ¥è¯¢çæ¹å¼è¿è¡è§£æï¼å¦å¾æ示ãå±é¨DNSæå¡å¨ä¸æ¯èªå·±åå ¶ä»DNSæå¡å¨è¿è¡æ¥è¯¢ï¼èæ¯æè½è§£æ该ååçå ¶ä»DNSæå¡å¨çIPå°åè¿åç»å®¢æ·ç«¯DNSç¨åºï¼å®¢æ·ç«¯DNSç¨åºå继ç»åè¿äºDNSæå¡å¨è¿è¡æ¥è¯¢ï¼ç´å°å¾å°æ¥è¯¢ç»æ为æ¢ãä¹å°±æ¯è¯´ï¼è¿ä»£è§£æåªæ¯å¸®ä½ æ¾å°ç¸å ³çæå¡å¨èå·²ï¼èä¸ä¼å¸®ä½ å»æ¥ãæ¯å¦è¯´ï¼baidu.comçæå¡å¨ipå°åå¨192.168.4.5è¿éï¼ä½ èªå·±å»æ¥å§ï¼æ¬äººæ¯è¾å¿ï¼åªè½å¸®ä½ å°è¿éäºã
Â
3)DNSåå称空é´çç»ç»æ¹å¼
 æ们å¨åé¢æ说å°æ ¹DNSæå¡å¨ï¼åDNSæå¡å¨ï¼è¿äºé½æ¯DNSåå称空é´çç»ç»æ¹å¼ãæå ¶åè½å½å空é´ä¸ç¨æ¥æè¿° DNS åå称çäºä¸ªç±»å«çä»ç»è¯¦è§ä¸è¡¨ä¸ï¼ä»¥åä¸æ¯ä¸ªå称类åç示ä¾
ï¼çå¾ï¼
Â
4)DNSè´è½½åè¡¡
ããå½ä¸ä¸ªç½ç«æ足å¤å¤çç¨æ·çæ¶åï¼åå¦æ¯æ¬¡è¯·æ±çèµæºé½ä½äºåä¸å°æºå¨ä¸é¢ï¼é£ä¹è¿å°æºå¨éæ¶å¯è½ä¼è¹¦æãå¤çåæ³å°±æ¯ç¨DNSè´è½½åè¡¡ææ¯ï¼å®çåçæ¯å¨DNSæå¡å¨ä¸ä¸ºåä¸ä¸ªä¸»æºåé ç½®å¤ä¸ªIPå°å,å¨åºçDNSæ¥è¯¢æ¶,DNSæå¡å¨å¯¹æ¯ä¸ªæ¥è¯¢å°ä»¥DNSæ件ä¸ä¸»æºè®°å½çIPå°åæ顺åºè¿åä¸åç解æç»æ,å°å®¢æ·ç«¯ç访é®å¼å¯¼å°ä¸åçæºå¨ä¸å»,使å¾ä¸åç客æ·ç«¯è®¿é®ä¸åçæå¡å¨,ä»èè¾¾å°è´è½½åè¡¡çç®ç。ä¾å¦å¯ä»¥æ ¹æ®æ¯å°æºå¨çè´è½½éï¼è¯¥æºå¨ç¦»ç¨æ·å°çä½ç½®çè·ç¦»ççã
Â
3ãæµè§å¨å web æå¡å¨åéä¸ä¸ª HTTP 请æ±
ããæ¿å°åå对åºçIPå°åä¹åï¼æµè§å¨ä¼ä»¥ä¸ä¸ªéæºç«¯å£ï¼1024<端å£<65535ï¼åæå¡å¨çWEBç¨åºï¼å¸¸ç¨çæhttpd,nginxçï¼80端å£åèµ·TCPçè¿æ¥è¯·æ±
ã
è¿ä¸ªè¿æ¥è¯·æ±å°è¾¾æå¡å¨ç«¯åï¼è¿ä¸é´éè¿åç§è·¯ç±è®¾å¤ï¼å±åç½å é¤å¤ï¼ï¼è¿å ¥å°ç½å¡ï¼ç¶åæ¯è¿å ¥å°å æ ¸çTCP/IPåè®®æ ï¼ç¨äºè¯å«è¯¥è¿æ¥è¯·æ±ï¼è§£å°å ï¼ä¸å±ä¸å±çå¥å¼ï¼ï¼è¿æå¯è½è¦ç»è¿Netfilteré²ç«å¢ï¼å±äºå æ ¸ç模åï¼çè¿æ»¤ï¼æç»å°è¾¾WEBç¨åºï¼æç»å»ºç«äºTCP/IPçè¿æ¥ã
TCPè¿æ¥å¦å¾æ示:
ãã建ç«äºTCPè¿æ¥ä¹åï¼åèµ·ä¸ä¸ªhttp请æ±ãä¸ä¸ªå ¸åç http request header ä¸è¬éè¦å æ¬è¯·æ±çæ¹æ³ï¼ä¾å¦ GET æè POST çï¼ä¸å¸¸ç¨çè¿æ PUT å DELETE ãHEADãOPTION以å TRACE æ¹æ³ï¼ä¸è¬çæµè§å¨åªè½åèµ· GET æè POST 请æ±ã
ãã客æ·ç«¯åæå¡å¨åèµ·http请æ±çæ¶åï¼ä¼æä¸äºè¯·æ±ä¿¡æ¯ï¼è¯·æ±ä¿¡æ¯å å«ä¸ä¸ªé¨åï¼
ãã| 请æ±æ¹æ³URIåè®®/çæ¬
   | 请æ±å¤´(Request Header)
ãã| 请æ±æ£æï¼
ä¸é¢æ¯ä¸ä¸ªå®æ´çHTTP请æ±ä¾åï¼
GET/sample.jspHTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=jinqiao&password=1234
 注æï¼æåä¸ä¸ªè¯·æ±å¤´ä¹åæ¯ä¸ä¸ªç©ºè¡ï¼åéå车符åæ¢è¡ç¬¦ï¼éç¥æå¡å¨ä»¥ä¸ä¸åæ请æ±å¤´ã
ï¼1ï¼è¯·æ±ç第ä¸è¡æ¯âæ¹æ³URLè®®/çæ¬âï¼GET/sample.jsp HTTP/1.1
ï¼2ï¼è¯·æ±å¤´(Request Header)
ãã 请æ±å¤´å å«è®¸å¤æå ³ç客æ·ç«¯ç¯å¢å请æ±æ£æçæç¨ä¿¡æ¯ãä¾å¦ï¼è¯·æ±å¤´å¯ä»¥å£°ææµè§å¨æç¨çè¯è¨ï¼è¯·æ±æ£æçé¿åº¦çã
Accept:image/gif.image/jpeg.*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
Accept-Encoding:gzip,deflate.
ï¼3ï¼è¯·æ±æ£æ
  请æ±å¤´å请æ±æ£æä¹é´æ¯ä¸ä¸ªç©ºè¡ï¼è¿ä¸ªè¡é常éè¦ï¼å®è¡¨ç¤ºè¯·æ±å¤´å·²ç»ç»æï¼æ¥ä¸æ¥çæ¯è¯·æ±æ£æã请æ±æ£æä¸å¯ä»¥å å«å®¢æ·æ交çæ¥è¯¢å符串信æ¯ï¼
username=jinqiao&password=1234
Â
ç¥è¯æ©å±ï¼
1ï¼TCPä¸æ¬¡æ¡æ
第ä¸æ¬¡æ¡æï¼å®¢æ·ç«¯Aå°æ å¿ä½SYN置为1,éæºäº§çä¸ä¸ªå¼ä¸ºseq=Jï¼Jçåå¼èå´ä¸º=1234567ï¼çæ°æ®å å°æå¡å¨ï¼å®¢æ·ç«¯Aè¿å ¥SYN_SENTç¶æï¼çå¾ æå¡ç«¯B确认ï¼
第äºæ¬¡æ¡æï¼æå¡ç«¯Bæ¶å°æ°æ®å åç±æ å¿ä½SYN=1ç¥é客æ·ç«¯A请æ±å»ºç«è¿æ¥ï¼æå¡ç«¯Bå°æ å¿ä½SYNåACKé½ç½®ä¸º1ï¼ack=J 1ï¼éæºäº§çä¸ä¸ªå¼seq=Kï¼å¹¶å°è¯¥æ°æ®å åéç»å®¢æ·ç«¯A以确认è¿æ¥è¯·æ±ï¼æå¡ç«¯Bè¿å ¥SYN_RCVDç¶æã
第ä¸æ¬¡æ¡æï¼å®¢æ·ç«¯Aæ¶å°ç¡®è®¤åï¼æ£æ¥ackæ¯å¦ä¸ºJ 1ï¼ACKæ¯å¦ä¸º1ï¼å¦ææ£ç¡®åå°æ å¿ä½ACK置为1ï¼ack=K 1ï¼å¹¶å°è¯¥æ°æ®å åéç»æå¡ç«¯Bï¼æå¡ç«¯Bæ£æ¥ackæ¯å¦ä¸ºK 1ï¼ACKæ¯å¦ä¸º1ï¼å¦ææ£ç¡®åè¿æ¥å»ºç«æåï¼å®¢æ·ç«¯Aåæå¡ç«¯Bè¿å ¥ESTABLISHEDç¶æï¼å®æä¸æ¬¡æ¡æï¼éå客æ·ç«¯Aä¸æå¡ç«¯Bä¹é´å¯ä»¥å¼å§ä¼ è¾æ°æ®äºã
å¦å¾æ示ï¼
Â
Â
2ï¼ä¸ºä»éè¦ä¸æ¬¡æ¡æï¼
 ã计ç®æºç½ç»ã第åçä¸è®²âä¸æ¬¡æ¡æâçç®çæ¯â为äºé²æ¢å·²å¤±æçè¿æ¥è¯·æ±æ¥æ段çªç¶åä¼ éå°äºæå¡ç«¯ï¼å è产çé误â
  书ä¸çä¾åæ¯è¿æ ·çï¼â已失æçè¿æ¥è¯·æ±æ¥æ段âç产çå¨è¿æ ·ä¸ç§æ åµä¸ï¼clientååºç第ä¸ä¸ªè¿æ¥è¯·æ±æ¥æ段并没æ丢失ï¼èæ¯å¨æ个ç½ç»ç»ç¹é¿æ¶é´çæ»çäºï¼ä»¥è´å»¶è¯¯å°è¿æ¥éæ¾ä»¥åçæ个æ¶é´æå°è¾¾serverãæ¬æ¥è¿æ¯ä¸ä¸ªæ©å·²å¤±æçæ¥æ段ãä½serveræ¶å°æ¤å¤±æçè¿æ¥è¯·æ±æ¥æ段åï¼å°±è¯¯è®¤ä¸ºæ¯clientå次ååºçä¸ä¸ªæ°çè¿æ¥è¯·æ±ãäºæ¯å°±åclientååºç¡®è®¤æ¥æ段ï¼åæ建ç«è¿æ¥ã
ããå设ä¸éç¨âä¸æ¬¡æ¡æâï¼é£ä¹åªè¦serverååºç¡®è®¤ï¼æ°çè¿æ¥å°±å»ºç«äºãç±äºç°å¨client并没æååºå»ºç«è¿æ¥ç请æ±ï¼å æ¤ä¸ä¼çç¬serverç确认ï¼ä¹ä¸ä¼åserveråéæ°æ®ãä½serverå´ä»¥ä¸ºæ°çè¿è¾è¿æ¥å·²ç»å»ºç«ï¼å¹¶ä¸ç´çå¾ clientåæ¥æ°æ®ãè¿æ ·ï¼serverçå¾å¤èµæºå°±ç½ç½æµªè´¹æäºãéç¨âä¸æ¬¡æ¡æâçåæ³å¯ä»¥é²æ¢ä¸è¿°ç°è±¡åçãä¾å¦åæé£ç§æ åµï¼clientä¸ä¼åserverç确认ååºç¡®è®¤ãserverç±äºæ¶ä¸å°ç¡®è®¤ï¼å°±ç¥éclient并没æè¦æ±å»ºç«è¿æ¥ãâã主è¦ç®çé²æ¢server端ä¸ç´çå¾ ï¼æµªè´¹èµæºã
Â
3ï¼TCPå次æ¥æ
第ä¸æ¬¡æ¥æï¼Clientåéä¸ä¸ªFINï¼ç¨æ¥å ³éClientå°Serverçæ°æ®ä¼ éï¼Clientè¿å ¥FIN_WAIT_1ç¶æã
第äºæ¬¡æ¥æï¼Serveræ¶å°FINåï¼åéä¸ä¸ªACKç»Clientï¼ç¡®è®¤åºå·ä¸ºæ¶å°åºå· 1ï¼ä¸SYNç¸åï¼ä¸ä¸ªFINå ç¨ä¸ä¸ªåºå·ï¼ï¼Serverè¿å ¥CLOSE_WAITç¶æã
第ä¸æ¬¡æ¥æï¼Serveråéä¸ä¸ªFINï¼ç¨æ¥å ³éServerå°Clientçæ°æ®ä¼ éï¼Serverè¿å ¥LAST_ACKç¶æã
第å次æ¥æï¼Clientæ¶å°FINåï¼Clientè¿å ¥TIME_WAITç¶æï¼æ¥çåéä¸ä¸ªACKç»Serverï¼ç¡®è®¤åºå·ä¸ºæ¶å°åºå· 1ï¼Serverè¿å ¥CLOSEDç¶æï¼å®æå次æ¥æã
Â
4ï¼ä¸ºä»ä¹å»ºç«è¿æ¥æ¯ä¸æ¬¡æ¡æï¼èå ³éè¿æ¥å´æ¯å次æ¥æå¢ï¼
ããè¿æ¯å 为æå¡ç«¯å¨LISTENç¶æä¸ï¼æ¶å°å»ºç«è¿æ¥è¯·æ±çSYNæ¥æåï¼æACKåSYNæ¾å¨ä¸ä¸ªæ¥æéåéç»å®¢æ·ç«¯ãèå ³éè¿æ¥æ¶ï¼å½æ¶å°å¯¹æ¹çFINæ¥ææ¶ï¼ä» ä» è¡¨ç¤ºå¯¹æ¹ä¸ååéæ°æ®äºä½æ¯è¿è½æ¥æ¶æ°æ®ï¼å·±æ¹ä¹æªå¿ å ¨é¨æ°æ®é½åéç»å¯¹æ¹äºï¼æ以己æ¹å¯ä»¥ç«å³closeï¼ä¹å¯ä»¥åéä¸äºæ°æ®ç»å¯¹æ¹åï¼ååéFINæ¥æç»å¯¹æ¹æ¥è¡¨ç¤ºåæç°å¨å ³éè¿æ¥ï¼å æ¤ï¼å·±æ¹ACKåFINä¸è¬é½ä¼åå¼åéã
Â
4ãæå¡å¨çæ°¸ä¹ éå®åååº
 ããæå¡å¨ç»æµè§å¨ååºä¸ä¸ª301æ°¸ä¹ éå®åååºï¼è¿æ ·æµè§å¨å°±ä¼è®¿é®âhttp://www.google.com/â èéâhttp://google.com/âã
ãã为ä»ä¹æå¡å¨ä¸å®è¦éå®åèä¸æ¯ç´æ¥åéç¨æ·æ³ççç½é¡µå 容å¢ï¼å ¶ä¸ä¸ä¸ªåå è·æç´¢å¼ææåæå ³ãå¦æä¸ä¸ªé¡µé¢æ两个å°åï¼å°±åhttp://www.yy.com/åhttp://yy.com/ï¼æç´¢å¼æä¼è®¤ä¸ºå®ä»¬æ¯ä¸¤ä¸ªç½ç«ï¼ç»æé ææ¯ä¸ªæç´¢é¾æ¥é½åå°ä»èéä½æåãèæç´¢å¼æç¥é301æ°¸ä¹ éå®åæ¯ä»ä¹ææï¼è¿æ ·å°±ä¼æ访é®å¸¦wwwçåä¸å¸¦wwwçå°åå½å°åä¸ä¸ªç½ç«æåä¸ãè¿æå°±æ¯ç¨ä¸åçå°åä¼é æç¼åå好æ§åå·®ï¼å½ä¸ä¸ªé¡µé¢æ好å 个ååæ¶ï¼å®å¯è½ä¼å¨ç¼åéåºç°å¥½å 次ã
æ©å±ç¥è¯
1ï¼301å302çåºå«ã
ãã301å302ç¶æç é½è¡¨ç¤ºéå®åï¼å°±æ¯è¯´æµè§å¨å¨æ¿å°æå¡å¨è¿åçè¿ä¸ªç¶æç åä¼èªå¨è·³è½¬å°ä¸ä¸ªæ°çURLå°åï¼è¿ä¸ªå°åå¯ä»¥ä»ååºçLocationé¦é¨ä¸è·åï¼ç¨æ·çå°çææå°±æ¯ä»è¾å ¥çå°åAç¬é´åæäºå¦ä¸ä¸ªå°åBï¼ââè¿æ¯å®ä»¬çå ±åç¹ã
ããä»ä»¬çä¸åå¨äºã301表示æ§å°åAçèµæºå·²ç»è¢«æ°¸ä¹ å°ç§»é¤äºï¼è¿ä¸ªèµæºä¸å¯è®¿é®äºï¼ï¼æç´¢å¼æå¨æåæ°å 容çåæ¶ä¹å°æ§çç½å交æ¢ä¸ºéå®åä¹åçç½åï¼
ãã302表示æ§å°åAçèµæºè¿å¨ï¼ä»ç¶å¯ä»¥è®¿é®ï¼ï¼è¿ä¸ªéå®ååªæ¯ä¸´æ¶å°ä»æ§å°åA跳转å°å°åBï¼æç´¢å¼æä¼æåæ°çå 容èä¿åæ§çç½åã SEO302好äº301
Â
2ï¼éå®ååå ï¼
ï¼1ï¼ç½ç«è°æ´ï¼å¦æ¹åç½é¡µç®å½ç»æï¼ï¼ ï¼2ï¼ç½é¡µè¢«ç§»å°ä¸ä¸ªæ°å°åï¼ ï¼3ï¼ç½é¡µæ©å±åæ¹å(å¦åºç¨éè¦æ.phpæ¹æ.Htmlæ.shtml)ã     è¿ç§æ åµä¸ï¼å¦æä¸åéå®åï¼åç¨æ·æ¶è夹ææç´¢å¼ææ°æ®åºä¸æ§å°ååªè½è®©è®¿é®å®¢æ·å¾å°ä¸ä¸ª404页é¢é误信æ¯ï¼è®¿é®æµéç½ç½ä¸§å¤±ï¼åè æäºæ³¨åäºå¤ä¸ªååçç½ç«ï¼ä¹éè¦éè¿éå®å让访é®è¿äºååçç¨æ·èªå¨è·³è½¬å°ä¸»ç«ç¹çã Â
3ï¼ä»ä¹æ¶åè¿è¡301æè 302跳转å¢ï¼
    å½ä¸ä¸ªç½ç«æè ç½é¡µ24â48å°æ¶å 临æ¶ç§»å¨å°ä¸ä¸ªæ°çä½ç½®ï¼è¿æ¶åå°±è¦è¿è¡302跳转ï¼è使ç¨301跳转çåºæ¯å°±æ¯ä¹åçç½ç«å 为æç§åå éè¦ç§»é¤æï¼ç¶åè¦å°æ°çå°å访é®ï¼æ¯æ°¸ä¹ æ§çã æ¸ æ°æç¡®èè¨ï¼ä½¿ç¨301跳转ç大æ¦åºæ¯å¦ä¸ï¼ 1ãååå°æä¸æ³ç»è´¹ï¼æè åç°äºæ´éåç½ç«çååï¼ï¼æ³æ¢ä¸ªååã 2ãå¨æç´¢å¼æçæç´¢ç»æä¸åºç°äºä¸å¸¦wwwçååï¼è带wwwçååå´æ²¡ææ¶å½ï¼è¿ä¸ªæ¶åå¯ä»¥ç¨301éå®åæ¥åè¯æç´¢å¼ææ们ç®æ çååæ¯åªä¸ä¸ªã 3ã空é´æå¡å¨ä¸ç¨³å®ï¼æ¢ç©ºé´çæ¶åã Â
5ãæµè§å¨è·è¸ªéå®åå°å
  ç°å¨æµè§å¨ç¥éäº "http://www.google.com/"ææ¯è¦è®¿é®çæ£ç¡®å°åï¼æ以å®ä¼åéå¦ä¸ä¸ªhttp请æ±ãè¿é没æå¥å¥½è¯´ç
Â
6ãæå¡å¨å¤ç请æ±
ããç»è¿åé¢çééæ¥éª¤ï¼æ们ç»äºå°æ们çhttp请æ±åéå°äºæå¡å¨è¿éï¼å ¶å®åé¢çéå®åå·²ç»æ¯å°è¾¾æå¡å¨äºï¼é£ä¹ï¼æå¡å¨æ¯å¦ä½å¤çæ们ç请æ±çå¢ï¼
ããå端ä»å¨åºå®ç端å£æ¥æ¶å°TCPæ¥æå¼å§ï¼å®ä¼å¯¹TCPè¿æ¥è¿è¡å¤çï¼å¯¹HTTPåè®®è¿è¡è§£æï¼å¹¶æç §æ¥ææ ¼å¼è¿ä¸æ¥å°è£ æHTTP Request对象ï¼ä¾ä¸å±ä½¿ç¨ã
ããä¸äºå¤§ä¸ç¹çç½ç«ä¼å°ä½ ç请æ±å°åå代çæå¡å¨ä¸ï¼å 为å½ç½ç«è®¿é®éé常大ï¼ç½ç«è¶æ¥è¶æ ¢ï¼ä¸å°æå¡å¨å·²ç»ä¸å¤ç¨äºãäºæ¯å°åä¸ä¸ªåºç¨é¨ç½²å¨å¤å°æå¡å¨ä¸ï¼å°å¤§éç¨æ·ç请æ±åé ç»å¤å°æºå¨å¤çãæ¤æ¶ï¼å®¢æ·ç«¯ä¸æ¯ç´æ¥éè¿HTTPå议访é®æç½ç«åºç¨æå¡å¨ï¼èæ¯å 请æ±å°Nginxï¼Nginxå请æ±åºç¨æå¡å¨ï¼ç¶åå°ç»æè¿åç»å®¢æ·ç«¯ï¼è¿éNginxçä½ç¨æ¯åå代çæå¡å¨ãåæ¶ä¹å¸¦æ¥äºä¸ä¸ªå¥½å¤ï¼å ¶ä¸ä¸å°æå¡å¨ä¸ä¸æäºï¼åªè¦è¿æå ¶ä»æå¡å¨æ£å¸¸è¿è¡ï¼å°±ä¸ä¼å½±åç¨æ·ä½¿ç¨ã
å¦å¾æ示ï¼
éè¿Nginxçåå代çï¼æ们å°è¾¾äºwebæå¡å¨ï¼æå¡ç«¯èæ¬å¤çæ们ç请æ±ï¼è®¿é®æ们çæ°æ®åºï¼è·åéè¦è·åçå 容ççï¼å½ç¶ï¼è¿ä¸ªè¿ç¨æ¶åå¾å¤å端èæ¬çå¤ææä½ãç±äºå¯¹è¿ä¸åä¸çï¼æ以è¿ä¸ååªè½ä»ç»è¿ä¹å¤äºã
Â
æ©å±é 读ï¼
1ï¼ä»ä¹æ¯åå代çï¼
客æ·ç«¯æ¬æ¥å¯ä»¥ç´æ¥éè¿HTTPå议访é®æç½ç«åºç¨æå¡å¨ï¼ç½ç«ç®¡çåå¯ä»¥å¨ä¸é´å ä¸ä¸ä¸ªNginxï¼å®¢æ·ç«¯è¯·æ±Nginxï¼Nginx请æ±åºç¨æå¡å¨ï¼ç¶åå°ç»æè¿åç»å®¢æ·ç«¯ï¼æ¤æ¶Nginxå°±æ¯åå代çæå¡å¨ã
Â
7ãæå¡å¨è¿åä¸ä¸ª HTTP ååºã
ããç»è¿åé¢ç6个æ¥éª¤ï¼æå¡å¨æ¶å°äºæ们ç请æ±ï¼ä¹å¤çæ们ç请æ±ï¼å°è¿ä¸æ¥ï¼å®ä¼æå®çå¤çç»æè¿åï¼ä¹å°±æ¯è¿åä¸ä¸ªHTPPååºã
HTTPååºä¸HTTP请æ±ç¸ä¼¼ï¼HTTPååºä¹ç±3个é¨åææï¼åå«æ¯ï¼
l ãç¶æè¡
l ãååºå¤´(Response Header)
l ãååºæ£æ
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
ï¼htmlï¼
ï¼headï¼
ï¼titleï¼httpï¼/titleï¼
ï¼/headï¼
ï¼bodyï¼
ï¼!-- body goes here --ï¼
ï¼/bodyï¼
ï¼/htmlï¼
ç¶æè¡ï¼
ç¶æè¡ç±åè®®çæ¬ãæ°åå½¢å¼çç¶æ代ç ãåç¸åºçç¶ææè¿°ï¼åå ç´ ä¹é´ä»¥ç©ºæ ¼åéã
æ ¼å¼:    HTTP-Version Status-Code Reason-Phrase CRLF
ä¾å¦:    HTTP/1.1 200 OK \r\n
-- åè®®çæ¬ï¼æ¯ç¨http1.0è¿æ¯å ¶ä»çæ¬
-- ç¶ææè¿°ï¼ç¶ææè¿°ç»åºäºå ³äºç¶æ代ç çç®ççæåæè¿°ãæ¯å¦ç¶æ代ç 为200æ¶çæ述为 ok
-- ç¶æ代ç ï¼ç¶æ代ç ç±ä¸ä½æ°åç»æï¼ç¬¬ä¸ä¸ªæ°åå®ä¹äºååºçç±»å«ï¼ä¸æäºç§å¯è½åå¼ãå¦ä¸
Â
1xxï¼ä¿¡æ¯æ§ç¶æç ï¼è¡¨ç¤ºæå¡å¨å·²æ¥æ¶äºå®¢æ·ç«¯è¯·æ±ï¼å®¢æ·ç«¯å¯ç»§ç»åé请æ±ã
  100 Continue
  101 Switching Protocols
 2xxï¼æåç¶æç ï¼è¡¨ç¤ºæå¡å¨å·²æåæ¥æ¶å°è¯·æ±å¹¶è¿è¡å¤çã
  200 OK 表示客æ·ç«¯è¯·æ±æå
  204 No Content æåï¼ä½ä¸è¿åä»»ä½å®ä½ç主ä½é¨å
  206 Partial Content æåæ§è¡äºä¸ä¸ªèå´ï¼Rangeï¼è¯·æ±
3xxï¼éå®åç¶æç ï¼è¡¨ç¤ºæå¡å¨è¦æ±å®¢æ·ç«¯éå®åã
  301 Moved Permanently æ°¸ä¹ æ§éå®åï¼ååºæ¥æçLocationé¦é¨åºè¯¥æ该èµæºçæ°URL
  302 Found 临æ¶æ§éå®åï¼ååºæ¥æçLocationé¦é¨ç»åºçURLç¨æ¥ä¸´æ¶å®ä½èµæº
  303 See Other 请æ±çèµæºåå¨çå¦ä¸ä¸ªURIï¼å®¢æ·ç«¯åºä½¿ç¨GETæ¹æ³å®åè·å请æ±çèµæº
  304 Not Modified æå¡å¨å 容没ææ´æ°ï¼å¯ä»¥ç´æ¥è¯»åæµè§å¨ç¼å
   307 Temporary Redirect 临æ¶éå®åãä¸302 Foundå«ä¹ä¸æ ·ã302ç¦æ¢POSTåæ¢ä¸ºGETï¼ä½å®é 使ç¨æ¶å¹¶ä¸ä¸å®ï¼307åæ´å¤æµè§å¨å¯è½ä¼éµå¾ªè¿ä¸æ åï¼ä½ä¹ä¾èµäºæµè§å¨å ·ä½å®ç°
 4xxï¼å®¢æ·ç«¯é误ç¶æç ï¼è¡¨ç¤ºå®¢æ·ç«¯ç请æ±æéæ³å 容ã
    400 Bad Request 表示客æ·ç«¯è¯·æ±æè¯æ³é误ï¼ä¸è½è¢«æå¡å¨æç解
    401 Unauthonzed 表示请æ±æªç»ææï¼è¯¥ç¶æ代ç å¿ é¡»ä¸ WWW-Authenticate æ¥å¤´åä¸èµ·ä½¿ç¨
    403 Forbidden 表示æå¡å¨æ¶å°è¯·æ±ï¼ä½æ¯æç»æä¾æå¡ï¼é常ä¼å¨ååºæ£æä¸ç»åºä¸æä¾æå¡çåå
    404 Not Found 请æ±çèµæºä¸åå¨ï¼ä¾å¦ï¼è¾å ¥äºé误çURL
5xxï¼æå¡å¨é误ç¶æç ï¼è¡¨ç¤ºæå¡å¨æªè½æ£å¸¸å¤ç客æ·ç«¯ç请æ±èåºç°æå¤é误ã
    500 Internel Server Error 表示æå¡å¨åçä¸å¯é¢æçé误ï¼å¯¼è´æ æ³å®æ客æ·ç«¯ç请æ±
    503 Service Unavailable 表示æå¡å¨å½åä¸è½å¤å¤ç客æ·ç«¯ç请æ±ï¼å¨ä¸æ®µæ¶é´ä¹åï¼æå¡å¨å¯è½ä¼æ¢å¤æ£å¸¸
Â
ååºå¤´ï¼
ããååºå¤´é¨ï¼ç±å ³é®å/å¼å¯¹ç»æï¼æ¯è¡ä¸å¯¹ï¼å ³é®ååå¼ç¨è±æåå·":"åéï¼å ¸åçååºå¤´æï¼
Â
ååºæ£æ
å å«çæ们éè¦çä¸äºå ·ä½ä¿¡æ¯ï¼æ¯å¦cookieï¼html,imageï¼å端è¿åç请æ±æ°æ®ççãè¿ééè¦æ³¨æï¼ååºæ£æåååºå¤´ä¹é´æä¸è¡ç©ºæ ¼ï¼è¡¨ç¤ºååºå¤´çä¿¡æ¯å°ç©ºæ ¼ä¸ºæ¢ï¼ä¸å¾æ¯fiddleræå°ç请æ±æ£æï¼çº¢è²æ¡ä¸çï¼ååºæ£æï¼
Â
8ãæµè§å¨æ¾ç¤º HTML
ããå¨æµè§å¨æ²¡æå®æ´æ¥åå ¨é¨HTMLææ¡£æ¶ï¼å®å°±å·²ç»å¼å§æ¾ç¤ºè¿ä¸ªé¡µé¢äºï¼æµè§å¨æ¯å¦ä½æ页é¢åç°å¨å±å¹ä¸çå¢ï¼ä¸åæµè§å¨å¯è½è§£æçè¿ç¨ä¸å¤ªä¸æ ·ï¼è¿éæ们åªä»ç»webkitç渲æè¿ç¨ï¼ä¸å¾å¯¹åºçå°±æ¯WebKit渲æçè¿ç¨ï¼è¿ä¸ªè¿ç¨å æ¬ï¼
解æhtml以æ建domæ -> æ建renderæ -> å¸å±renderæ -> ç»å¶renderæ
ããæµè§å¨å¨è§£æhtmlæ件æ¶ï¼ä¼âèªä¸èä¸âå è½½ï¼å¹¶å¨å è½½è¿ç¨ä¸è¿è¡è§£æ渲æãå¨è§£æè¿ç¨ä¸ï¼å¦æéå°è¯·æ±å¤é¨èµæºæ¶ï¼å¦å¾çãå¤é¾çCSSãiconfontçï¼è¯·æ±è¿ç¨æ¯å¼æ¥çï¼å¹¶ä¸ä¼å½±åhtmlææ¡£è¿è¡å è½½ã
ãã解æè¿ç¨ä¸ï¼æµè§å¨é¦å ä¼è§£æHTMLæ件æ建DOMæ ï¼ç¶å解æCSSæ件æ建渲ææ ï¼çå°æ¸²ææ æ建å®æåï¼æµè§å¨å¼å§å¸å±æ¸²ææ 并å°å ¶ç»å¶å°å±å¹ä¸ãè¿ä¸ªè¿ç¨æ¯è¾å¤æï¼æ¶åå°ä¸¤ä¸ªæ¦å¿µ: reflow(åæµ)årepain(éç»)ã
ããDOMèç¹ä¸çå个å ç´ é½æ¯ä»¥ç模åçå½¢å¼åå¨ï¼è¿äºé½éè¦æµè§å¨å»è®¡ç®å ¶ä½ç½®å大å°çï¼è¿ä¸ªè¿ç¨ç§°ä¸ºrelow;å½ç模åçä½ç½®,大å°ä»¥åå ¶ä»å±æ§ï¼å¦é¢è²,åä½,çç¡®å®ä¸æ¥ä¹åï¼æµè§å¨ä¾¿å¼å§ç»å¶å 容ï¼è¿ä¸ªè¿ç¨ç§°ä¸ºrepainã
ãã页é¢å¨é¦æ¬¡å è½½æ¶å¿ ç¶ä¼ç»åreflowårepainãreflowårepainè¿ç¨æ¯é常æ¶èæ§è½çï¼å°¤å ¶æ¯å¨ç§»å¨è®¾å¤ä¸ï¼å®ä¼ç ´åç¨æ·ä½éªï¼ææ¶ä¼é æ页é¢å¡é¡¿ãæ以æ们åºè¯¥å°½å¯è½å°çåå°reflowårepainã
ãã
ããå½ææ¡£å è½½è¿ç¨ä¸éå°jsæ件ï¼htmlææ¡£ä¼æ起渲æï¼å 载解æ渲æåæ¥ï¼ç线ç¨ï¼ä¸ä» è¦çå¾ ææ¡£ä¸jsæ件å è½½å®æ¯ï¼è¿è¦çå¾ è§£ææ§è¡å®æ¯ï¼æå¯ä»¥æ¢å¤htmlææ¡£ç渲æ线ç¨ãå 为JSæå¯è½ä¼ä¿®æ¹DOMï¼æ为ç»å ¸çdocument.writeï¼è¿æå³çï¼å¨JSæ§è¡å®æåï¼åç»ææèµæºçä¸è½½å¯è½æ¯æ²¡æå¿ è¦çï¼è¿æ¯jsé»å¡åç»èµæºä¸è½½çæ ¹æ¬åå ãæ以ææå¹³æ¶ç代ç ä¸ï¼jsæ¯æ¾å¨htmlææ¡£æ«å°¾çã
ããJSç解ææ¯ç±æµè§å¨ä¸çJS解æå¼æå®æçï¼æ¯å¦è°·æçæ¯V8ãJSæ¯å线ç¨è¿è¡ï¼ä¹å°±æ¯è¯´ï¼å¨åä¸ä¸ªæ¶é´å åªè½åä¸ä»¶äºï¼ææçä»»å¡é½éè¦æéï¼åä¸ä¸ªä»»å¡ç»æï¼åä¸ä¸ªä»»å¡æè½å¼å§ãä½æ¯ååå¨æäºä»»å¡æ¯è¾èæ¶ï¼å¦IO读åçï¼æ以éè¦ä¸ç§æºå¶å¯ä»¥å æ§è¡æå¨åé¢çä»»å¡ï¼è¿å°±æ¯ï¼åæ¥ä»»å¡(synchronous)åå¼æ¥ä»»å¡(asynchronous)ã
ããJSçæ§è¡æºå¶å°±å¯ä»¥çåæ¯ä¸ä¸ªä¸»çº¿ç¨å ä¸ä¸ä¸ªä»»å¡éå(task queue)ãåæ¥ä»»å¡å°±æ¯æ¾å¨ä¸»çº¿ç¨ä¸æ§è¡çä»»å¡ï¼å¼æ¥ä»»å¡æ¯æ¾å¨ä»»å¡éåä¸çä»»å¡ãææçåæ¥ä»»å¡å¨ä¸»çº¿ç¨ä¸æ§è¡ï¼å½¢æä¸ä¸ªæ§è¡æ ;å¼æ¥ä»»å¡æäºè¿è¡ç»æå°±ä¼å¨ä»»å¡éåä¸æ¾ç½®ä¸ä¸ªäºä»¶ï¼èæ¬è¿è¡æ¶å ä¾æ¬¡è¿è¡æ§è¡æ ï¼ç¶åä¼ä»ä»»å¡éåéæåäºä»¶ï¼è¿è¡ä»»å¡éåä¸çä»»å¡ï¼è¿ä¸ªè¿ç¨æ¯ä¸æéå¤çï¼æ以åå«åäºä»¶å¾ªç¯(Event loop)ãå ·ä½çè¿ç¨å¯ä»¥çæè¿ç¯æç« ï¼ç¹å»è¿é
Â
9ãæµè§å¨åé请æ±è·ååµå ¥å¨ HTML ä¸çèµæºï¼å¦å¾çãé³é¢ãè§é¢ãCSSãJSççï¼
ããå ¶å®è¿ä¸ªæ¥éª¤å¯ä»¥å¹¶åå¨æ¥éª¤8ä¸ï¼å¨æµè§å¨æ¾ç¤ºHTMLæ¶ï¼å®ä¼æ³¨æå°éè¦è·åå ¶ä»å°åå 容çæ ç¾ãè¿æ¶ï¼æµè§å¨ä¼åéä¸ä¸ªè·å请æ±æ¥éæ°è·å¾è¿äºæ件ãæ¯å¦æè¦è·åå¤å¾çï¼CSSï¼JSæ件çï¼ç±»ä¼¼äºä¸é¢çé¾æ¥ï¼
å¾çï¼http://static.ak.fbcdn.net/rsrc.php/z12E0/hash/8q2anwu7.gif
CSSå¼æ ·è¡¨ï¼http://static.ak.fbcdn.net/rsrc.php/z448Z/hash/2plh8s4n.css
JavaScript æ件ï¼http://static.ak.fbcdn.net/rsrc.php/zEMOA/hash/c8yzb6ub.js
ããè¿äºå°åé½è¦ç»åä¸ä¸ªåHTML读å类似çè¿ç¨ãæ以æµè§å¨ä¼å¨DNSä¸æ¥æ¾è¿äºååï¼åé请æ±ï¼éå®åçç...
ä¸åå¨æ页é¢ï¼éææ件ä¼å 许æµè§å¨å¯¹å ¶è¿è¡ç¼åãæçæ件å¯è½ä¼ä¸éè¦ä¸æå¡å¨é讯ï¼èä»ç¼åä¸ç´æ¥è¯»åï¼æè å¯ä»¥æ¾å°CDNä¸
Â
 -------------------------------------------------åå²çº¿-----------------------------------------------------
Â
ããè³æ¤ï¼ä»è¾å ¥urlå°é¡µé¢å±ç¤ºçè¿ç¨ç»äºæ´çå®äºãæ¬æååååæ´çäºå·®ä¸å¤ä¸ä¸ªææï¼å½ç¶ï¼ç½ä¸æå¾å¤æç« ç顺åºå¯è½è·æ¬æä¸å¤ªä¸æ ·ï¼ä¹æ¯å¯ä»¥çã
å¦ä»å·²ç¦»å¼åäºä¸å¹´ç大YYï¼è¿å ¥äºå¦ä¸å®¶å ¬å¸ï¼æå¾å¤ä¸è¥¿å¨åé¢ççå¦ä¹ ï¼æç¹å°ååçåæ¶ä¹æå¾å¼ºççå ´å¥ï¼ååãæ¿ä½ å¨éä¸é¶åéæ¾å°æ»¡æçå·¥ä½ï¼å¹²å·´ç¹ã
ããå½ç¶ï¼æç¬æéï¼æ误ä¹å¤ï¼æ¬¢è¿æåºï¼æ¬æåèäºå¾å¤çæç« ï¼ä¸è¿å¾å¤æç« çé¾æ¥ä¸è®°å¾äºï¼æ以åªååºäºä¸é¢ä¸ä¸ªåèé¾æ¥ã
Â
Â
åèæç®ï¼
https://segmentfault.com/a/1190000006879700 Â
http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/
http://zrj.me/archives/589 Â
Â