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×Ö½ÚÒÔÄÚ£¬Ñ¹ËõЧ¹û·Ç³£Ã÷ÏÔ¡£ |