home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1997 December / Internet_Info_CD-ROM_Walnut_Creek_December_1997.iso / drafts / draft_s_z / draft-wessels-icp-v2-appl-01.txt < prev    next >
Text File  |  1997-07-02  |  52KB  |  1,345 lines

  1.  
  2.  
  3.  
  4. Network Working Group                                         D. Wessels
  5. Internet-Draft                                                 K. Claffy
  6.                                          National Laboratory for Applied
  7. Obsoletes <draft-wessels-icp-v2-appl-00.txt>       Network Research/UCSD
  8. Expires: 1 January 1998                                      1 July 1997
  9.  
  10.  
  11.  
  12.         Application of Internet Cache Protocol (ICP), version 2
  13.                    <draft-wessels-icp-v2-appl-01.txt>
  14.  
  15.  
  16. Status of this Memo
  17.  
  18.    This document is an Internet-Draft. Internet-Drafts are working
  19.    documents of the Internet Engineering Task Force (IETF), its areas,
  20.    and its working groups. Note that other groups may also distribute
  21.    working documents as Internet-Drafts.
  22.  
  23.    Internet-Drafts are draft documents valid for a maximum of six months
  24.    and may be updated, replaced, or obsoleted by other documents at any
  25.    time. It is inappropriate to use Internet-Drafts as reference
  26.    material or to cite them other than as ``work in progress.''
  27.  
  28.    To learn the current status of any Internet-Draft, please check the
  29.    ``1id-abstracts.txt'' listing contained in the Internet-Drafts Shadow
  30.    Directories on ftp.is.co.za (Africa), nic.nordu.net (Europe),
  31.    munnari.oz.au (Pacific Rim), ds.internic.net (US East Coast), or
  32.    ftp.isi.edu (US West Coast).
  33.  
  34. Abstract
  35.  
  36.    This draft document describes version 2 of the Internet Cache
  37.    Protocol (ICPv2) as currently implemented in two World-Wide Web proxy
  38.    cache packages[3,5].  ICP is a lightweight message format used for
  39.    communicating among Web caches.  ICP is used to exchange hints about
  40.    the existence of URLs in neighbor caches.  Caches exchange ICP
  41.    queries and replies to gather information to use in selecting the
  42.    most appropriate location from which to retrieve an object.
  43.  
  44.    This document describes the application of ICPv2 to Web caching.  A
  45.    companion document (RFCXXXX, <draft-wessels-icp-v2-03.txt>) describes
  46.    the format and syntax of the protocol itself.  Several independent
  47.    caching implementations now use ICP, and we consider it important to
  48.    codify the existing practical uses of ICP for those trying to
  49.    implement, deploy, and extend its use for their own purposes.
  50.  
  51.  
  52.  
  53.  
  54.  
  55. Wessels & Claffy                                                [Page 1]
  56.  
  57. Internet-Draft                                               27 May 1997
  58.  
  59.  
  60. Table of Contents
  61.  
  62.    1.   Introduction.................................................  2
  63.    2.   Web Cache Hierarchies........................................  3
  64.    3.   What is the Added Value of ICP?..............................  5
  65.    4.   Example Configuration of ICP Hierarchy.......................  5
  66.      4.1. Configuring the `proxy.customer.org' cache.................  5
  67.      4.2. Configuring the `cache.isp.com' cache......................  6
  68.    5.   Applying the Protocol........................................  7
  69.      5.1. Sending ICP Queries........................................  7
  70.      5.2. Receiving ICP Queries and Sending Replies..................  9
  71.      5.3. Receiving ICP Replies...................................... 11
  72.      5.4. ICP Options................................................ 13
  73.    6.   Firewalls.................................................... 14
  74.    7.   Multicast.................................................... 14
  75.    8.   Lessons Learned.............................................. 15
  76.    9.   Security Considerations...................................... 18
  77.    10.  References................................................... 23
  78.    11.  Acknowledgments.............................................. 23
  79.    12.  Author's Addresses........................................... 23
  80.  
  81.  
  82. 1.  Introduction
  83.  
  84.    ICP is a lightweight message format used for communicating among Web
  85.    caches.  ICP is used to exchange hints about the existence of URLs in
  86.    neighbor caches.  Caches exchange ICP queries and replies to gather
  87.    information for use in selecting the most appropriate location from
  88.    which to retrieve an object.
  89.  
  90.    This document describes the implementation of ICP in software.  For a
  91.    description of the protocol and message format, please refer to the
  92.    companion document ((RFCXXXX, <draft-wessels-icp-v2-03.txt>).  We
  93.    avoid making judgments about whether or how ICP should be used in
  94.    particular Web caching configurations.  ICP may be a "net win" in
  95.    some situations, and a "net loss" in others.  We recognize that cer-
  96.    tain things described in this document are incorrect approaches.
  97.    Some of these exist for historical reasons.  Some aspects have been
  98.    improved in later versions.  Since this document only serves to
  99.    describe current practices, we focus on documenting rather than eval-
  100.    uating.  However, we do address known security problems and other
  101.    shortcomings.
  102.  
  103.    The remainder of this document is written as follows:  First, we give
  104.    some basic descriptions and definitions of Web cache hierarchies, a
  105.    brief justification for the existence of ICP, and demonstrate how
  106.    cache hierarchies and ICP are expressed in configuration files.  Sec-
  107.    tion five includes a step-by-step description of a ICP query-response
  108.  
  109.  
  110.  
  111. Wessels & Claffy                                                [Page 2]
  112.  
  113. Internet-Draft                                               27 May 1997
  114.  
  115.  
  116.    transaction.  The subsequent sections address firewalls, multicast,
  117.    lessons learned, and security.
  118.  
  119.    ICP was initially developed by Peter Danzig, et. al.  at the Univer-
  120.    sity of Southern California as a central part of hierarchical caching
  121.    in the Harvest research project[3].
  122.  
  123.  
  124. 2.  Web Cache Hierarchies
  125.  
  126.    A single Web cache will reduce the amount of traffic generated by the
  127.    clients behind it.  Similarly, a group of Web caches can benefit by
  128.    sharing another cache in much the same way.  Researchers on the Har-
  129.    vest project envisioned that it would be important to connect Web
  130.    caches hierarchically.  In a cache hierarchy (or mesh) one cache
  131.    establishes peering relationships with its neighbor caches.  There
  132.    are two types of relationship: parent and sibling.  A parent cache is
  133.    essentially one level up in a cache hierarchy.  A sibling cache is on
  134.    the same level.  The terms "neighbor" and "peer" are used to refer to
  135.    either parents or siblings which are a single "cache-hop" away.  Fig-
  136.    ure 1 shows a simple hierarchy configuration.
  137.  
  138.    But what does it mean to be "on the same level" or "one level up?"
  139.    The general flow of document requests is up the hierarchy.  When a
  140.    cache does not hold a requested object, it may ask via ICP whether
  141.    any of its neighbor caches has the object.  If any of the neighbors
  142.    does have the requested object (i.e., a "neighbor hit"), then the
  143.    cache will request it from them.  If none of the neighbors has the
  144.    object (a "neighbor miss"), then the cache must forward the request
  145.    either to a parent, or directly to the origin server.  The essential
  146.    difference between a parent and sibling is that a "neighbor hit" may
  147.    be fetched from either one, but a "neighbor miss" may NOT be fetched
  148.    from a sibling.  In other words, in a sibling relationship, a cache
  149.    can only ask to retrieve objects that the sibling already has cached,
  150.    whereas the same cache can ask a parent to retrieve any object
  151.    regardless of whether or not it is cached.  A parent cache's role is
  152.    to provide "transit" for the request if necessary, and accordingly
  153.    parent caches are ideally located within or on the way to a transit
  154.    Internet service provider (ISP).
  155.  
  156.    Squid and Harvest allow for complex hierarchical configurations.  For
  157.    example, one could specify that a given neighbor be used for only a
  158.    certain class of requests, such as URLs from a specific DNS domain.
  159.    Additionally, it is possible to treat a neighbor as a sibling for
  160.    some requests and as a parent for others.
  161.  
  162.    The cache hierarchy model described here includes a number of fea-
  163.    tures to prevent top-level caches from becoming choke points.  One is
  164.  
  165.  
  166.  
  167. Wessels & Claffy                                                [Page 3]
  168.  
  169. Internet-Draft                                               27 May 1997
  170.  
  171.  
  172.      T H E   I N T E R N E T
  173.    ===========================
  174.        |          ||
  175.        |          ||
  176.        |          ||
  177.        |          ||
  178.        |      +----------------------+
  179.        |      |                      |
  180.        |      |        PARENT        |
  181.        |      |        CACHE         |
  182.        |      |                      |
  183.        |      +----------------------+
  184.        |          ||
  185.      DIRECT       ||
  186.    RETRIEVALS     ||
  187.        |          ||
  188.        |         HITS
  189.        |         AND
  190.        |        MISSES
  191.        |       RESOLVED
  192.        |          ||
  193.        |          ||
  194.        |          ||
  195.        V          \/
  196.    +------------------+                    +------------------+
  197.    |                  |                    |                  |
  198.    |      LOCAL       |/--------HITS-------|     SIBLING      |
  199.    |      CACHE       |\------RESOLVED-----|      CACHE       |
  200.    |                  |                    |                  |
  201.    +------------------+                    +------------------+
  202.       |  |  |  |  |
  203.       |  |  |  |  |
  204.       |  |  |  |  |
  205.       V  V  V  V  V
  206.    ===================
  207.       CACHE CLIENTS
  208.  
  209.    FIGURE 1: A Simple Web cache hierarchy.  The local cache can
  210.    retrieve hits from sibling caches, hits and misses from parent
  211.    caches, and some requests directly from origin servers.
  212.  
  213.    the ability to restrict parents as just described previously (by
  214.    domains).  Another optimization is that the cache only forwards
  215.    cachable requests to its neighbors.  A large class of Web requests
  216.    are inherently uncachable, including: requests requiring certain
  217.    types of authentication, session-encrypted data, highly personalized
  218.    responses, and certain types of database queries.  Lower level caches
  219.    should handle these requests directly rather than burdening parent
  220.  
  221.  
  222.  
  223. Wessels & Claffy                                                [Page 4]
  224.  
  225. Internet-Draft                                               27 May 1997
  226.  
  227.  
  228.    caches.
  229.  
  230.  
  231. 3.  What is the Added Value of ICP?
  232.  
  233.    Although it is possible to maintain cache hierarchies without using
  234.    ICP, the lack of ICP or something similar prohibits the existence of
  235.    sibling meta-communicative relationships, i.e., mechanisms to query
  236.    nearby caches about a given document.
  237.  
  238.    One concern over the use of ICP is the additional delay that an ICP
  239.    query/reply exchange contributes to an HTTP transaction.  However, if
  240.    the ICP query can locate the object in a nearby neighbor cache, then
  241.    the ICP delay may be more than offset by the faster delivery of the
  242.    data from the neighbor.  In order to minimize ICP delays, the caches
  243.    (as well as the protocol itself) are designed to return ICP requests
  244.    quickly.  Indeed, the application does minimal processing of the ICP
  245.    request, most ICP-related delay is due to transmission on the net-
  246.    work.
  247.  
  248.    ICP also serves to provide an indication of neighbor reachability.
  249.    If ICP replies from a neighbor fail to arrive, then either the net-
  250.    work path is congested (or down), or the cache application is not
  251.    running on the ICP-queried neighbor machine.  In either case, the
  252.    cache should not use this neighbor at this time.  Additionally,
  253.    because an idle cache can turn around the replies faster than a busy
  254.    one, all other things being equal, ICP provides some form of load
  255.    balancing.
  256.  
  257.  
  258. 4.  Example Configuration of ICP Hierarchy
  259.  
  260.    Configuring caches within a hierarchy requires establishing peering
  261.    relationships, which currently involves manual configuration at both
  262.    peering endpoints.  One cache must indicate that the other is a par-
  263.    ent or sibling.  The other cache will most likely have to add the
  264.    first cache to its access control lists.
  265.  
  266.    Below we show some sample configuration lines for a hypothetical sit-
  267.    uation.  We have two caches, one operated by an ISP, and another
  268.    operated by a customer.  First we describe how the customer would
  269.    configure his cache to peer with the ISP.  Second, we describe how
  270.    the ISP would allow the customer access to its cache.
  271.  
  272.  
  273. 4.1.  Configuring the `proxy.customer.org' cache
  274.  
  275.    In Squid, to configure parents and siblings in a hierarchy, a
  276.  
  277.  
  278.  
  279. Wessels & Claffy                                                [Page 5]
  280.  
  281. Internet-Draft                                               27 May 1997
  282.  
  283.  
  284.    `cache_host' directive is entered into the configuration file.  The
  285.    format is:
  286.  
  287.        cache_host hostname type http-port icp-port [options]
  288.  
  289.    Where type is either `parent', `sibling', or `multicast'.  For our
  290.    example, it would be:
  291.  
  292.        cache_host cache.isp.com parent 8080 3130
  293.  
  294.    This configuration will cause the customer cache to resolve most
  295.    cache misses through the parent (`cgi-bin' and non-GET requests would
  296.    be resolved directly).  Utilizing the parent may be undesirable for
  297.    certain servers, such as servers also in the customer.org domain.  To
  298.    always handle such local domains directly, the customer would add
  299.    this to his configuration file:
  300.  
  301.        local_domain customer.org
  302.  
  303.    It may also be the case that the customer wants to use the ISP cache
  304.    only for a specific subset of DNS domains.  The need to limit
  305.    requests this way is actually more common for higher levels of cache
  306.    hierarchies, but it is illustrated here nonetheless.  To limit the
  307.    ISP cache to a subset of DNS domains, the customer would use:
  308.  
  309.        cache_host_domain cache.isp.com com net org
  310.  
  311.    Then, any requests which are NOT in the .com, .net, or .org domains
  312.    would be handled directly.
  313.  
  314.  
  315. 4.2.  Configuring the `cache.isp.com' cache
  316.  
  317.    To configure the query-receiving side of the cache peer relationship
  318.    one uses access lists, similar to those used in routing peers.  The
  319.    access lists support a large degree of customization in the peering
  320.    relationship.  If there are no access lines present, the cache allows
  321.    the request by default.
  322.  
  323.    Note that the cache.isp.com cache need not explicitly specify the
  324.    customer cache as a peer, nor is the type of relationship encoded
  325.    within the ICP query itself.  The access control entries regulate the
  326.    relationships between this cache and its neighbors.  For our example,
  327.    the ISP would use:
  328.  
  329.        acl src Customer  proxy.customer.org
  330.        http_access allow Customer
  331.        icp_access  allow Customer
  332.  
  333.  
  334.  
  335. Wessels & Claffy                                                [Page 6]
  336.  
  337. Internet-Draft                                               27 May 1997
  338.  
  339.  
  340.    This defines an access control entry named `Customer' which specifies
  341.    a source IP address of the customer cache machine.  The customer
  342.    cache would then be allowed to make any request to both the HTTP and
  343.    ICP ports (including cache misses).  This configuration implies that
  344.    the ISP cache is a parent of the customer.
  345.  
  346.    If the ISP wanted to enforce a sibling relationship, it would need to
  347.    deny access to cache misses.  This would be done as follows:
  348.  
  349.        miss_access deny Customer
  350.  
  351.    Of course the ISP should also communicate this to the customer, so
  352.    that the customer will change his configuration from parent to sib-
  353.    ling.  Otherwise, if the customer requests an object not in the ISP
  354.    cache, an error message is generated.
  355.  
  356.  
  357. 5.  Applying the Protocol
  358.  
  359.    The following sections describe the ICP implementation in the Har-
  360.    vest[3] (research version) and Squid Web cache[5] packages.  In terms
  361.    of version numbers, this means version 1.4pl2 for Harvest and version
  362.    1.1.10 for Squid.
  363.  
  364.    The basic sequence of events in an ICP transaction is as follows:
  365.  
  366.    1.   Local cache receives an HTTP[1] request from a cache client.
  367.  
  368.    2.   The local cache sends ICP queries (section 5.1).
  369.  
  370.    3.   The peer cache(s) receive the queries and send ICP replies (sec-
  371.         tion 5.2).
  372.  
  373.    4.   The local cache receives the ICP replies and decides where to
  374.         forward the request (section 5.3).
  375.  
  376.  
  377. 5.1.  Sending ICP Queries
  378.  
  379.  
  380. 5.1.1.  Determine whether to use ICP at all
  381.  
  382.    Not every HTTP request requires an ICP query to be sent.  Obviously,
  383.    cache hits will not need ICP because the request is satisfied immedi-
  384.    ately.  For origin servers very close to the cache, we do not want to
  385.    use any neighbor caches.  In Squid and Harvest, the administrator
  386.    specifies what constitutes a `local' server with the `local_domain'
  387.    and `local_ip' configuration options.  The cache always contacts a
  388.  
  389.  
  390.  
  391. Wessels & Claffy                                                [Page 7]
  392.  
  393. Internet-Draft                                               27 May 1997
  394.  
  395.  
  396.    local server directly, never querying a peer cache.
  397.  
  398.    There are other classes of requests that the cache (or the adminis-
  399.    trator) may prefer to forward directly to the origin server.  In
  400.    Squid and Harvest, one such class includes all non-GET request meth-
  401.    ods.  A Squid cache can also be configured to not use peers for URLs
  402.    matching the `hierarchy_stoplist'.
  403.  
  404.    In order for an HTTP request to yield an ICP transaction, it must:
  405.  
  406.    o    not be a cache hit
  407.  
  408.    o    not be to a local server
  409.  
  410.    o    be a GET request, and
  411.  
  412.    o    not match the `hierarchy_stoplist' configuration.
  413.  
  414.    We call this a "hierarchical" request.  A "non-hierarchical" request
  415.    is one that doesn't generate any ICP traffic.  To avoid processing
  416.    requests that are likely to lower cache efficiency, one can configure
  417.    the cache to not consult the hierarchy for URLs that contain certain
  418.    strings (e.g. `cgi_bin').
  419.  
  420.  
  421. 5.1.2.  Determine which peers to query
  422.  
  423.    By default, a cache sends an ICP_OP_QUERY message to each peer,
  424.    unless any one of the following are true:
  425.  
  426.    o    Restrictions prevent querying a peer for this request, based on
  427.         the configuration directive `cache_host_domain', which specifies
  428.         a set of DNS domains (from the URLs) for which the peer should
  429.         or should not be queried.  In Squid, a more flexible directive
  430.         ('cache_host_acl') supports restrictions on other parts of the
  431.         request (method, port number, source, etc.).
  432.  
  433.    o    The peer is a sibling, and the HTTP request includes a "Pragma:
  434.         no-cache" header.  This is because the sibling would be asked to
  435.         transit the request, which is not allowed.
  436.  
  437.    o    The peer is configured to never be sent ICP queries (i.e. with
  438.         the `no-query' option).
  439.  
  440.    If the determination yields only one queryable ICP peer, and the
  441.    squid configuration directive `single_parent_bypass' is set, then one
  442.    can bypass waiting for the single ICP response and just send the HTTP
  443.    request directly to the peer cache.
  444.  
  445.  
  446.  
  447. Wessels & Claffy                                                [Page 8]
  448.  
  449. Internet-Draft                                               27 May 1997
  450.  
  451.  
  452.    The squid configuration option `source_ping' configures a squid cache
  453.    to send a ping to the original source simultaneous with its ICP
  454.    queries, in case the origin is closer than any of the caches.
  455.  
  456.  
  457. 5.1.3.  Calculate the expected number of ICP replies
  458.  
  459.    Harvest and Squid want to maximize the chance to get a HIT reply from
  460.    one of the peers.  Therefore, the cache waits for all ICP replies to
  461.    be received.  Normally, we expect to receive an ICP reply for each
  462.    query sent, except:
  463.  
  464.    o    When the peer is believed to be down.  If the peer is down Squid
  465.         and Harvest continue to send it ICP queries, but do not expect
  466.         the peer to reply.  When an ICP reply is again received from the
  467.         peer, its status will be changed to up.
  468.  
  469.         The determination of up/down status has varied a little bit as
  470.         the Harvest and Squid software evolved.  Both Harvest and Squid
  471.         mark a peer down when it fails to reply to 20 consecutive ICP
  472.         queries.  Squid also marks a peer down when a TCP connection
  473.         fails, and up again when a diagnostic TCP connection succeeds.
  474.  
  475.    o    When sending to a multicast address.  In this case we'll proba-
  476.         bly expect to receive more than one reply, and have no way to
  477.         definitively determine how many to expect.  We discuss multicast
  478.         issues in section 7 below.
  479.  
  480.  
  481. 5.1.4.  Install timeout event
  482.  
  483.    Because ICP uses UDP as underlying transport, ICP queries and replies
  484.    may sometimes be dropped by the network.  The cache installs a time-
  485.    out event in case not all of the expected replies arrive.  By default
  486.    Squid and Harvest use a two-second timeout.  If object retrieval has
  487.    not commenced when the timeout occurs, a source is selected as
  488.    described in section 5.3.9 below.
  489.  
  490.  
  491. 5.2.  Receiving ICP Queries and Sending Replies
  492.  
  493.    When an ICP_OP_QUERY message is received, the cache examines it and
  494.    decides which reply message is to be sent.  It will send one of the
  495.    following reply opcodes, tested for use in the order listed:
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502.  
  503. Wessels & Claffy                                                [Page 9]
  504.  
  505. Internet-Draft                                               27 May 1997
  506.  
  507.  
  508. 5.2.1.  ICP_OP_ERR
  509.  
  510.    The URL is extracted from the payload and parsed.  If parsing fails,
  511.    an ICP_OP_ERR message is returned.
  512.  
  513.  
  514. 5.2.2.  ICP_OP_DENIED
  515.  
  516.    The access controls are checked.  If the peer is not allowed to make
  517.    this request, ICP_OP_DENIED is returned.  Squid counts the number of
  518.    ICP_OP_DENIED messages sent to each peer.  If more than 95% of more
  519.    than 100 replies have been denied, then no reply is sent at all.
  520.    This prevents misconfigured caches from endlessly sending unnecessary
  521.    ICP messages back and forth.
  522.  
  523.  
  524. 5.2.3.  ICP_OP_HIT
  525.  
  526.    If the cache reaches this point without already matching one of the
  527.    previous  opcodes, it means the request is allowed and we must deter-
  528.    mine if it will be HIT or MISS, so we check if the URL exists in the
  529.    local cache.  If so, and if the cached entry is fresh for at least
  530.    the next 30 seconds, we can return an ICP_OP_HIT message.  The
  531.    stale/fresh determination uses the local refresh (or TTL) rules.
  532.  
  533.    Note that a race condition exists for ICP_OP_HIT replies to sibling
  534.    peers.  The ICP_OP_HIT means that a subsequent HTTP request for the
  535.    named URL would result in a cache hit.  We assume that the HTTP
  536.    request will come very quickly after the ICP_OP_HIT.  However, there
  537.    is a slight chance that the object might be purged from this cache
  538.    before the HTTP request is received.  If this happens, and the reply-
  539.    ing peer has applied Squid's `miss_access' configuration then the
  540.    user will receive a very confusing access denied message.
  541.  
  542.  
  543. 5.2.3.1.  ICP_OP_HIT_OBJ
  544.  
  545.    Before returning the ICP_OP_HIT message, we see if we can send an
  546.    ICP_OP_HIT_OBJ message instead.  We can use ICP_OP_HIT_OBJ if:
  547.  
  548.    o    The ICP_OP_QUERY message had the ICP_FLAG_HIT_OBJ flag set.
  549.  
  550.    o    The entire object (plus URL) will fit in an ICP message.  The
  551.         maximum ICP message size is 16 Kbytes, but an application may
  552.         choose to set a smaller maximum value for ICP_OP_HIT_OBJ
  553.         replies.
  554.  
  555.    Normally ICP replies are sent immediately after the query is
  556.  
  557.  
  558.  
  559. Wessels & Claffy                                               [Page 10]
  560.  
  561. Internet-Draft                                               27 May 1997
  562.  
  563.  
  564.    received, but the ICP_OP_HIT_OBJ message cannot be sent until the
  565.    object data is available to copy into the reply message.  For Squid
  566.    and Harvest this means the object must be "swapped in" from disk if
  567.    it is not already in memory.  Therefore, on average, an
  568.    ICP_OP_HIT_OBJ reply will have higher latency than ICP_OP_HIT.
  569.  
  570.  
  571. 5.2.4.  ICP_OP_MISS_NOFETCH
  572.  
  573.    At this point we have a cache miss.  ICP has two types of miss
  574.    replies.  If the cache does not want the peer to request the object
  575.    from it, it sends an ICP_OP_MISS_NOFETCH message.
  576.  
  577.  
  578. 5.2.5.  ICP_OP_MISS
  579.  
  580.    Finally, an ICP_OP_MISS reply is returned as the default.  If the
  581.    replying cache is a parent of the querying cache, the ICP_OP_MISS
  582.    indicates an invitation to fetch the URL through the replying cache.
  583.  
  584.  
  585. 5.3.  Receiving ICP Replies
  586.  
  587.    Some ICP replies will be ignored; specifically, when any of the fol-
  588.    lowing are true:
  589.  
  590.    o    The reply message originated from an unknown peer.
  591.  
  592.    o    The object named by the URL does not exist.
  593.  
  594.    o    The object is already being fetched.
  595.  
  596.  
  597. 5.3.1.  ICP_OP_DENIED
  598.  
  599.    If more than 95% of more than 100 replies from a peer cache have been
  600.    ICP_OP_DENIED, then such a high denial rate most likely indicates a
  601.    configuration error, either locally or at the peer.  For this reason,
  602.    no further queries will be sent to the peer for the duration of the
  603.    cache process.
  604.  
  605.  
  606. 5.3.2.  ICP_OP_HIT
  607.  
  608.    Object retrieval commences immediately from the replying peer.
  609.  
  610.  
  611.  
  612.  
  613.  
  614.  
  615. Wessels & Claffy                                               [Page 11]
  616.  
  617. Internet-Draft                                               27 May 1997
  618.  
  619.  
  620. 5.3.3.  ICP_OP_HIT_OBJ
  621.  
  622.    The object data is extracted from the ICP message and the retrieval
  623.    is complete.  If there is some problem with the ICP_OP_HIT_OBJ mes-
  624.    sage (e.g. missing data) the reply will be treated like a standard
  625.    ICP_OP_HIT.
  626.  
  627.  
  628. 5.3.4.  ICP_OP_SECHO
  629.  
  630.    Object retrieval commences immediately from the origin server because
  631.    the ICP_OP_SECHO reply arrived prior to any ICP_OP_HIT's.  If an
  632.    ICP_OP_HIT had arrived prior, this ICP_OP_SECHO reply would be
  633.    ignored because the retrieval has already started.
  634.  
  635.  
  636. 5.3.5.  ICP_OP_DECHO
  637.  
  638.    An ICP_OP_DECHO reply is handled like an ICP_OP_MISS.  Non-ICP peers
  639.    must always be configured as parents; a non-ICP sibling makes no
  640.    sense.  One serious problem with the ICP_OP_DECHO feature is that
  641.    since it bounces messages off the peer's UDP echo port, it does not
  642.    indicate that the peer cache is actually running -- only that network
  643.    connectivity exists between the pair.
  644.  
  645.  
  646. 5.3.6.  ICP_OP_MISS
  647.  
  648.    If the peer is a sibling, the ICP_OP_MISS reply is ignored.  Other-
  649.    wise, the peer may be "remembered" for future use in case no HIT
  650.    replies are received later (section 5.3.9).
  651.  
  652.    Harvest and Squid remember the first parent to return an ICP_OP_MISS
  653.    message.  With Squid, the parents may be weighted so that the "first
  654.    parent to miss" may not actually be the first reply received.  We
  655.    call this the FIRST_PARENT_MISS.  Remember that sibling misses are
  656.    entirely ignored, we only care about misses from parents.  The parent
  657.    miss RTT's can be weighted because sometimes the closest parent is
  658.    not the one people want to use.
  659.  
  660.    Also, recent versions of Squid may remember the parent with the low-
  661.    est RTT to the origin server, using the ICP_FLAG_SRC_RTT option.  We
  662.    call this the CLOSEST_PARENT_MISS.
  663.  
  664.  
  665. 5.3.7.  ICP_OP_MISS_NOFETCH
  666.  
  667.    This reply is essentially ignored.  A cache must not forward a
  668.  
  669.  
  670.  
  671. Wessels & Claffy                                               [Page 12]
  672.  
  673. Internet-Draft                                               27 May 1997
  674.  
  675.  
  676.    request to a peer that returns ICP_OP_MISS_NOFETCH.
  677.  
  678.  
  679. 5.3.8.  ICP_OP_ERR
  680.  
  681.    Silently ignored.
  682.  
  683.  
  684. 5.3.9.  When all peers MISS.
  685.  
  686.    For ICP_OP_HIT and ICP_OP_SECHO the request is forwarded immediately.
  687.    For ICP_OP_HIT_OBJ there is no need to forward the request.  For all
  688.    other reply opcodes, we wait until the expected number of replies
  689.    have been received.  When we have all of the expected replies, or
  690.    when the query timeout occurs, it is time to forward the request.
  691.  
  692.    Since MISS replies were received from all peers, we must either
  693.    select a parent cache or the origin server.
  694.  
  695.    o    If the peers are using the ICP_FLAG_SRC_RTT feature, we forward
  696.         the request to the peer with the lowest RTT to the origin
  697.         server.  If the local cache is also measuring RTT's to origin
  698.         servers, and is closer than any of the parents, the request is
  699.         forwarded directly to the origin server.
  700.  
  701.    o    If there is a FIRST_PARENT_MISS parent available, the request
  702.         will be forwarded there.
  703.  
  704.    o    If the ICP query/reply exchange did not produce any appropriate
  705.         parents, the request will be sent directly to the origin server
  706.         (unless firewall restrictions prevent it).
  707.  
  708.  
  709. 5.4.  ICP Options
  710.  
  711.    The following options were added to Squid to support some new fea-
  712.    tures while maintaining backward compatibility with the Harvest
  713.    implementation.
  714.  
  715.  
  716. 5.4.1.  ICP_FLAG_HIT_OBJ
  717.  
  718.    This flag is off by default and will be set in an ICP_OP_QUERY mes-
  719.    sage only if these three criteria are met:
  720.  
  721.    o    It is enabled in the cache configuration file with `udp_hit_obj
  722.         on'.
  723.  
  724.  
  725.  
  726.  
  727. Wessels & Claffy                                               [Page 13]
  728.  
  729. Internet-Draft                                               27 May 1997
  730.  
  731.  
  732.    o    The peer must be using ICP version 2.
  733.  
  734.    o    The HTTP request must not include the "Pragma: no-cache" header.
  735.  
  736.  
  737. 5.4.2.  ICP_FLAG_SRC_RTT
  738.  
  739.    This flag is off by default and will be set in an ICP_OP_QUERY mes-
  740.    sage only if these two criteria are met:
  741.  
  742.    o    It is enabled in the cache configuration file with `query_icmp
  743.         on'.
  744.  
  745.    o    The peer must be using ICP version 2.
  746.  
  747.  
  748. 6.  Firewalls
  749.  
  750.    Operating a Web cache behind a firewall or in a private network poses
  751.    some interesting problems.  The hard part is figuring out whether the
  752.    cache is able to connect to the origin server.  Harvest and Squid
  753.    provide an `inside_firewall' configuration directive to list DNS
  754.    domains on the near side of a firewall.  Everything else is assumed
  755.    to be on the far side of a firewall.  Squid also has a `firewall_ip'
  756.    directive so that inside hosts can be specified by IP addresses as
  757.    well.
  758.  
  759.    In a simple configuration, a Squid cache behind a firewall will have
  760.    only one parent cache (which is on the firewall itself).  In this
  761.    case, Squid must use that parent for all servers beyond the firewall,
  762.    so there is no need to utilize ICP.
  763.  
  764.    In a more complex configuration, there may be a number of peer caches
  765.    also behind the firewall.  Here, ICP may be used to check for cache
  766.    hits in the peers.  Occasionally, when ICP is being used, there may
  767.    not be any replies received.  If the cache were not behind a fire-
  768.    wall, the request would be forwarded directly to the origin server.
  769.    But in this situation, the cache must pick a parent cache, either
  770.    randomly or due to configuration information.  For example, Squid
  771.    allows a parent cache to be designated as a default choice when no
  772.    others are available.
  773.  
  774.  
  775. 7.  Multicast
  776.  
  777.    For efficient distribution, a cache may deliver ICP queries to a mul-
  778.    ticast address, and neighbor caches may join the multicast group to
  779.    receive such queries.
  780.  
  781.  
  782.  
  783. Wessels & Claffy                                               [Page 14]
  784.  
  785. Internet-Draft                                               27 May 1997
  786.  
  787.  
  788.    Current practice is that caches send ICP replies only to unicast
  789.    addresses, for several reasons:
  790.  
  791.    o    Multicasting ICP replies would not reduce the number of packets
  792.         sent.
  793.  
  794.    o    It prevents other group members from receiving unexpected
  795.         replies.
  796.  
  797.    o    The reply should follow unicast routing paths to indicate (uni-
  798.         cast) connectivity between the receiver and the sender since the
  799.         subsequent HTTP request will be unicast routed.
  800.  
  801.  
  802.    Trust is an important aspect of inter-cache relationships.  A Web
  803.    cache should not automatically trust any cache which replies to a
  804.    multicast ICP query.  Caches should ignore ICP messages from
  805.    addresses not specifically configured as neighbors.  Otherwise, one
  806.    could easily pollute a cache mesh by running an illegitimate cache
  807.    and having it join a group, return ICP_OP_HIT for all requests, and
  808.    then deliver bogus content.
  809.  
  810.    When sending to multicast groups, cache administrators must be care-
  811.    ful to use the minimum multicast TTL required to reach all group mem-
  812.    bers.  Joining a multicast group requires no special privileges and
  813.    there is no way to prevent anyone from joining "your" group.  Two
  814.    groups of caches utilizing the same multicast address could overlap,
  815.    which would cause a cache to receive ICP replies from unknown neigh-
  816.    bors.  The unknown neighbors would not be used to retrieve the object
  817.    data, but the cache would constantly receive ICP replies that it must
  818.    always ignore.
  819.  
  820.    To prevent an overlapping cache mesh, caches should thus limit the
  821.    scope of their ICP queries with appropriate TTLs; an application such
  822.    as mtrace[6] can determine appropriate multicast TTLs.
  823.  
  824.    As mentioned in section 5.1.3, we need to estimate the number of
  825.    expected replies for an ICP_OP_QUERY message.  For unicast we expect
  826.    one reply for each query if the peer is up.  However, for multicast
  827.    we generally expect more than one reply, but have no way of knowing
  828.    exactly how many replies to expect.  Squid regularly (every 15 min-
  829.    utes) sends out test ICP_OP_QUERY messages to only the multicast
  830.    group peers.  As with a real ICP query, a timeout event is installed
  831.    and the replies are counted until the timeout occurs.  We have found
  832.    that the received count varies considerably.  Therefore, the number
  833.    of replies to expect is calculated as a moving average, rounded down
  834.    to the nearest integer.
  835.  
  836.  
  837.  
  838.  
  839. Wessels & Claffy                                               [Page 15]
  840.  
  841. Internet-Draft                                               27 May 1997
  842.  
  843.  
  844. 8.  Lessons Learned
  845.  
  846.  
  847.    8.1.  Differences between ICP and HTTP
  848.  
  849.    ICP is notably different from HTTP.  HTTP supports a rich and sophis-
  850.    ticated set of features.  In contrast, ICP was designed to be simple,
  851.    small, and efficient.  HTTP request and reply headers consist of
  852.    lines of ASCII text delimited by a CRLF pair, whereas ICP uses a
  853.    fixed size header and represents numbers in binary.  The only thing
  854.    ICP and HTTP have in common is the URL.
  855.  
  856.    Note that the ICP message does not even include the HTTP request
  857.    method.  The original implementation assumed that only GET requests
  858.    would be cachable and there would be no need to locate non-GET
  859.    requests in neighbor caches.  Thus, the current version of ICP does
  860.    not accommodate non-GET requests, although the next version of this
  861.    protocol will likely include a field for the request method.
  862.  
  863.    HTTP defines features that are important for caching but not express-
  864.    ible with the current ICP protocol.  Among these are Pragma: no-
  865.    cache, If-Modified-Since, and all of the Cache-Control features of
  866.    HTTP/1.1.  An ICP_OP_HIT_OBJ message may deliver an object which may
  867.    not obey all of the request header constraints.  These differences
  868.    between ICP and HTTP are the reason we discourage the use of the
  869.    ICP_OP_HIT_OBJ feature.
  870.  
  871.  
  872. 8.2.  Parents, Siblings, Hits and Misses
  873.  
  874.    Note that the ICP message does not have a field to indicate the
  875.    intent of the querying cache.  That is, nowhere in the ICP request or
  876.    reply does it say that the two caches have a sibling or parent rela-
  877.    tionship.  A sibling cache can only respond with HIT or MISS, not
  878.    "you can retrieve this from me" or "you can not retrieve this from
  879.    me."  The querying cache must apply the HIT or MISS reply to its
  880.    local configuration to prevent it from resolving misses through a
  881.    sibling cache.  This constraint is awkward, because this aspect of
  882.    the relationship can be configured only in the cache originating the
  883.    requests, and indirectly via the access controls configured in the
  884.    queried cache as described earlier in section 4.2.
  885.  
  886.  
  887. 8.3.  Different roles of ICP
  888.  
  889.    There are two different understandings of what exactly the role of
  890.    ICP is in a cache mesh.  One understanding is that ICP's role is only
  891.    object location, specifically, to provide hints about whether or not
  892.  
  893.  
  894.  
  895. Wessels & Claffy                                               [Page 16]
  896.  
  897. Internet-Draft                                               27 May 1997
  898.  
  899.  
  900.    a named object exists in a neighbor cache.  An implied assumption is
  901.    that cache hits are highly desirable, and ICP is used to maximize the
  902.    chance of getting them.  If an ICP message is lost due to congestion,
  903.    then nothing significant is lost; the request will be satisfied
  904.    regardless.
  905.  
  906.    ICP is increasingly being tasked to fill a more complex role: convey-
  907.    ing cache usage policy.  For example, many organizations (e.g. uni-
  908.    versities) will install a Web cache on the border of their network.
  909.    Such organizations may be happy to establish sibling relationships
  910.    with other, nearby caches, subject to the following terms:
  911.  
  912.    o    Any of the organization's customers or users may request any
  913.         object (cached or not).
  914.  
  915.    o    Anyone may request an object already in the cache.
  916.  
  917.    o    Anyone may request any object from the organization's servers
  918.         behind the cache.
  919.  
  920.    o    All other requests are denied; specifically, the organization
  921.         will not provide transit for requests in which neither the
  922.         client nor the server falls within its domain.
  923.  
  924.    To successfully convey policy the ICP exchange must very accurately
  925.    predict the result (hit, miss) of a subsequent HTTP request.  The
  926.    result may often depend on other request fields, such as Cache-Con-
  927.    trol.  So it's not possible for ICP to accurately predict the result
  928.    without more, or perhaps all, of the HTTP request.
  929.  
  930.  
  931. 8.4.  Protocol Design Flaws of ICPv2
  932.  
  933.    We recognize certain flaws with the original design of ICP, and make
  934.    note of them so that future versions can avoid the same mistakes.
  935.  
  936.    o    The NULL-terminated URL in the payload field requires stepping
  937.         through the message an octet at a time to find some of the
  938.         fields (i.e. the beginning of object data in an ICP_OP_HIT_OBJ
  939.         message).
  940.  
  941.    o    Two fields (Sender Host Address and Requester Host Address) are
  942.         IPv4 specific.  However, neither of these fields are used in
  943.         practice; they are normally zero-filled.  If IP addresses have a
  944.         role in the ICP message, there needs to be an address family
  945.         descriptor for each address, and clients need to be able to say
  946.         whether they want to hear IPv6 responses or not.
  947.  
  948.  
  949.  
  950.  
  951. Wessels & Claffy                                               [Page 17]
  952.  
  953. Internet-Draft                                               27 May 1997
  954.  
  955.  
  956.    o    Options are limited to 32 option flags and 32 bits of option
  957.         data.  This should be more like TCP, with an option descriptor
  958.         followed by option data.
  959.  
  960.    o    Although currently used as the cache key, the URL string no
  961.         longer serves this role adequately.  Some HTTP responses now
  962.         vary according to the requestor's User-Agent and other headers.
  963.         A cache key must incorporate all non-transport headers present
  964.         in the client's request.  All non-hop-by-hop request headers
  965.         should be sent in an ICP query.
  966.  
  967.    o    ICPv2 uses different opcode values for queries and responses.
  968.         ICP should use the same opcode for both sides of a two-sided
  969.         transaction, with a "query/response" indicator telling which
  970.         side is which.
  971.  
  972.    o    ICPv2 does not include any authentication fields.
  973.  
  974.  
  975. 9.  Security Considerations
  976.  
  977.    Security is an issue with ICP over UDP because of its connectionless
  978.    nature.  Below we consider various vulnerabilities and methods of
  979.    attack, and their implications.
  980.  
  981.    Our first line of defense is to check the source IP address of the
  982.    ICP message, e.g. as given by recvfrom(2).  ICP query messages should
  983.    be processed if the access control rules allow the querying address
  984.    access to the cache.  However, ICP reply messages must only be
  985.    accepted from known neighbors; a cache must ignore replies from
  986.    unknown addresses.
  987.  
  988.    Because we trust the validity of an address in an IP packet, ICP is
  989.    susceptible to IP address spoofing.  In this document we address some
  990.    consequences of IP address spoofing.  Normally, spoofed addresses can
  991.    only be detected by routers, not by hosts.  However, the IP Authenti-
  992.    cation Header[7,8] can be used underneath ICP to provide crypto-
  993.    graphic authentication of the entire IP packet containing the ICP
  994.    protocol, thus eliminating the risk of IP address spoofing.
  995.  
  996.  
  997. 9.1.  Inserting bogus ICP queries
  998.  
  999.    Processing an ICP_OP_QUERY message has no known security implica-
  1000.    tions, so long as the requesting address is granted access to the
  1001.    cache.
  1002.  
  1003.  
  1004.  
  1005.  
  1006.  
  1007. Wessels & Claffy                                               [Page 18]
  1008.  
  1009. Internet-Draft                                               27 May 1997
  1010.  
  1011.  
  1012. 9.2.  Inserting bogus ICP replies
  1013.  
  1014.    Here we are concerned with a third party generating ICP reply mes-
  1015.    sages which are returned to the querying cache before the real reply
  1016.    arrives, or before any replies arrive.  The third party may insert
  1017.    bogus ICP replies which appear to come from legitimate neighbors.
  1018.    There are three vulnerabilities:
  1019.  
  1020.    o    Preventing a certain neighbor from being used
  1021.  
  1022.         If a third-party could send an ICP_OP_MISS_NOFETCH reply back
  1023.         before the real reply arrived, the (falsified) neighbor would
  1024.         not be used.
  1025.  
  1026.         A third-party could blast a cache with ICP_OP_DENIED messages
  1027.         until the threshold described in section 5.3.1 is reached,
  1028.         thereby causing the neighbor relationship to be temporarily ter-
  1029.         minated.
  1030.  
  1031.    o    Forcing a certain neighbor to be used
  1032.  
  1033.         If a third-party could send an ICP_OP_HIT reply back before the
  1034.         real reply arrived, the (falsified) neighbor would be used.
  1035.         This may violate the terms of a sibling relationship; ICP_OP_HIT
  1036.         replies mean a subsequent HTTP request will also be a hit.
  1037.  
  1038.         Similarly, if bogus ICP_OP_SECHO messages can be generated, the
  1039.         cache would retrieve requests directly from the origin server.
  1040.  
  1041.    o    Cache poisoning
  1042.  
  1043.         The ICP_OP_HIT_OBJ message is especially sensitive to security
  1044.         issues since it contains actual object data.  In combination
  1045.         with IP address spoofing, this option opens up the likely possi-
  1046.         bility of having the cache polluted with invalid objects.
  1047.  
  1048.  
  1049. 9.3.  Eavesdropping
  1050.  
  1051.    Multicasting ICP queries provides a very simple method for others to
  1052.    "snoop" on ICP messages.  If enabling multicast, cache administrators
  1053.    should configure the application to use the minimum required multi-
  1054.    cast TTL, using a tool such as mtrace[6].  Note that the IP Encapsu-
  1055.    lating Security Payload [7,9] mechanism can be used to provide pro-
  1056.    tection against eavesdropping of ICP messages.
  1057.  
  1058.    Eavesdropping on ICP traffic can provide third parties with a list of
  1059.    URLs being browsed by cache users.  Because the Requestor Host
  1060.  
  1061.  
  1062.  
  1063. Wessels & Claffy                                               [Page 19]
  1064.  
  1065. Internet-Draft                                               27 May 1997
  1066.  
  1067.  
  1068.    Address is zero-filled by Squid and Harvest, the URLs cannot be
  1069.    mapped back to individual host systems.
  1070.  
  1071.    By default, Squid and Harvest do not send ICP messages for URLs con-
  1072.    taining `cgi-bin' or `?'.  These URLs sometimes contain sensitive
  1073.    information as argument parameters.  Cache administrators need to be
  1074.    aware that altering the configuration to make ICP queries for such
  1075.    URLs may expose sensitive information to outsiders, especially when
  1076.    multicast is used.
  1077.  
  1078.  
  1079. 9.4.  Blocking ICP messages
  1080.  
  1081.    Intentionally blocked (or discarded) ICP queries or replies will
  1082.    appear to reflect link failure or congestion, and will prevent the
  1083.    use of a neighbor as well as lead to timeouts (see section 5.1.4).
  1084.    If all messages are blocked, the cache will assume the neighbor is
  1085.    down and remove it from the selection algorithm.  However, if, for
  1086.    example, every other query is blocked, the neighbor will remain
  1087.    "alive," but every other request will suffer the ICP timeout.
  1088.  
  1089.  
  1090. 9.5.  Delaying ICP messages
  1091.  
  1092.    The neighbor selection algorithm normally waits for all ICP MISS
  1093.    replies to arrive.  Delaying queries or replies, so that they arrive
  1094.    later than they normally would, will cause additional delay for the
  1095.    subsequent HTTP request.  Of course, if messages are delayed so that
  1096.    they arrive after the timeout, the behavior is the same as "blocking"
  1097.    above.
  1098.  
  1099.  
  1100. 9.6.  Denial of service
  1101.  
  1102.    A denial-of-service attack, where the ICP port is flooded with a con-
  1103.    tinuous stream of bogus messages has three vulnerabilities:
  1104.  
  1105.    o    The application may log every bogus ICP message and eventually
  1106.         fill up a disk partition.
  1107.  
  1108.    o    The socket receive queue may fill up, causing legitimate mes-
  1109.         sages to be dropped.
  1110.  
  1111.    o    The host may waste some CPU cycles receiving the bogus messages.
  1112.  
  1113.  
  1114.  
  1115.  
  1116.  
  1117.  
  1118.  
  1119. Wessels & Claffy                                               [Page 20]
  1120.  
  1121. Internet-Draft                                               27 May 1997
  1122.  
  1123.  
  1124. 9.7.  Altering ICP fields
  1125.  
  1126.    Here we assume a third party is able to change one or more of the ICP
  1127.    reply message fields.
  1128.  
  1129.    Opcode
  1130.  
  1131.       Changing the opcode field is much like inserting bogus messages
  1132.       described above.  Changing a hit to a miss would prevent the peer
  1133.       from being used.  Changing a miss to a hit would force the peer to
  1134.       be used.
  1135.  
  1136.    Version
  1137.  
  1138.       Altering the ICP version field may have unpredictable consequences
  1139.       if the new version number is recognized and supported.  The
  1140.       receiving application should ignore messages with invalid version
  1141.       numbers.  At the time of this writing, both version numbers 2 and
  1142.       3 are in use.  These two versions use some fields (e.g. Options)
  1143.       in a slightly different manner.
  1144.  
  1145.    Message Length
  1146.  
  1147.       An incorrect message length should be detected by the receiving
  1148.       application as an invalid ICP message.
  1149.  
  1150.    Request Number
  1151.  
  1152.       The request number is often used as a part of the cache key.  Har-
  1153.       vest does not use the request number.  Squid uses the request num-
  1154.       ber in conjunction with the URL to create a cache key.  Altering
  1155.       the request number will cause a lookup of the cache key to fail.
  1156.       This is similar to blocking the ICP reply altogether.
  1157.  
  1158.       There is no requirement that a cache use both the URL and the
  1159.       request number to locate HTTP requests with outstanding ICP
  1160.       queries (however both Squid and Harvest do).  The request number
  1161.       must always be the same in the query and the reply.  However, if
  1162.       the querying cache uses only the request number to locate pending
  1163.       requests, there is some possibility that a replying cache might
  1164.       increment the request number in the reply to give the false
  1165.       impression that the two caches are closer than they really are.
  1166.       In other words, assuming that there are a few ICP requests "in
  1167.       flight" at any given time, incrementing the reply request number
  1168.       trick the querying cache into seeing a smaller round-trip time
  1169.       than really exists.
  1170.  
  1171.    Options
  1172.  
  1173.  
  1174.  
  1175. Wessels & Claffy                                               [Page 21]
  1176.  
  1177. Internet-Draft                                               27 May 1997
  1178.  
  1179.  
  1180.       There is little risk in having the Options bitfields altered.  Any
  1181.       option bit must only be set in a reply if it was also set in a
  1182.       query.  Changing a bit from clear to set is detectable by the
  1183.       querying cache, and such a message must be ignored.  Changing a
  1184.       bit from set to clear is allowed and has no negative side effects.
  1185.  
  1186.    Option Data
  1187.  
  1188.       ICP_FLAG_SRC_RTT is the only option which uses the Option Data
  1189.       field.  Altering the RTT values returned here can affect the
  1190.       neighbor selection algorithm, either forcing or preventing the use
  1191.       of a neighbor.
  1192.  
  1193.    URL
  1194.  
  1195.       The URL and Request Number are used to generate the cache key.
  1196.       Altering the URL will cause a lookup of the cache key to fail, and
  1197.       the ICP reply to be entirely ignored.  This is similar to blocking
  1198.       the ICP reply altogether.
  1199.  
  1200.  
  1201. 9.8.  Summary
  1202.  
  1203.    o    ICP_OP_HIT_OBJ is particularly vulnerable to security problems
  1204.         because it includes object data.  For this, and other reasons,
  1205.         its use is discouraged.
  1206.  
  1207.    o    Falsifying, altering, inserting, or blocking ICP messages can
  1208.         cause an HTTP request to fail only in two situations:
  1209.  
  1210.         -    If the cache is behind a firewall and cannot directly con-
  1211.              nect to the origin server.
  1212.  
  1213.         -    If a false ICP_OP_HIT reply causes the HTTP request to be
  1214.              forwarded to a sibling, where the request is a cache miss
  1215.              and the sibling refuses to continue forwarding the request
  1216.              on behalf of the originating cache.
  1217.  
  1218.    o    Falsifying, altering, inserting, or blocking ICP messages can
  1219.         easily cause HTTP requests to be forwarded (or not forwarded) to
  1220.         certain neighbors.  If the neighbor cache has also been compro-
  1221.         mised, then it could serve bogus content and pollute a cache
  1222.         hierarchy.
  1223.  
  1224.    o    Blocking or delaying ICP messages can cause HTTP request to be
  1225.         further delayed, but still satisfied.
  1226.  
  1227.  
  1228.  
  1229.  
  1230.  
  1231. Wessels & Claffy                                               [Page 22]
  1232.  
  1233. Internet-Draft                                               27 May 1997
  1234.  
  1235.  
  1236. 10.  References
  1237.  
  1238.    [1] Fielding, R., et. al, "Hypertext Transfer Protocol -- HTTP/1.1",
  1239.    RFC 2068, UC Irvine, January 1997.
  1240.  
  1241.    [2] Berners-Lee, T., Masinter, L., and M. McCahill, "Uniform Resource
  1242.    Locators (URL)", RFC 1738, CERN, Xerox PARC, University of Minnesota,
  1243.    December 1994.
  1244.  
  1245.    [3] Bowman M., Danzig P., Hardy D., Manber U., Schwartz M., and Wes-
  1246.    sels D., "The Harvest Information Discovery and Access System",
  1247.    Internet Research Task Force - Resource Discovery, http://har-
  1248.    vest.transarc.com/.
  1249.  
  1250.    [4] Wessels D., Claffy K., "ICP and the Squid Web Cache", National
  1251.    Laboratory for Applied Network Research, http://www.nlanr.net/~wes-
  1252.    sels/Papers/icp-squid.ps.gz.
  1253.  
  1254.    [5] Wessels D., "The Squid Internet Object Cache", National Labora-
  1255.    tory for Applied Network Research, http://squid.nlanr.net/Squid/
  1256.  
  1257.    [6] mtrace, Xerox PARC, ftp://ftp.parc.xerox.com/pub/net-
  1258.    research/ipmulti/.
  1259.  
  1260.    [7] Atkinson, R., "Security Architecture for the Internet Protocol",
  1261.    RFC 1825, NRL, August 1995.
  1262.  
  1263.    [8] Atkinson, R., "IP Authentication Header", RFC 1826, NRL, August
  1264.    1995.
  1265.  
  1266.    [9] Atkinson, R., "IP Encapsulating Security Payload (ESP)", RFC
  1267.    1827, NRL, August 1995.
  1268.  
  1269.  
  1270. 11.  Acknowledgments
  1271.  
  1272.    The authors wish to thank Paul A Vixie <paul@vix.com> for
  1273.    providing excellent feedback on this document,
  1274.    Martin Hamilton <martin@mrrl.lut.ac.uk> for pushing the
  1275.    development of multicast ICP, and Eric Rescorla <ekr@terisa.com>
  1276.    and Randall Atkinson <rja@home.net> for assisting with security issues.
  1277.  
  1278.  
  1279. 12.  Author's Addresses:
  1280.  
  1281.    Duane Wessels
  1282.    National Laboratory for Applied Network Research
  1283.    10100 Hopkins Drive
  1284.  
  1285.  
  1286.  
  1287. Wessels & Claffy                                               [Page 23]
  1288.  
  1289. Internet-Draft                                               27 May 1997
  1290.  
  1291.  
  1292.    La Jolla, CA 92093
  1293.    wessels@nlanr.net
  1294.  
  1295.    K Claffy
  1296.    National Laboratory for Applied Network Research
  1297.    10100 Hopkins Drive
  1298.    La Jolla, CA 92093
  1299.    kc@nlanr.net
  1300.  
  1301.  
  1302.  
  1303.  
  1304.  
  1305.  
  1306.  
  1307.  
  1308.  
  1309.  
  1310.  
  1311.  
  1312.  
  1313.  
  1314.  
  1315.  
  1316.  
  1317.  
  1318.  
  1319.  
  1320.  
  1321.  
  1322.  
  1323.  
  1324.  
  1325.  
  1326.  
  1327.  
  1328.  
  1329.  
  1330.  
  1331.  
  1332.  
  1333.  
  1334.  
  1335.  
  1336.  
  1337.  
  1338.  
  1339.  
  1340.  
  1341.  
  1342.  
  1343. Wessels & Claffy                                               [Page 24]
  1344.  
  1345.