Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
HTTPS Óë HTTP2 ЭÒé·ÖÎö
 
×÷ÕߣºÕÔá­ À´Ô´£ºcsdn ·¢²¼ÓÚ£º 2017-3-29
  1732  次浏览      30

HTTPSЭÒéÔ­Àí·ÖÎö

HTTPSЭÒéÐèÒª½â¾öµÄÎÊÌâ

HTTPS×÷Ϊ°²È«Ð­Òé¶øµ®Éú£¬ÄÇô¾Í²»µÃ²»Ãæ¶ÔÒÔÏÂÁ½´ó°²È«ÎÊÌ⣺

Éí·ÝÑéÖ¤

È·±£Í¨ÐÅË«·½Éí·ÝµÄÕæÊµÐÔ¡£Ö±°×һЩ£¬AÏ£ÍûÓëBͨÐÅ£¬AÈçºÎÈ·ÈÏBµÄÉí·Ý²»ÊÇÓÉCαÔìµÄ¡£

£¨ÓÉCαÔìBµÄÉí·ÝÓëAͨÐÅ£¬³ÆÎªÖмäÈ˹¥»÷£©

ͨÐżÓÃÜ

ͨÐŵĻúÃÜÐÔ¡¢ÍêÕûÐÔÒÀÀµÓÚËã·¨ÓëÃÜÔ¿£¬Í¨ÐÅË«·½ÊÇÈçºÎÑ¡ÔñËã·¨ÓëÃÜÔ¿µÄ¡£

ÄÜͬʱ½â¾öÒÔÉÏÁ½¸öÎÊÌ⣬¾ÍÄÜÈ·±£ÕæÊµÓÐЧµÄͨÐÅË«·½²ÉÈ¡ÓÐЧµÄËã·¨ÓëÃÜÔ¿½øÐÐͨÐÅ£¬±ãÍê³ÉÁËЭÒ鰲ȫµÄ³õÖÔ¡£

ÔÚ½éÉÜHTTPSЭÒéÈçºÎ½â¾öÁ½´ó°²È«ÎÊÌâǰ£¬ÎÒÃÇÊ×ÏÈÁ˽⼸¸ö¸ÅÄî¡£

Êý×ÖÖ¤Êé

Êý×ÖÖ¤ÊéÊÇ»¥ÁªÍøÍ¨ÐÅÖбêʶ˫·½Éí·ÝÐÅÏ¢µÄÊý×ÖÎļþ£¬ÓÉCAÇ©·¢¡£

CA

CA£¨certification authority£©ÊÇÊý×ÖÖ¤ÊéµÄÇ©·¢»ú¹¹¡£×÷ΪȨÍþ»ú¹¹£¬ÆäÉóºËÉêÇëÕßÉí·ÝºóÇ©·¢Êý×ÖÖ¤Ê飬ÕâÑùÎÒÃÇÖ»ÐèҪУÑéÊý×ÖÖ¤Êé¼´¿ÉÈ·¶¨¶Ô·½µÄÕæÊµÉí·Ý¡£

HTTPSЭÒé¡¢SSLЭÒé¡¢TLSЭÒé¡¢ÎÕÊÖЭÒéµÄ¹ØÏµ

HTTPSÊÇHypertext Transfer Protocol over Secure Socket LayerµÄËõд£¬¼´HTTP over SSL£¬¿ÉÀí½âΪ»ùÓÚSSLµÄHTTPЭÒé¡£HTTPSЭÒ鰲ȫÊÇÓÉSSLЭÒ飨Ŀǰ³£Óõ쬱¾ÎÄ»ùÓÚTLS 1.2½øÐзÖÎö£©ÊµÏֵġ£

SSLЭÒéÊÇÒ»ÖּǼЭÒ飬À©Õ¹ÐÔÁ¼ºÃ£¬¿ÉÒԺܷ½±ãµÄÌí¼Ó×ÓЭÒ飬¶øÎÕÊÖЭÒé±ãÊÇSSLЭÒéµÄÒ»¸ö×ÓЭÒé¡£

TLSЭÒéÊÇSSLЭÒéµÄºóÐø°æ±¾£¬±¾ÎÄÖÐÉæ¼°µÄSSLЭÒéĬÈÏÊÇTLSЭÒé1.2°æ±¾¡£

HTTPSЭÒéµÄ°²È«ÐÔÓÉSSLЭÒéʵÏÖ£¬µ±Ç°Ê¹ÓõÄTLSЭÒé1.2°æ±¾°üº¬ÁËËĸöºËÐÄ×ÓЭÒ飺ÎÕÊÖЭÒé¡¢ÃÜÔ¿ÅäÖÃÇл»Ð­Òé¡¢Ó¦ÓÃÊý¾ÝЭÒé¼°±¨¾¯Ð­Òé¡£

½â¾öÉí·ÝÑéÖ¤ÓëͨÐżÓÃܵĺËÐÄ£¬±ãÊÇÎÕÊÖЭÒ飬½ÓÏÂÀ´×ÅÖØ½éÉÜÎÕÊÖЭÒé¡£

ÎÕÊÖЭÒé

ÎÕÊÖЭÒéµÄ×÷ÓñãÊÇͨÐÅË«·½½øÐÐÉí·ÝÈ·ÈÏ¡¢Ð­Ḛ́²È«Á¬½Ó¸÷²ÎÊý£¨¼ÓÃÜËã·¨¡¢ÃÜÔ¿µÈ£©£¬È·±£Ë«·½Éí·ÝÕæÊµ²¢ÇÒЭÉ̵ÄËã·¨ÓëÃÜÔ¿Äܹ»±£Ö¤Í¨ÐŰ²È«¡£

¶ÔÎÕÊÖЭÒéµÄ½éÉÜÏÞÓÚ¿Í»§¶Ë¶Ô·þÎñ¶ËµÄÉí·ÝÑéÖ¤£¬µ¥ÏòÉí·ÝÑéÖ¤Ò²ÊÇĿǰ»¥ÁªÍø¹«Ë¾×î³£¼ûµÄÈÏÖ¤·½Ê½¡£

Ê×ÏÈÎÒÃÇ¿´Ò»ÏÂЭÒé½»»¥£¬Èçͼ1Ëùʾ£º

ͼ1 ÎÕÊÖЭÒé

½ÓÏÂÀ´ÒÔWiresharkץȡ½Ó¿ÚµÄÎÕÊÖЭÒé¹ý³ÌΪÀý£¬Õë¶ÔÿÌõЭÒéÏûÏ¢·ÖÎö¡£

ClientHelloÏûÏ¢

ClientHelloÏûÏ¢µÄ×÷ÓÃÊÇ£¬½«¿Í»§¶Ë¿ÉÓÃÓÚ½¨Á¢¼ÓÃÜͨµÀµÄ²ÎÊý¼¯ºÏ£¬Ò»´ÎÐÔ·¢Ë͸ø·þÎñ¶Ë¡£

ÏûÏ¢ÄÚÈݰüÀ¨£ºÆÚÍûЭÒé°æ±¾(TLS 1.2)¡¢¿É¹©²ÉÓõÄÃÜÂëÌ×¼þ(Cipher Suites)¡¢¿Í»§¶ËËæ»úÊý(Random)¼°À©Õ¹×Ö¶ÎÄÚÈÝ(Extension)µÈÐÅÏ¢£¬Èçͼ2Ëùʾ¡£

ͼ2 ClientHello

ServerHelloÏûÏ¢

ServerHelloÏûÏ¢µÄ×÷ÓÃÊÇ£¬ÔÚClientHello²ÎÊý¼¯ºÏÖÐÑ¡ÔñÊʺϵIJÎÊý£¬²¢½«·þÎñ¶ËÓÃÓÚ½¨Á¢¼ÓÃÜͨµÀµÄ²ÎÊý·¢Ë͸ø¿Í»§¶Ë¡£

ÏûÏ¢ÄÚÈݰüÀ¨£º²ÉÈ¡µÄЭÒé°æ±¾(TLS 1.2)¡¢²ÉÓõÄÃÜÂëÌ×¼þ(Cipher Suite)¡¢·þÎñ¶ËËæ»úÊý(Random)¡¢ÓÃÓÚ»Ö¸´»á»°µÄ»á»°ID(Session ID)¼°À©Õ¹×ֶεÈÐÅÏ¢£¬Èçͼ3Ëùʾ¡£

×Դ˿ͻ§¶ËÓë·þÎñ¶ËµÄЭÒé°æ±¾¡¢ÃÜÂëÌ×¼þÒѾ­Ð­ÉÌÍê±Ï¡£

ÕâÀï·þÎñ¶ËÏ·¢µÄ»á»°ID¿ÉÓÃÓÚºóÐø»Ö¸´»á»°¡£Èô¿Í»§¶ËÔÚClientHelloÖÐЯ´øÁ˻ỰID£¬²¢ÇÒ·þÎñ¶ËÈϿɣ¬ÔòË«·½Ö±½Óͨ¹ýÔ­Ö÷ÃÜÔ¿Éú³ÉÒ»Ì×еÄÃÜÔ¿¼´¿É¼ÌÐøÍ¨ÐÅ¡£½«Á½¸öÍøÂçÍù·µ½µµÍΪһ¸öÍøÂçÍù·µ£¬Ìá¸ßͨµÀ½¨Á¢µÄЧÂÊ¡£

ͼ3 ServerHello

CertificateÏûÏ¢

CertificateÏûÏ¢µÄ×÷ÓÃÊÇ£¬½«·þÎñ¶ËÖ¤ÊéµÄÏêϸÐÅÏ¢·¢Ë͸ø¿Í»§¶Ë£¬¹©¿Í»§¶Ë½øÐзþÎñ¶ËÉí·ÝУÑé¡£

ÏûÏ¢ÄÚÈÝ£º·þÎñ¶ËÏ·¢µÄÖ¤ÊéÁ´£¬Èçͼ4Ëùʾ¡£

·þÎñ¶ËΪÁ˱£Ö¤Ï·¢µÄÖ¤ÊéÄܹ»±»¿Í»§¶ËÕýȷʶ±ð£¬¾ÍÐèÒª½«Ç©·¢´ËÖ¤ÊéµÄCAÖ¤ÊéһͬÏ·¢£¬¹¹³ÉÖ¤ÊéÁ´£¬±£Ö¤¿Í»§¶Ë¿ÉÒÔ¸ù¾ÝÖ¤ÊéÁ´µÄÐÅÏ¢ÔÚϵͳÅäÖÃÖÐÕÒµ½¸ùÖ¤Ê飬²¢Í¨¹ý¸ùÖ¤ÊéµÄ¹«Ô¿Öð²ãÏòÏÂÑéÖ¤Ö¤ÊéµÄºÏ·¨ÐÔ¡£

ÈçͼËùʾ£¬Îå°Ë·þÎñÆ÷Ï·¢ÁËÁ½¸öÖ¤Ê飺×Ô¼ºµÄÖ¤ÊéÓëÇ©·¢CAµÄÖ¤Ê顣ͨ¹ýÇ©·¢CAµÄÖ¤ÊéÐÅÏ¢£¬Äܹ»Ö±½ÓÕÒµ½¸ùÖ¤Êé¡£

ͼ4 Certificate

¿Í»§¶Ë±¾µØÐ£Ñé·þÎñ¶ËÖ¤Ê飬ÈôУÑéͨ¹ý£¬Ôò¿Í»§¶Ë¶Ô·þÎñ¶ËµÄÉí·ÝÑéÖ¤±ãÍê³ÉÁË¡£

CertificateÕâ¸ö½×¶Î½â¾öÁËÁ½¶ËµÄÉí·ÝÑéÖ¤ÎÊÌâ¡£½èÖúCAµÄÁ¦Á¿£¬Í¨¹ýCAÇ©·¢Ö¤Ê飬½«Éí·ÝÑéÖ¤µÄ¹¤×÷½»¸øÁËCA´¦Àí¡£

Ö»ÒªÊÇÎÒÃÇÈϿɵÄCA£¬Ç©·¢µÄÖ¤ÊéÎÒÃǾùÈÏ¿ÉÖ¤Êé³ÖÓÐÕßµÄÉí·Ý¡£ÓÉÓÚCAµÄ½éÈ룬½â¾öÁËÖмäÈ˹¥»÷µÄÎÊÌ⣬ÒòΪÖмäÈ˲¢Ã»ÓзþÎñ¶ËµÄÖ¤Êé¿É¹©¿Í»§¶ËÑéÖ¤¡£

ServerKeyExchangeÏûÏ¢(¿ÉÄܲ»·¢ËÍ)

ServerKeyExchangeÏûÏ¢µÄ×÷ÓÃÊÇ£¬½«ÐèÒª·þÎñ¶ËÌṩµÄÃÜÔ¿½»»»µÄ¶îÍâ²ÎÊý£¬´«¸ø¿Í»§¶Ë¡£ÓеÄËã·¨²»ÐèÒª¶îÍâ²ÎÊý£¬ÔòServerKeyExchangeÏûÏ¢¿É²»·¢ËÍ¡£

ÏûÏ¢ÄÚÈÝ£ºÓÃÓÚÃÜÔ¿½»»»µÄ¶îÍâ²ÎÊý£¬Èçͼ5Ëùʾ¡£

ͼ5 ServerKeyExchange

Èçͼ5£¬·þÎñ¶ËÏ·¢ÁË¡°EC Diffile-Hellman¡±ÃÜÔ¿½»»»Ëã·¨ËùÐèÒªµÄ²ÎÊý¡£

ServerHelloDoneÏûÏ¢

ServerHelloDoneÏûÏ¢µÄ×÷ÓÃÊÇ£¬Í¨Öª¿Í»§¶ËServerHello½×¶ÎµÄÊý¾Ý¾ùÒÑ·¢ËÍÍê±Ï£¬µÈ´ý¿Í»§¶ËÏÂÒ»²½ÏûÏ¢¡£

ClientKeyExchangeÏûÏ¢

ClientKeyExchangeÏûÏ¢µÄ×÷ÓÃÊÇ£¬½«¿Í»§¶ËÐèҪΪÃÜÔ¿½»»»ÌṩµÄÊý¾Ý·¢Ë͸ø·þÎñ¶Ë¡£

µ±ÎÒÃÇÑ¡ÓÃRSAÃÜÔ¿½»»»Ë㷨ʱ£¬´ËÏûÏ¢µÄÄÚÈݱãÊÇͨ¹ýÖ¤Ê鹫Կ¼ÓÃܵÄÓÃÓÚÉú³ÉÖ÷ÃÜÔ¿µÄÔ¤Ö÷ÃÜÔ¿¡£

Èçͼ6Ëùʾ£¬ÓÉÓÚÑ¡ÓõÄÃÜÔ¿½»»»Ëã·¨ÊÇ¡°EC Diffie-Hellman¡±£¬ËùÒÔClientKeyExchangeÏûÏ¢·¢Ë͵ÄÊÇ¡±EC Diffie-Hellman¡±Ëã·¨ÐèÒªµÄ¿Í»§¶Ë²ÎÊý¡£

ͼ6 ClientKeyExchange

µ±·¢ËÍÁËClientKeyExchangeºó£¬Á½¶Ë¾ù¾ßÓÐÁËÉú³ÉÖ÷ÃÜÔ¿µÄÍêÕûÃÜÔ¿Êý¾ÝÓëËæ»úÊý£¬Á½¶Ë·Ö±ð¸ù¾ÝËùÑ¡Ëã·¨¼ÆËãÖ÷ÃÜÔ¿¼´¿É¡£

ÖÁ´Ë£¬ClientKeyExchange·¢Ëͺó£¬Á½¶Ë¾ù¿ÉÉú³ÉÖ÷ÃÜÔ¿£¬ÃÜÔ¿½»»»ÎÊÌâ±ã½â¾öÁË¡£

ÓеĶÁÕß¿ÉÄܶÔËæ»úÊýµÄ²ÉÓÃÓÐЩÒɻ󣬱ÊÕß¾õµÃËæ»úÊýµÄ¼ÓÈëÊÇΪÁËÌá¸ßÃÜÔ¿µÄËæ»úÐÔ¡£

ÓÉÓÚ¿Í»§¶ËÖ±½ÓÉú³ÉµÄÃÜÔ¿ºÜÓпÉÄܲ»¹»Ëæ»ú£¬¶øÍ¨¹ýÔ¤Ö÷ÃÜÔ¿¼ÓÉÏÁ½¶ËÌṩµÄÁ½¸öËæ»úÊý×öÖÖ×Ó£¬´´½¨µÄÖ÷ÃÜÔ¿¿ÉÒÔ±£Ö¤¸ü¼ÓÌù½üÕæÊµËæ»úµÄÃÜÔ¿¡£

ChangeCipherSpecÏûÏ¢

¾­¹ýÒÔÉÏÁùÌõÏûÏ¢£¬ÎÒÃÇÒѾ­½â¾öÁËÉí·ÝÈÏÖ¤ÎÊÌâ¡¢ÃÜÂëÌ×¼þѡȡÎÊÌâ¡¢ÃÜÔ¿½»»»ÎÊÌ⡣˫·½Ò²ÒѾ­Í¨¹ýÖ÷ÃÜÔ¿Éú³ÉÁËʵ¼ÊʹÓõÄÁù¸ö¼Ó½âÃÜÃÜÔ¿¡£

ChangeCipherSpecÏûÏ¢µÄ×÷Ó㬱ãÊÇÉùÃ÷ºóÐøÏûÏ¢¾ù²ÉÓÃÃÜÔ¿¼ÓÃÜ¡£ÔÚ´ËÏûÏ¢ºó£¬ÎÒÃÇÔÚWireSharkÉϱ㿴²»µ½Ã÷ÎÄÐÅÏ¢ÁË¡£

FinishedÏûÏ¢

FinishedÏûÏ¢µÄ×÷Óã¬ÊǶÔÎÕÊÖ½×¶ÎËùÓÐÏûÏ¢¼ÆËãÕªÒª£¬²¢·¢Ë͸ø¶Ô·½Ð£Ñ飬±ÜÃâͨÐŹý³ÌÖб»ÖмäÈËËù´Û¸Ä¡£

HTTPSЭÒé×ܽá

×Ô´Ë£¬HTTPSÈçºÎ±£Ö¤Í¨ÐŰ²È«£¬Í¨¹ýÎÕÊÖЭÒéµÄ½éÉÜ£¬ÎÒÃÇÒѾ­ÓÐËùÁ˽⡣

µ«ÊÇ£¬ÔÚÈ«ÃæÊ¹ÓÃHTTPSǰ£¬ÎÒÃÇ»¹ÐèÒª¿¼ÂÇÒ»¸öÖÚËùÖÜÖªµÄÎÊÌ⡪¡ªHTTPSÐÔÄÜ¡£

Ïà¶ÔHTTPЭÒéÀ´Ëµ£¬HTTPSЭÒ齨Á¢Êý¾ÝͨµÀµÄ¸ü¼ÓºÄʱ£¬ÈôÖ±½Ó²¿Êðµ½AppÖУ¬ÊƱؽµµÍÊý¾Ý´«µÝµÄЧÂÊ£¬¼ä½ÓÓ°ÏìÓû§ÌåÑé¡£

½ÓÏÂÀ´£¬½éÉÜHTTPSÐÔÄܾÈÐÇ¡ª¡ªHTTP2ЭÒé¡£

ЭÒéг裭HTTP2

ЭÒé½éÉÜ

Ëæ×Å»¥ÁªÍøµÄ¿ìËÙ·¢Õ¹£¬HTTP1.xЭÒéµÃµ½ÁËѸÃÍ·¢Õ¹£¬µ«µ±AppÒ»¸öÒ³Ãæ°üº¬ÁËÊýÊ®¸öÇëÇóʱ£¬HTTP1.xЭÒéµÄ¾ÖÏÞÐԱ㱩¶Á˳öÀ´£º

ÿ¸öÇëÇóÓëÏìÓ¦ÐèÒªµ¥¶À½¨Á¢Á´Â·½øÐÐÇëÇó(Connection×Ö¶ÎÄܹ»½â¾ö²¿·ÖÎÊÌâ)£¬ÀË·Ñ×ÊÔ´¡£

ÿ¸öÇëÇóÓëÏìÓ¦¶¼ÐèÒªÌí¼ÓÍêÕûµÄÍ·ÐÅÏ¢£¬Ó¦ÓÃÊý¾Ý´«ÊäЧÂʽϵ͡£

ĬÈÏûÓнøÐмÓÃÜ£¬Êý¾ÝÔÚ´«Êä¹ý³ÌÖÐÈÝÒ×±»¼àÌýÓë´Û¸Ä¡£

HTTP2ÕýÊÇΪÁ˽â¾öHTTP1.x±©Â¶³öÀ´µÄÎÊÌâ¶øµ®ÉúµÄ¡£

˵µ½HTTP2²»µÃ²»Ìáspdy¡£

ÓÉÓÚHTTP1.x±©Â¶³öÀ´µÄÎÊÌ⣬GoogleÉè¼ÆÁËȫеÄÃûΪspdyµÄÐÂЭÒé¡£spdyÔÚÎå²ãЭÒéÕ»µÄTCP²ãÓëHTTP²ãÒýÈëÁËÒ»¸öеÄÂß¼­²ãÒÔÌá¸ßЧÂÊ¡£spdyÊÇÒ»¸öÖмä²ã£¬¶ÔTCP²ãÓëHTTP²ãÓкܺõļæÈÝ£¬²»ÐèÒªÐÞ¸ÄHTTP²ã¼´¿É¸ÄÉÆÓ¦ÓÃÊý¾Ý´«ÊäËÙ¶È¡£

spdyͨ¹ý¶à·¸´Óü¼Êõ£¬Ê¹¿Í»§¶ËÓë·þÎñÆ÷Ö»ÐèÒª±£³ÖÒ»ÌõÁ´½Ó¼´¿É²¢·¢¶à´ÎÊý¾Ý½»»¥£¬Ìá¸ßÁËͨÐÅЧÂÊ¡£

¶øHTTP2±ãÊ¿»ùÓÚspdyµÄ˼·¿ª·¢µÄ¡£

ͨ¹ýÁ÷ÓëÖ¡¸ÅÄîµÄÒýÈ룬¼Ì³ÐÁËspdyµÄ¶à·¸´Ó㬲¢Ôö¼ÓÁËһЩʵÓÃÌØÐÔ¡£

HTTP2ÓÐÊ²Ã´ÌØÐÔÄØ£¿HTTP2µÄÌØÐÔ²»½ö½â¾öÁËÉÏÊöÒѱ©Â¶µÄÎÊÌ⣬»¹ÓÐһЩ¹¦ÄÜʹHTTPЭÒé¸ü¼ÓºÃÓá£

¶à·¸´ÓÃ

ѹËõÍ·ÐÅÏ¢

¶ÔÇëÇó»®·ÖÓÅÏȼ¶

Ö§³Ö·þÎñ¶ËPushÏûÏ¢µ½¿Í»§¶Ë

´ËÍ⣬HTTP2ĿǰÔÚʵ¼ÊʹÓÃÖУ¬Ö»ÓÃÓÚHTTPSЭÒ鳡¾°Ï£¬Í¨¹ýÎÕÊÖ½×¶ÎClientHelloÓëServerHelloµÄextension×Ö¶ÎЭÉ̶øÀ´£¬ËùÒÔĿǰHTTP2µÄʹÓó¡¾°£¬¶¼ÊÇĬÈϰ²È«¼ÓÃܵġ£

ÏÂÃæ½éÉÜHTTP2ЭÒéЭÉÌÒÔ¼°¶à·¸´ÓÃÓëѹËõÍ·ÐÅÏ¢Á½´óÌØÐÔ£¬ÊµÏÖ²¿·Ö²ÉÓÃokhttpÔ´Âë(»ùÓÚparent-3.4.2)½øÐзÖÎöÓë½éÉÜ¡£

okhttpÊÇĿǰʹÓÃ×î¹ã·ºµÄÖ§³ÖHTTP2µÄAndroid¶Ë¿ªÔ´ÍøÂç¿â£¬ÒÔokhttpΪÀý½éÉÜHTTP2ÌØÐÔÒ²¿É·½±ã¶ÁÕßÌáǰÁ˽âokhttp£¬·½±ãºóÐø½ÓÈëokhttp¡£

ЭÒéЭÉÌ

HTTP2ЭÒéµÄЭÉÌÊÇÔÚÎÕÊֽ׶νøÐеġ£

ЭÉ̵ķ½Ê½ÊÇͨ¹ýÎÕÊÖЭÒéextensionÀ©Õ¹×ֶνøÐÐÀ©Õ¹£¬ÐÂÔöApplication Layer Protocol Negotiation×ֶνøÐÐЭÉÌ¡£

ÔÚÎÕÊÖЭÒéµÄClientHello½×¶Î£¬¿Í»§¶Ë½«ËùÖ§³ÖµÄЭÒéÁбíÌîÈëApplication Layer Protocol Negotiation×ֶΣ¬¹©·þÎñ¶Ë½øÐÐÌôÑ¡¡£Èçͼ7Ëùʾ£º

ͼ7 ALPN1

·þÎñ¶ËÊÕµ½ClientHelloÏûÏ¢ºó£¬ÔÚ¿Í»§¶ËËùÖ§³ÖµÄЭÒéÁбíÖÐÑ¡ÔñÊʵ±Ð­Òé×÷ΪºóÐøÓ¦ÓòãЭÒé¡£Èçͼ8Ëùʾ£º

ͼ8 ALPN2

ÕâÑù£¬Á½¶Ë±ãÍê³ÉÁËHTTP2ЭÒéµÄЭÉÌ¡£

ÔÚHTTP2δ³öÏÖʱ£¬spdyÒ²ÊÇͨ¹ýÀ©Õ¹×ֶΣ¬À©Õ¹³önext_protocol_negotiation×ֶΣ¬ÒÔNPNЭÒé½øÐÐspdyµÄЭÉÌ¡£²»¹ýÓÉÓÚNPNЭÒéЭÉ̹ýÓÚ¸´ÔÓ£¬¶ÔhttpsЭÒéÇÖÈëÐÔ½ÏÇ¿£¬ÔÚ³öÏÖALPNЭÉÌЭÒéºó£¬±ãÖð½¥±»ÌÔÌ­ÁË¡£ËùÒÔ£¬±¾ÎÄЭÒéЭÉ̲¢Îª¶ÔNPNЭÒéЭÉÌ×ö½éÉÜ¡£

ЭÒéÌØÐÔÖ®¶à·¸´ÓÃ

http2ΪÁËÓÅ»¯http1.x¶ÔTCPÐÔÄܵÄÀË·Ñ£¬Ìá³öÁ˶à·¸´ÓõĸÅÄî¡£

¶à·¸´Óõĺ¬Òå

ÔÚHTTP2ÖУ¬Í¬Ò»ÓòÃûϵÄÇëÇ󣬿Éͨ¹ýͬһÌõTCPÁ´Â·½øÐд«Ê䣬ʹ¶à¸öÇëÇ󲻱ص¥¶À½¨Á¢Á´Â·£¬½ÚÊ¡½¨Á¢Á´Â·µÄ¿ªÏú¡£

ΪÁË´ïµ½Õâ¸öÄ¿µÄ£¬HTTP2Ìá³öÁËÁ÷ÓëÖ¡µÄ¸ÅÄÁ÷´ú±íÇëÇóÓëÏìÓ¦£¬¶øÇëÇóÓëÏìÓ¦¾ßÌåµÄÊý¾ÝÔò°üװΪ֡£¬¶ÔÁ´Â·Öд«ÊäµÄÊý¾Ýͨ¹ýÁ÷IDÓëÖ¡ÀàÐͽøÐÐÇø·Ö´¦Àí¡£Í¼9±ãÊǶà·¸´ÓõijéÏóͼ£¬Ã¿¸ö¿é´ú±íÒ»Ö¡£¬¶øÏàͬÑÕÉ«µÄ¿éÔò´ú±íÊÇͬһ¸öÁ÷¡£

ͼ9 http2_stream

ÄÇôHTTP2µÄ¶à·¸´ÓÃÊÇÈçºÎʵÏÖµÄÄØ£¿

ÓÉÓÚÍøÂçÇëÇóµÄ³¡¾°ºÜ¶à£¬ÎÒÃÇÑ¡ÔñÆäÖÐÒ»¸ö·¾¶À´½éÉÜ£º

¿Í»§¶ËÓë·þÎñ¶ËÔÚij¸öÓòÃûµÄTCPͨµÀÒѽ¨Á¢

д´½¨µÄ¿Í»§¶ËÇëÇóͨ¹ýÒÑÁ¬½ÓµÄTCPͨµÀ½øÐÐÇëÇó·¢ËÍÓëÏìÓ¦´¦Àí

¶à·¸´ÓÃʵÏÖ

ĬÈÏÎÒÃÇÒѾ­Ìí¼Ó¸÷²ÎÊý´´½¨ÁËRequest¶ÔÏór£¬²¢Í¨¹ýRequest¶ÔÏó´´½¨ÁËCall¶ÔÏóc¡£²¢ÔÚ¶ÀÁ¢Ïß³ÌÖУ¬µ÷ÓÃc.execute()·½·¨£¬½øÐÐͬ²½ÇëÇó²Ù×÷¡£

okhttpµ÷ÓÃexecute·½·¨ºó£¬Êµ¼ÊÉÏÊÇÓÉһϵÁеÄinterceptorÀ´¸ºÔðÖ´Ðеġ£

interceptor¸ù¾ÝÌí¼Ó˳ÐòÒÀ´ËÖ´ÐУ¬ÆäÖÐÎÒÃǹØ×¢µÄÊÇRetryAndFollowUpInterceptor¡¢ConnectInterceptor0¡¢CallServerInterceptor¡£

1.ÔÚRetryAndFollowUpInterceptorÖУ¬okhttpΪÎÒÃÇ´´½¨ÁËÒ»¸öStreamAllocation¶ÔÏó£¬StreamAllocationÖк¬ÓлùÓÚurl´´½¨µÄAddress¶ÔÏó¡£

AddressÀàµÄurl×Ö¶ÎÓëRequestÀàµÄurl×ֶβ»Í¬£¬AddressÀàµÄurl×ֶβ»°üÀ¨pathÓëquery×ֶΣ¬Ö»º¬ÓÐschemeÓëauthority²¿·Ö£¬ÕâµãÔÚ½øÐÐConnection¸´ÓõÄequal²Ù×÷ʱÆðÁ˺ܴó×÷Óá£

2.ÔÚConnectInterceptorÖУ¬StreamAllocation¶ÔÏóµÄAddressÓëÁ¬½Ó³ØÖÐÿ¸öConnection¶ÔÏóµÄAddressÒÀ´Î½øÐÐÆ¥Å䣬ƥÅä³É¹¦²¢Âú×ãһЩÌõ¼þµÄConnection±ã¿É¸´Ó᣻ùÓÚÆ¥Åä³öµÄConnection´´½¨Http2xStream£¬ÓÃÓÚºóÐø¶Áд²Ù×÷¡£

ÓëÁ¬½Ó³ØÖÐAddressÆ¥ÅäÖ÷Ҫͨ¹ýAddressµÄurl£¬urlÓÉÓÚÖ»º¬ÓÐschemeÓëauthorityËùÒÔ¿ÉÓÃÓÚÓòÃûµÄÆ¥Å䣬Õâ±ãÊÇokhttp»ùÓÚÓòÃû²ãÃæ¶à·¸´ÓõĻù´¡¡£

ʵ¼ÊÉÏÕæÕý½øÐÐÁ÷¶Áд²Ù×÷µÄÊÇFramedConnectionÓëFramedStream£¬ConnectionÓëHttp2xStreamÊdzéÏóÓÚ¾ßÌå²Ù×÷µÄÀ࣬ÒÔ·½±ãÉϲãʹÓá£

3.ÔÚCallServerInterceptorÖУ¬Http2xStream´´½¨FramedStreamÓÃÓÚRequest·¢ËÍ£¬²¢½«FramedStreamÓë¶ÔÓ¦µÄStreamID°ó¶¨»º´æÏÂÀ´£¬ÒÔ±ãResponseµ½À´Ê±£¬Äܹ»¸ù¾ÝStreamIDË÷Òýµ½¶ÔÓ¦µÄFramedSteam½øÐкóÐø²Ù×÷¡£

ÔÚFramedStream·¢ËÍÍêRequestºó£¬Ö´ÐÐreadResponseHeaders·½·¨Ê±½øÐе÷ÓÃÁËwait£¬½«µ±Ç°Ïß³Ì¹ÒÆð¡£

²¢ÔÚFramedConnection¶ÁÏß³ÌÊÕµ½StreamIDÏûϢʱ£¬ÔÚ»º´æÖвéѯFramedStream²¢½«¶ÔÓ¦Ï̻߳½ÐѽøÐÐResponse½âÂë¡£

¹éÄÉÏÂokhttpµÄ¶à·¸´ÓÃʵÏÖ˼·£º

ͨ¹ýÇëÇóµÄAddressÓëÁ¬½Ó³ØÖÐÏÖÓÐÁ¬½ÓAddressÒÀ´ÎÆ¥Å䣬ѡ³ö¿ÉÓõÄConnection¡£

ͨ¹ýHttp2xStream´´½¨µÄFramedStreamÔÚ·¢ËÍÁËÇëÇóºó£¬½«FramedStream¶ÔÏóÓëStreamIDµÄÓ³Éä¹ØÏµ»º´æµ½FramedConnectionÖС£

ÊÕµ½ÏûÏ¢ºó£¬FramedConnection½âÎöÖ¡ÐÅÏ¢£¬ÔÚMapÖÐͨ¹ý½âÎöµÄStreamIDÑ¡³ö»º´æµÄFramedStream£¬²¢»½ÐÑFramedStream½øÐÐResponseµÄ´¦Àí¡£

ÔÚ±ÊÕß¿´À´£¬HTTP2±ãÊÇÒ»¸öÁ¼ºÃ¼æÈÝhttpЭÒé¸ñʽµÄ×Ô¶¨ÒåЭÒ飬ͨ¹ýStream½«Êý¾Ý·Ö·¢µ½¸÷ÇëÇó£¬Í¨¹ýFrame½«ÇëÇóÊý¾ÝÏêϸϸ·Ö¡£

ЭÒéÌØÐÔ֮ѹËõÍ·ÐÅÏ¢

HTTP2ΪÁ˽â¾öHTTP1.xÖÐÍ·ÐÅÏ¢¹ý´óµ¼ÖÂЧÂʵÍϵÄÎÊÌ⣬Ìá³öµÄ½â¾ö·½°¸±ãÊÇѹËõÍ·²¿ÐÅÏ¢¡£¾ßÌåµÄѹËõ·½Ê½£¬ÔòÒýÈëÁËHPACK¡£

HPACKѹËõËã·¨ÊÇרÃÅΪHTTP2Í·²¿Ñ¹Ëõ·þÎñµÄ¡£ÎªÁ˴ﵽѹËõÍ·²¿ÐÅÏ¢µÄÄ¿µÄ£¬HPACK½«Í·²¿×ֶλº´æÎªË÷Òý£¬Í¨¹ýË÷ÒýID´ú±íÍ·²¿×ֶΡ£¿Í»§¶ËÓë·þÎñ¶Ëά»¤Ë÷Òý±í£¬Í¨ÐŹý³ÌÖо¡¿ÉÄܲÉÓÃË÷Òý½øÐÐͨÐÅ£¬ÊÕµ½Ë÷Òýºó²éѯË÷Òý±í£¬²ÅÄܽâÎö³öÕæÕýµÄÍ·²¿ÐÅÏ¢¡£

HPACKË÷Òý±í»®·ÖΪ¶¯Ì¬Ë÷Òý±íÓ뾲̬Ë÷Òý±í£¬¶¯Ì¬Ë÷Òý±íÊÇHTTP2ЭÒéͨÐŹý³ÌÖÐÁ½¶Ë¶¯Ì¬Î¬»¤µÄË÷Òý±í£¬¶ø¾²Ì¬Ë÷Òý±íÊÇÓ²±àÂë½øÐ­ÒéÖеÄË÷Òý±í¡£

×÷Ϊ·ÖÎöHPACKѹËõÍ·ÐÅÏ¢µÄ»ù´¡£¬ÐèÒªÏȽéÉÜHPACK¶ÔË÷ÒýÒÔ¼°Í·²¿×Ö·û´®µÄ±íʾ·½Ê½¡£

Ë÷Òý

Ë÷ÒýÒÔÕûÐÍÊý×Ö±íʾ£¬ÓÉÓÚHPACKÐèÒª¿¼ÂÇѹËõÓë±à½âÂëÎÊÌ⣬ËùÒÔÕûÐÍÊý×ֽṹ¶¨ÒåÈçͼ10Ëùʾ£º

ͼ10 int_strut

Àà±ð±êʶ

ͨ¹ýÀà±ð±êʶ½øÐÐHPACKÀà±ð·ÖÀָ࣬µ¼ºóÐø±à½âÂë²Ù×÷£¬³£¼ûµÄÓÐ1£¬01£¬01000000µÈ°Ë¸öÀà±ð¡£

Ê××Ö½ÚµÍλÕûÐÍ

Ê××Ö½ÚÅųýÀà±ð±êʶµÄÊ£Óà룬ÓÃÓÚ±íʾµÍλÕûÐÍ¡£ÈôÊýÖµ´óÓÚÊ£ÓàλËùÄܱíʾµÄÈÝÁ¿£¬ÔòÐèÒªºóÐø×Ö½Ú±íʾ¸ßλÕûÐÍ¡£

½áÊø±êʶ

±íʾ´Ë×Ö½ÚÊÇ·ñΪÕûÐͽâÎöÖÕÖ¹×Ö½Ú¡£

¸ßλÕûÐÍ

×Ö½ÚÓàÏÂ7bit£¬ÓÃÓÚÌî³äÕûÐ͸ßλ¡£

¡°½áÊø±êʶ+¸ßλÕûÐÍ¡±×Ö½Ú¿ÉÄÜÓÐ0¸ö¡¢Ò²ÓпÉÄÜÓжà¸ö£¬ÒÀ¾ÝÊý¾Ý´óС¶ø¶¨¡£

Æ©È磬ÈôÏë±íʾÀà±ðΪ1£¬Ë÷ÒýΪ2£¬ÔòʹÓÃ10000010¼´¿É,²»ÐèÒª¶îÍâ×Ö½ÚÔö¼Ó¸ßλÕûÐÍ¡£

Í·²¿×Ö·û´®

Í·²¿×Ö·û´®ÐèÒªÏÔʽÉùÃ÷³¤¶È£¬ËùÒÔÊý¾ÝÊ××Ö½ÚÓÉ¡°ÀàÐͱêʶ£«Êý¾Ý³¤¶È¡±×é³É¡£Èçͼ11Ëùʾ£º

ͼ11 string_strut

ÀàÐͱêʶ

ÊÇ·ñÑ¡Óùþ·òÂü±àÂ룬1ΪѡÓã¬0Ϊ²»Ñ¡Óã¬okhttpĬÈϲ»Ñ¡Óùþ·òÂü±àÂë¡£

Êý¾Ý³¤¶È

±êʶÊý¾Ý³¤¶È£¬²ÉÓÃÉÏÃæÌáµ½µÄÕûÐͱíʾ·¨±íʾ¡£

Êý¾ÝÄÚÈÝ

¶þ½øÖÆÊý¾Ý¡£

½âÂëʵÀý

ÏÂÃæ×ÛºÏokhttpÔ´Âë·ÖÎöHPACK½âÂëÍ·²¿×ֶιý³Ì¡£

¶Ô±àÂ벿·Ö¸ÐÐËȤµÄ¶ÁÕߣ¬¿ÉÒÔ²éÔÄRFC 7541»òÖ±½Ó·ÖÎöOkHttpÔ´Âë¡£

µ±ÎÒÃÇÐèÒª½âÂëÍ·²¿×Ö¶Îʱ£¬Ê×ÏȽâÎöÍ·²¿×Ö¶ÎÊ××Ö½Ú(HPACKÍ·²¿×Ö¶ÎÊ××Ö½Ú·ÖΪ8¸öÀà±ð£¬ÕªÑ¡ÆäÖÐ3¸öÀà±ð˵Ã÷)£¬Ê××Ö½ÚÓÃÓÚÖ¸µ¼µ±Ç°Í·²¿×ֶεĽâÎö¹æÔò£º

1xxxxxxx

Àà±ð±êʶΪ1£¬´ú±íÊÕµ½Ò»ÌõK¡¢V¾ùΪË÷ÒýµÄÍ·²¿×ֶΡ£

K¡¢VÖµ£ºÍ¨¹ý½âÎöHPACKÕûÐÍ»ñÈ¡KV¶ÔµÄË÷ÒýÖµ£¬²¢¸ù¾ÝË÷ÒýÖµÓ³Éä¶ÔÓ¦µÄÍ·²¿Ô­×ֶμ´¿É£¬Ñ¹ËõЧÂÊ×î¸ß¡£

01xxxxxx

Àà±ð±êʶΪ01£¬´ú±íÊÕµ½Ò»ÌõKΪË÷Òý¡¢VΪԭ×ֶΣ¬ÇÒÐèÒª¼ÓÈ붯̬Ë÷Òý±íµÄÍ·²¿×ֶΡ£

KÖµ£ºÍ¨¹ý½âÎöHPACKÕûÐÍ»ñÈ¡KÖµË÷ÒýÖµ£¬²¢Í¨¹ýË÷ÒýÖµÓ³Éä¶ÔÓ¦µÄÍ·²¿Ô­×ֶΡ£

VÖµ£ºÍ¨¹ý½âÎöHPACK×Ö·û´®»ñÈ¡VÖµÔ­×ֶΡ£

»ñÈ¡K¡¢VÖµºó»¹Ðè²åÈ붯̬Ë÷Òý±íÖС£

01000000

01000000´ú±íÊÕµ½Ò»ÌõK¡¢V¾ùΪԭ×ֶΣ¬ÇÒÐèÒª¼ÓÈ붯̬Ë÷Òý±íµÄÍ·²¿×ֶΡ£

K¡¢VÖµ£ºÍ¨¹ý½âÎöHPACK×Ö·û´®»ñÈ¡K¡¢VÔ­×ֶΣ¬²¢²åÈ붯̬Ë÷Òý±íÖС£

»¹Óв»¼ÓÈ붯̬Ë÷Òý±í¡¢µ÷ÕûË÷Òý±í´óСµÈÀà±ð£¬ÕâÀï¾Í²»Õ¹¿ªÁË£¬¸ÐÐËȤµÄ¿ÉÒÔ¿´okhttpÔ´ÂëʵÏÖ¡£

okhttp½âÎöÍ·ÐÅÏ¢µÄºËÐÄ·½·¨ÊµÏÖÈçÏ£º

void readHeaders() throws IOException {
while (!source.exhausted()) {
int b = source.readByte() & 0xff;
if (b == 0x80) { // 10000000
//Àà±ð±êʶΪ1£¬µ«Ë÷ÒýΪ0
throw new IOException("index == 0");
} else if ((b & 0x80) == 0x80) { // 1NNNNNNN
//Àà±ðΪ1£¬Í¨¹ýreadIndexedHeader½âÎöÕûÐÍindex¡£
int index = readInt(b, PREFIX_7_BITS);
//ͨ¹ýindex»ñÈ¡ÍêÕûÍ·²¿×Ö¶Î
readIndexedHeader(index - 1);
} else if (b == 0x40) { // 01000000
//01000000´ú±íKV¾ùΪԭ×ֶΣ¬
½âÎö×Ö·û´®ÒÀ´Î»ñÈ¡KÖµ¡¢VÖµ£¬²¢²åÈ붯̬±íÖÐ
readLiteralHeaderWithIncrementalIndexingNewName();
} else if ((b & 0x40) == 0x40) { // 01NNNNNN
//01xxxxxx´ú±íKֵΪË÷Òý£¬VֵΪԭ×Ö·û´®£¬
ÒÀ´Î½âÎöÕûÐÍindexÓë×Ö·û´®£¬²¢²åÈ붯̬±íÖÐ
int index = readInt(b, PREFIX_6_BITS);
readLiteralHeaderWithIncrementalIndexingIndexedName(index - 1);
} else if ((b & 0x20) == 0x20)
{ // 001NNNNN
//Àà±ðΪ001£¬º¬ÒåÊǸüж¯Ì¬ÁбíÈÝÁ¿
maxDynamicTableByteCount =
readInt(b, PREFIX_5_BITS);
if (maxDynamicTableByteCount < 0
|| maxDynamicTableByteCount > headerTableSizeSetting) {
throw new IOException
("Invalid dynamic table size update " + maxDynamicTableByteCount);
}
adjustDynamicTableByteCount();
} else if (b == 0x10 || b == 0)
{ // 000?0000 - Ignore never indexed bit.
//Õâ¸öÀà±ð´ú±íKV¾ùΪԭ×Ö·û´®£¬
ÒÀ´Î½âÎö×Ö·û´®£¬²¢²»¶Ô½âÎöºóµÄKVÖµ²åÈ붯̬±í¡£
readLiteralHeaderWithoutIndexingNewName();
} else { // 000?NNNN - Ignore never indexed bit.
//ÓëÉÏÒ»Àà±ðÀàËÆ£¬µ«KֵΪË÷Òý£¬VֵΪԭ×Ö·û´®
int index = readInt(b, PREFIX_4_BITS);
readLiteralHeaderWithoutIndexingIndexedName(index - 1);
}
}
}

ѹËõЧ¹û

KֵΪ¡°accept-encoding¡±¡¢VֵΪ¡°gzip, deflate¡±µÄÍ·²¿×Ö¶ÎÔÚHTTP2ÖпÉͨ¹ýË÷ÒýÖµ15´úÌæ£¬´Ó¶ø´ïµ½Í·²¿×Ö¶ÎѹËõµÄЧ¹û¡£

¡°accept-charset¡±Í·²¿×Ö¶ÎÔòͨ¹ý14´ú±íÍ·²¿KÖµ£¬¶øValueÖµ¸ù¾ÝHPACK¹æÔò±àÂëдÈëÁ÷ÖС£

ͨ¹ýHPACK£¬Ò»¸öÍ·²¿×ֶα仯½ÏÉÙµÄApp£¬Ã¿¸öÍ·²¿×ֶν«»áËõ¼õÖÁ4×Ö½ÚÒÔÄÚ£¬Ñ¹ËõЧ¹û·Ç³£Ã÷ÏÔ¡£

   
1732 ´Îä¯ÀÀ       30
 
Ïà¹ØÎÄÕÂ

iOSÓ¦Óð²È«¿ª·¢£¬Äã²»ÖªµÀµÄÄÇЩÊÂÊõ
Web°²È«Ö®SQL×¢Èë¹¥»÷
ÒÆ¶¯APP°²È«ÔÚÉøÍ¸²âÊÔÖеÄÓ¦ÓÃ
´ÓGoogle±¸·Ý»¥ÁªÍø¿´¡°Êý¾Ý°²È«¡±
 
Ïà¹ØÎĵµ

web°²È«Éè¼ÆÓë·À»¤
»¥ÁªÍøº£Á¿ÄÚÈݰ²È«´¦Àí¼¼Êõ
ºÚ¿Í¹¥»÷Óë·À·¶¼¼Êõ
WEBºÚºÐ°²È«¼ì²â
 
Ïà¹Ø¿Î³Ì

WEBÍøÕ¾ÓëÓ¦Óð²È«Ô­ÀíÓëʵ¼ù
webÓ¦Óð²È«¼Ü¹¹Éè¼Æ
´´½¨°²È«µÄJ2EE WebÓ¦ÓôúÂë
ÐÅÏ¢°²È«ÎÊÌâÓë·À·¶
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

iOSÓ¦Óð²È«¿ª·¢
Web°²È«Ö®SQL×¢Èë¹¥»÷
APP°²È«ÔÚÉøÍ¸²âÊÔÖеÄÓ¦ÓÃ
³õ̽PHPµÄSQL×¢Èë¹¥»÷µÄ¼¼Êõ
´ÓGoogle±¸·Ý¿´¡°Êý¾Ý°²È«¡±

WEBÍøÕ¾ÓëÓ¦Óð²È«Ô­ÀíÓëʵ¼ù
webÓ¦Óð²È«¼Ü¹¹Éè¼Æ
´´½¨°²È«µÄJ2EE WebÓ¦ÓôúÂë
×¢²áÐÅÏ¢°²È«×¨ÒµÈËÔ±(CISP)
ÐÅÏ¢°²È«¹ÜÀí
ÐÅÏ¢°²È«ÎÊÌâÓë·À·¶

ÖйúÒøÐÐ ÐÅÏ¢°²È«¼¼Êõ¼°Éî¶È·ÀÓù
WebÓ¦Óð²È«¼Ü¹¹¡¢ÈëÇÖ¼ì²âÓë·À»¤
ij²ÆË°ÁìÓòÖªÃûIT·þÎñÉÌ Web°²È«²âÊÔ
ÆÕÈð¿Ë˹ web°²È«Éè¼Æ¡¢²âÊÔÓëÓÅ»¯
±±¾©ºÍÀûʱ ÐÔÄܺͰ²È«ÐÔ²âÊÔ
SUNÖйú¹¤³ÌÑо¿Ôº JSF¿ò¼Ü¡¢°²È«