Users are increasingly accessing content, such as video files and live streaming/video on demand content, via the Internet. When problems arise in that content distribution, it would be desirable to have access to detailed information from the users' clients. Unfortunately, at the scale of potentially millions of concurrent clients, it is infeasible to send complete logging information from all clients at all times.
Various embodiments of the invention are disclosed in the following detailed description and the accompanying drawings.
The invention can be implemented in numerous ways, including as a process; an apparatus; a system; a composition of matter; a computer program product embodied on a computer readable storage medium; and/or a processor, such as a processor configured to execute instructions stored on and/or provided by a memory coupled to the processor. In this specification, these implementations, or any other form that the invention may take, may be referred to as techniques. In general, the order of the steps of disclosed processes may be altered within the scope of the invention. Unless stated otherwise, a component such as a processor or a memory described as being configured to perform a task may be implemented as a general component that is temporarily configured to perform the task at a given time or a specific component that is manufactured to perform the task. As used herein, the term ‘processor’ refers to one or more devices, circuits, and/or processing cores configured to process data, such as computer program instructions.
A detailed description of one or more embodiments of the invention is provided below along with accompanying figures that illustrate the principles of the invention. The invention is described in connection with such embodiments, but the invention is not limited to any embodiment. The scope of the invention is limited only by the claims and the invention encompasses numerous alternatives, modifications and equivalents. Numerous specific details are set forth in the following description in order to provide a thorough understanding of the invention. These details are provided for the purpose of example and the invention may be practiced according to the claims without some or all of these specific details. For the purpose of clarity, technical material that is known in the technical fields related to the invention has not been described in detail so that the invention is not unnecessarily obscured.
Examples of clients include personal computers (170), laptops (182), cellular phones/personal digital assistants (178), and other types of information appliances (not shown), such as set-top boxes, game consoles, broadband routers, file servers, video servers, and digital video recorders, as applicable. The clients shown are used by subscribers to various Internet service providers (ISPs). For example, clients 170, 172, and 174 are subscribed to SP1 (122), while clients 176, 178, and 180 are subscribed to SP2 (124), and clients 182 and 184 are subscribed to SP3 (126).
In the example shown, a movie studio (“Studio”) has contracted with content distributor 142 to provide downloadable copies of its films in exchange for a fee. Similarly, a television network (“XYZ”) has contracted with content distributors 142-146 to provide viewers with access to live streams of its broadcasts as well as streams of television show episodes and sporting events. In some cases, the content distributor is owned/operated by the content owner.
Content distributor 142 has a data center that is provided with network access by backbone ISP 132. Though represented here by a single node (also referred to herein as a “CDN node”), content distributor 142 may typically have multiple data centers (not shown) and may make use of multiple backbone or other ISPs. Content distributor 144 has a data center that is provided with network access by backbone ISP 134. Advertisements are served to various clients via ad servers 150-152.
Suppose a user of client 172 (hereinafter “Alice”) would like to watch a live soccer game owned by XYZ. Client 172 includes a web browser application. Alice uses the web browser application to navigate to a portal owned by XYZ, such as “http://xyztvnetwork.com/livegames.” Her request for the game is directed to a CDN node that is closest to her. In this case, CDN 146 is the fewest hops away from her client. Her client then begins streaming the content from CDN 146, which is in turn rendered in her browser (e.g., via a Flash or Silverlight player). Advertisements, associated with the portal, are served to her by ad server 150.
In addition to CDN 146 and ad server 150, Alice's client is also in communication with content distribution monitor 102. As will be described in more detail below, client 172 provides status information (also referred to variously herein as a “heartbeat,” as “content distribution performance information,” “telemetry information,” and “log information”), on a recurring basis, to content distribution monitor 102.
The status information includes a variety of telemetry data such as information that captures the quality of the user experience (e.g., video stream quality), and information pertaining to user behavior. Examples of quality metrics include: failed connection attempts, the length of time it takes for the soccer game video to start playing, the number of buffering events (if any), the length of buffering events, the number of frames per second rendered by the video player, and premature connection terminations. Examples of user behavior include: starting and stopping playing a video or audio stream, seeking within the stream, switching the player to full screen mode, minimizing/restoring the player, a change in the volume level of the player, and clicking on an advertisement.
As other users of clients 170-184 request content, their respective players similarly obtain content from content sources such as CDN 144, communicate status information to content distribution monitor 102, and receive commands. Such players may be browser-based as with Alice's, or they may be standalone applications, as applicable. In various embodiments, all clients in the environment provide status information to content distribution monitor 102.
Different clients can provide content distribution monitor 102 with different levels of detail, and can also do so with differing frequency. For example, client 178 is a smartphone with less powerful hardware than client 172 and more limited bandwidth. It is configured to provide less information to content distribution monitor 102 than client 172 and also does so less frequently than client 172. As will be described in more detail below, a given client can also be configured to dynamically adjust the amount of information it collects, the amount of information it sends, and the frequency with which the information is sent.
Content distribution monitor 102 collects and processes the information received from Alice's client along with other clients. The collected information is made available in real-time to control entities/operators and can be used to detect and remedy problems in the content distribution. Examples of such problems include excessive buffering, freezing, and frame skipping. Additional information pertaining to delivery resources (e.g., CDN 142) and network providers (e.g., ISP 126) is also made available, as is other information pertaining to clients such as demographic information.
In the example shown in
Examples of Client Architecture
In various embodiments, collection of status information and reporting of that information to the content distribution manager is performed by a “monitoring module” included in the client. The monitoring module can also receive commands, such as from content distribution monitor 102 to adjust a level or frequency of reporting.
In the example shown, module 206 is implemented in ActionScript and deployed as an SWF library that is dynamically loaded by player 204. In Flash, the NetStream( ) class is mainly responsible for streaming, buffering, and playing the video. The monitor is implemented as an element in the content player which wraps the video element, and provides the same interface as the video element.
Module 206 can also be implemented using other approaches, such as in the .NET platform for Silverlight and deployed as a DLL library that is dynamically loaded by player application 204. In Silverlight, the MediaElement( ) class is mainly responsible for streaming, buffering, and playing the video. The monitor is implemented as an element in the content player which wraps the video element, and provides the same interface as the video element.
Examples of some of the information collected by monitoring module 206 include the following, expressed in key-value pairs:
As explained above, the monitoring module can be implemented in a variety of ways. For example, the monitoring module can be included in the client's player by the author of the player. The monitoring module can also extend the functionality of an existing player, such as by being implemented as a plugin, library, or standalone application (e.g., a helper application). Various examples of techniques for integrating a monitoring module with an existing player will now be described.
In one embodiment, the monitoring module is a wrapper around the lowest level streamer module (e.g., “NetStream” in Flash, or “MediaElement” in Silverlight). The player uses the wrapper, which provides the same or enhanced version of the API provided by the streamer module, to stream video. Logic in the wrapper captures the appropriate telemetry data.
Example: “ConvivaNetStream” extends and wraps “NetStream”:
In a second embodiment, the monitoring module exists as a side attachment and is not present in the code path for streaming to occur. The player passes the streamer module to the monitoring module either directly or through a proxy module. The monitoring module reads properties and listens for events from the streamer module or proxy module to collect data. The proxy module method prevents the monitoring module from interfering with the streaming.
Example 1.
Example 2. “NetStreamProxy” wraps “NetStream,” but prohibits any calls that may adversely impact “NetStream”:
In a third embodiment, the monitoring module is built into the streamer module. The player uses the streamer module. The monitoring module within collects data.
Example:
Additional Status Information Examples
As mentioned above, clients downloading/streaming content from content providers are also in communication with content distribution monitor 102 on a recurring, time-driven basis. In some embodiments, each heartbeat contains a snapshot of the session state at the time the heartbeat was sent out and a summary of the events and measurements since the last heartbeat or since the start of the session, as applicable. Examples of information that can be included in a heartbeat (though need not be present in every heartbeat) include the following:
At 304, at least a portion of the obtained information is reported to a content distribution monitoring server. For example, at 304, client 172 sends a heartbeat to content distribution monitor 102, including some or all of the information collected at 302. Information sent at 304 can also include processed results such averages and minimums, instead of or in addition to raw data.
In various embodiments, the process shown in
The amount of data reported by the client in a heartbeat to content distribution monitor 102 can affect the scalability of the content distribution monitor. The amount of data collected and reported by the client can also potentially impact the performance of the client. If the client is otherwise resource constrained (e.g., due to other processes or due to hardware limitations), adjustments can be made as to how much information is collected and with what frequency. For example, suppose the buffer size is expected to be of size three seconds. The time period employed by the monitoring module can be set to one second or a few hundred milliseconds. The adjustment can be dynamically adjusted as needed. The period can be decreased if the buffer grows and increased if the buffer shrinks, thus minimizing overhead while still being able to detect a low buffer size which can impact the video quality.
The amount of data sent can also be adjusted. Two example parameters for doing so include: the heartbeat “period,” and the size of heartbeats, both of which can be adaptively changed by the client, the content distribution monitor, or a combination of the client and the content distribution monitor, as needed. As one example, if the quality experienced by the client is acceptable, the client may reduce the heartbeat frequency. This can entail collecting state information less frequently and can also entail sending collected information less frequently. If the quality degrades, the client can increase the heartbeat frequency accordingly. As one example, client 172 can employ a rule that, as long as the buffering ratio is less than or equal to 0.5%, the heartbeat period is 30 seconds. If the buffering ratio is between 0.5% and 1%, the heartbeat period is adjusted to 20 seconds. If the buffering ratio is equal to or greater than 1%, the heartbeat period is adjusted to 10 seconds.
Content distribution monitor 102 can direct client 172 to increase or decrease the heartbeat frequency based on factors such as the current load on the content distribution monitor (or applicable component thereof). For example, if the load on content distribution monitor 102 exceeds a predefined threshold, clients are instructed to increase the heartbeat interval and/or reduce the detail of the information sent in a heartbeat. As one example, content distribution monitor 102 can employ a rule that, if its resource utilization exceeds 80%, clients are instructed to double their respective heartbeat intervals. Monitor 102 can also selectively send such instructions to clients. For example, clients with periods under 30 seconds can be instructed to double their periods, while clients with periods above 30 seconds are not sent such instructions. As another example, when monitor 102's utilization exceeds 80%, it can instruct clients to reduce heartbeat size by sending less information. This can be less detailed information (e.g., sending only the number of resource switches, instead of the detailed information about these switches), or can include aggregate measurements about certain events instead of sending individual details. If the client is already aggregating certain information, the measurements can be aggregated over a longer time interval (e.g., 10 seconds instead of 2 seconds). Additional examples follow.
Additional discussion regarding the dynamic adjustment of data collection and reporting is provided below.
Inferring State Information
In some cases, the monitoring and reporting functionality described herein as being provided by a client is wholly integrated with the player itself. For example, Studio might make available a custom player application that can be installed on a client by users that want to watch Studio films. The custom player includes all of the necessary logic to provide complete heartbeat information, and also includes logic for communicating with the content distribution monitor, adjusting the frequency with which status information is communicated to the content distribution monitor, and other functionality described herein. However, depending on the player deployed on a client, not all of the example heartbeat information described above may be directly accessible for collection and transmission. For example, the Flash player plugin used by Alice to view the soccer game does not provide direct access to its state. Using the techniques described herein, content distribution monitor 102 can nonetheless be provided with the state of the player.
In some embodiments, a monitoring module is embedded in the content player deployed on the client. For example, when Alice directs her browser to XYZ's website, a custom Flash-based player is loaded. The custom player has direct access to the API of the video plugin. Possible states of the player are as follows:
In the case of the aforementioned Flash player, NetStatus events provided by the player can be used to infer the state, as described below:
In addition to the player states described above, an additional state can also be inferred:
In addition to the player states, the monitoring module monitors various metrics, including the number of bytes downloaded/streamed since the session started, the bitrate of the stream, and the rendering rate.
Some players, such as the Flash 9 plugin, do not provide a direct API from which the number of bytes streamed/downloaded or the stream bitrate. Nonetheless, a variety of techniques can be used to obtain or estimate the bitrate. As one example, the developer of the player might expose the bitrate through an API call.
Another technique for obtaining a bitrate is to use metadata associated with the content. For example, suppose metadata is made available through a configuration file associated to the content. The configuration resides on an origin server such as origin server 198 and also includes other information such as the title of the content, its genre, and a list of CDNs where the content is available.
Yet another technique for obtaining a bitrate is to examine the content URL. For example, a movie might be accessible at the URL http://www.CDN-C.com/Studio/JaneEyre300 Kbps. In this case, the bitrate of the content is likely to be 300 Kbps.
An estimation of the stream bitrate can also be made. The estimation, along with the amount of time the player was in the playing state, and the size of the buffer, are used to estimate the number of bytes downloaded/streamed. As one example, suppose a player streamed data at 400 Kbps, was in a playing state for 315 seconds, and at the time of taking the measurement the buffer size contained data for playing another 15 seconds. The total number of bytes downloaded is: 400 Kbps*(315 seconds+15 seconds)=16 MB.
In the event that the bitrate is available through multiple of the above techniques, in various embodiments each applicable approach is used, in a specified order, until a valid bitrate (e.g., greater than 0 and less than 10,000 kbps) is obtained.
The number of bytes downloaded can be estimated as (totalPlayTime+bufferLength)*bitrate. If multiple bitrates are used, in some embodiments the bytes downloaded is estimated as the sum of totalPlayTime[bitrate]*bitrate+bufferLength*currentBitrate.
Rendering quality is another example metric that can be obtained and provided to monitor 102. Rendering quality is the ratio between the frames per second (FPS) rendered by the player and the FPS at which the stream was encoded.
Some players do not directly provide the information needed to compute the rendering quality. For example, Flash 9 has an API that exposes rendered frames per second, but not encoded frames per second. One technique to compute the encoded FPS, in such a scenario, is as follows. The rendering FPS is measured and an assumption is made that the encoded FPS is the maximum FPS observed over the course of the session. Another technique is to estimate the encoded FPS as the maximum of a three second sliding average of rendered FPS sampled five times a second.
In order to ensure accurate accounting of the player status over the course of the session, it is important to determine the time intervals when the system is in sleep or suspend mode. These intervals can be detected using notification APIs provided by the system for this purpose. For systems that do not provide such API (e.g., Flash Player, or Silverlight), the intervals can be estimated by setting a timer to fire at periodic intervals (e.g., every 1 second). At each firing of the timer the current system time is recorded, and the time elapsed since the last firing is computed. If the time elapsed is greater than a given threshold (e.g., 10 seconds), an inference is made that the given elapsed time interval was spent in sleep or suspend mode.
Inferring Player Capability Information
The following are example player capabilities that impact the quality of the video experience: processing speed, video rendering capabilities, amount of memory available, and amount of bandwidth available.
For platforms whose API does not provide direct reading of processing speed capabilities, the monitoring module can derive it by using a timer to measure the time required to perform a fixed CPU-intensive computation.
Clients 404-412 each include a monitoring module that collects status information. When the monitoring module on a client is activated, the client is mapped to a dispatcher server. As one example, when the monitoring module starts, it reads a configuration file that includes a list of dispatcher servers. The monitoring module selects a dispatcher server at random from the list.
A dispatcher server (414) includes two conceptual modules. The first module implements a communication interface for receiving status information from clients. In some embodiments the module is implemented using an off-the-shelf web server, and allows clients to connect over the HTTP protocol (and also allows clients to securely communicate via SSL). Data received by the first module is passed to the second module. The second module normalizes the data (to a format suitable for further processing) and passes the normalized data to a real-time stream processing component (416).
The real-time stream processing (RSP) layer includes an optimized software component that processes the telemetry data that it receives from the dispatcher in real-time. A dispatcher sends all heartbeats belonging to the same session to the same RSP component.
In some embodiments the RSP component is implemented as a continuously running service that reads and processes the telemetry data received from dispatchers via the network over TCP. The telemetry data stream comprises individual records, each of which represents the telemetry data sent by the monitoring module. The RSP component reads network data one record at a time and parses the data into a local data representation. The data received by the RSP component can be stored as in-memory hash tables of records allowing fast execution, and very high throughputs. Since the RSP component does not require old information, it can periodically purge the in-memory hash tables and increase scalability accordingly. In other embodiments, optimized in-memory databases are used.
A mapping function to map heartbeats having a session identifier “ID” to a particular RSP component “i” is as follows:
i=hash(ID) mod m,
where hash( ) is a hash function and “m” is the total number of RSP components.
Once an RSP component parses the data records, it performs two main tasks.
First, it performs data filtering. A filter is a logical expression and is installed at each RSP component instance. As one example, the following filter would identify viewers located in San Francisco, connected to ISP SP1, streaming from CDN A, one of two particular shows:
(city=“San Francisco” AND ISP=“SP1” AND CDN=“CDN A” AND ((show=“NewsAt10”) OR (show=“SundayMagazine”))
For each message of incoming telemetry data, the (key, value) pairs in the record are matched against the filter. If the filter is matched, the data is associated with the filter.
The second task performed is to compute snapshots and on-line statistics over the telemetry data matching each filter. One example of a snapshot is the number of players that are in a particular state (e.g., “playing”). The RSP component generates sequences of these snapshots (e.g., one every second). Examples of statistics computed by the RSP component include: the average number of bytes played over all video streams matching a filter over a given time interval (e.g., 10 seconds) and the minimum frames per second experienced by a stream matching a filter over a time interval. Snapshots and statistics are updated continuously, from new telemetry data received from clients.
The RSP component provides its computed snapshots and statistics to a real-time global aggregation component (418). The real-time global aggregation (RGA) component aggregates the information provided by the RSP component for each filter specified by a user.
As explained above, each RSP component (416) receives (via a dispatcher) telemetry data from a subset of the monitoring modules and calculates snapshots and statistics for all filters. Each RGA component instance is in turn responsible for a subset of the filters. Based on the identifier of the filter, all RSP components send data for that filter to a single RGA component. The RGA component combines the data from all RSP components for the filters that it is responsible for, resulting in a global snapshot and statistics based on information from all monitoring modules. Examples of aggregation operations performed by an RGA component include: counting the total number of viewers that match a particular filter, determining the percentage of viewers matching a given filter that are in buffering state, the join time distribution experienced by viewers joining a given stream, the current number of viewers in a given city, the rank of the most popular live events, and so on.
In some embodiments an RGA component's functionality is implemented as a continuously running service. It reads records sent by the RSPs asynchronously, thus achieving a high throughput. The RGA component stores the records it receives in in-memory hash tables allowing optimized access for real-time processing. Old information is periodically purged from the hash tables to improve efficiency.
As shown in
Gateway 422 also provides access controls and persistently stores the information regarding the API requests, data access and presentation policies, and filter descriptions. The information is maintained in a persistent database, such as mySQL or Oracle database.
Automatically Detecting and Resolving Content Distribution Problems
As explained above, content distribution monitor 102 aggregates telemetry information from all clients, processes the information, and makes available multi-dimensional results in real-time. Examples of dimensions include:
Using the techniques herein, real-time, granular information such as the quality experienced by viewers located in Denver, connected to SP2, and streaming videos from CDN B, using Flash Player 10 can be tracked. Further, by aggregating and correlating the data it receives from all clients, content distribution monitor 102 exposes, in real-time, the performance of content sources and network providers (ISPs). Problems in content delivery can be automatically detected by examining the results.
Suppose a content owner, such as Studio-A, distributes its content via a single CDN, such as CDN C. Suppose that the content is encoded at multiple bitrates B1 and B2 where B1<B2. If a client A is able to sustain the download rate, but detects problems rendering the frames, an inference can be made that the client A likely has problems with its CPU utilization. An example of performing such an inference follows.
Observe the client buffer size over a period of time T (e.g., T=10 seconds) when the client is streaming at bitrate B2. Observe the rendering quality measured using dropped frames reported by the player. If the client buffer size is greater than B threshold (e.g., B_threshold=0.5*B_max) at all times during the period of observation, and the rendering quality is less than R_threshold_1 (say, R_threshold_1=0.6), then a conclusion can be made that the client cannot sustain displaying bit-rate B2 due to CPU issues on the client.
Perform the same observation with the client playing at bitrate B1. If the client buffer size is greater than B threshold (e.g., B_threshold=0.5*B_max) at all times during the period of observation, and the rendering quality is greater than R_threshold_2 (e.g., R_threshold_2=0.75), then a conclusion can be made that the client can sustain displaying bit-rate B1.
A numerical example is now provided. Consider a setting where a client streams a 1 Mbps stream for 10 seconds with buffer size varying between 9 and 10 seconds. Suppose that B_max is 10 seconds and B_threshold is 5 seconds. Assume that the rendering quality at 1 Mbps is 0.55 over this interval. When the client plays a 500 kbps stream instead, the buffer size is in the same range (9-10 seconds), but the rendering quality is 0.9 instead. Then, assuming that R_threshold_1=0.6 and R_threshold_1=0.75, a conclusion can be made that the client can sustain 500 kbps but not 1 Mbps.
Suppose a content owner, such as Studio-A, distributes its content via two CDNs, such as CDN D and CDN E. If a client A is able to sustain the download rate from CDN D, but not CDN E, then the client can conclude that CDN E has problems streaming to client A. An example of performing such an inference follows.
Compute an aggregate quality metric Q using various measurements from the client over a time T (e.g., T=60 seconds). Examples of measurements which can be directly used as the metric Q across a group of clients over a time T include:
If the quality Q is greater than a threshold T1 (e.g., T1=0.95) for CDN D, but lower than another threshold T2 (e.g., T2=0.50) for CDN E, then a conclusion can be made that CDN E has problems streaming to client A.
One example remedial action that can be taken at the client is to select CDN D for streaming the current stream, or use it first for future streams.
A numerical example is provided. Consider a setting where a client M streams from CDN D and experiences a buffering ratio of 0.5 over K1 attempts and time T1. Also, client M streams from CDN E, and over K2 attempts and time T2 experiences a buffering ratio of 0.02. In this case, given that K1 and K2 are above a threshold (e.g., both greater than 2), and T1 and T2 are above a threshold (e.g., both are greater than 10 minutes), a conclusion can be made that CDN D has problems streaming to the client. A further refinement can be performed by computing the buffering ratio for each of the K1 (or K2) streaming attempts from the CDNs to the client. In this case, it can be stated that CDN D has problems streaming to client M if more than 75% of the attempts from CDN D (out of the K1 attempts) have buffering ratio greater than 0.5, and more than 75% of the attempts from CDN D have buffering ratio less than 0.02.
Suppose a content owner, such as Studio XYZ, distributes its content via a single CDN, such as CDN C. The CDN comprises several geographically distributed servers. As clients request content, they are assigned to a particular server based on their geographical location. If many clients at the same geographical location, but using different ISPs, experience quality problems, an inference can be made that the CDN servicing that geographical location is having a problem. Note that since XYZ also uses the services of CDN C, the experiences of clients obtaining XYZ's content from the same location can be included in the analysis. One way this analysis can be implemented on content distribution monitor 102 is as follows.
First, obtain location and network information for all clients. Examples of location information include city, state, country, DMZ code, and geographic coordinates. The location information can be obtained in a variety of ways, such as by providing the client's IP address to a geo-location service such as Quova. Also obtain network information such as Autonomous System Number (ASN) information and ISP information for the client.
Second, group clients based on their ASN and one geographic attribute, such as DMZ code, city, or state. Let G(ASN1, Geo1) denote the set of clients connected to a specific ASN, ASN1, which have the same geographic attribute value, Geo1.
Third, compute an aggregate quality Q for each group G(ASN, Geo) over last T seconds. Denote this aggregate quality by Q(G(ASN, Geo)). Examples of quality metrics are provided above.
Finally, for each Geo attribute value Geo1, check whether there are at least two group of clients connected via different ASNs. If the aggregate quality of a certain fraction F of the groups is greater than a threshold BufferingThreshold1, then conclude that the CDN is experiencing problems serving the clients at location Geo1. In some embodiments a minimum group size is defined so that only groups having a number of clients larger than a given threshold are considered. As one example, the fraction F is selected between 0.75 and 1.
A numerical example is now provided. Consider a system setting where BufferingThreshold1=0.1, MinGroupSize=200, and F=1.0. Based on an analysis of their IP addresses, 20,000 viewers are determined to be located in San Francisco, connected to CDN C, and watching a new release by Studio. Assume 5,000 clients are connected to ASN1 belonging to SP1; 5,000 clients are connected to ASN2 belonging to SP2; 9,900 clients are connected to ASN3 belonging to SP3; and 100 clients are connected to ASN4 which belongs to a wireless company. Four groups exist: G(SF, ASN1), G(SF, ASN2), G(SF, ASN3), and G(SF, ASN4), respectively.
Each client reports for each session (a) the total time it spent in buffering during every 10 second interval and (b) the total playing time during the same 10 second interval. For example, suppose a user Charlie has the IP address 1.2.3.4 which belongs to ASN1, and watches the stream with the URL rtmp://www.CDNC.example.com/12346/video.flv. Charlie reports in a particular heartbeat that he has experienced 1 second of buffering and 9 seconds of playing time. Another user, Bob, has the IP address 2.3.4.5 which belongs to ASN3, and watches the stream with the same URL. Bob reports in a particular heartbeat that he has experienced 0.5 seconds of buffering and 5 seconds of playing time. Bob's player spent the remaining 5 seconds in pause state. The pause time is not used in the computation of the buffering ratio.
Content distribution monitor 102 computes over each interval of time T=5 minutes, the aggregate average buffering ratio, defined as the (1) the total buffering time experienced by all sessions in a group during T divided by (2) the total playing time over all sessions in the group during the same time interval T. The aggregate quality ratio for each of the four groups is as follows:
Q(G(SF, ASN1))=0.14, Q(G(SF, ASN2))=0.21, Q(G(SF, ASN3))=0.18, Q(G(SF, ASN4))=0.04.
Since the number of clients in G(SF, ASN4) is less than MinGroupSize, the diagnosis analysis ignores this group. Also, since the buffering ratio of all remaining groups is greater than BufferingThreshold1, a conclusion is made that CDN C experiences quality issues serving clients in San Francisco.
Suppose the above example is modified such that ASN4 has 1000 clients, and Q(G(SF, ASN1))=0.02, Q(G(SF, ASN2))=0.21, Q(G(SF, ASN3))=0.18, Q(G(SF, ASN4))=0.04. In this case, an inference can be made that CDN C does not experience quality issues serving clients in San Francisco in general. The problem can then be narrowed down further and smaller or different sets of clients investigated, such as clients that are connected to ASN1 served by CDN C.
Suppose a content owner, such as Studio XYZ, distributes its content via a single CDN, such as CDN C. If the quality of clients at the same location but using different ISPs is very different, an inference can be made that the quality problems experienced by the clients are due to the ISP (and not due to the CDN). One way this analysis can be implemented on content distribution monitor 102 is as follows.
Perform the first three steps of the previous diagnosis (describing the diagnosis of CDN quality issues). As a final step, let G(ASN1, Geo1) be a group experiencing low quality. If there is at least another group, G(ASN2, Geo1) at the same location experiencing high quality, then conclude that ASN1 is the cause of quality issues. In particular, a conclusion that ASN2 has quality issues is reached if, and only if, Q(G(ASN2, Geo1))−Q(G(ASN1, Geo1))>BufferingRatioDiscrepancy.
A numerical example is now provided. Consider a system setting where BufferingRatioDiscrepancy=0.1. Suppose 5,000 viewers are determined to be located in New York, connected to ASN1, and streaming a baseball game from CDN C. Another 4,000 viewers in New York are connected to ASN2 and streaming the same game from CDN C.
Each client reports for each session (a) the total time it spent in buffering during every 10 second interval and (b) the total playing time during the same 10 second interval. The aggregate quality ratio for each group as computed by content distribution monitor 102 is: Q(G(NY, ASN1))=0.14, and Q(G(NY, ASN2))=0.03, respectively.
Since Q(G(SF, ASN1))−Q(G(SF, ASN2))>BufferRatioDiscrepancy, the quality issues are pinpointed as being ASN1.
Suppose a content owner, such as XYZ, distributes its content via multiple CDNs (e.g., CDN A, CDN B, and CDN C). If clients at the same location and using the same ISP experience significantly different quality when connected to different CDNs, the difference in quality can be attributed to CDNs. One way this analysis can be implemented on content distribution monitor 102 is as follows.
First, obtain location and network information for all clients. Second, classify each client based on its ASN, the CDN it gets data from, and one of its geographic attributes (e.g., DMZ code, city, or state). Let G(ASNi, CDN1, Geoi) denote the set of clients connected to a specific ASN and a geographic region (e.g., for i=1, 2, 3, 4, 5), getting data from the same CDN, CDN1. One way of determining the particular CDN from which a client is receiving content is to extract it from the URL used by the client to obtain the content.
Third, compute an aggregate quality Q for each group G(ASN, CDN, Geo) over the last T seconds. Denote this aggregate quality by Q(G(ASN, CDN, Geo)).
Finally, check whether there are at least K pairs of groups that share the same ASN and geo-location, but get their data from different CDNs, and which experience different quality. In particular, let G(ASN1, CDNi, Geo1) and G(ASN1, CDNj, Geo1) be one such pair of groups. Then if Q(G(ASNi, CDN1, Geoi))−Q(G(ASNi, CDN2, Geoi))>QualityThreshold2 for greater than a fraction F of the K pairs, a conclusion is made that CDN2 has problems serving clients in general across a large set of regions. Alternatively, if this happens for smaller than a fraction F but a non-zero set, then a conclusion can be made that CDN2 has problems serving those (ASN, Geo) combinations for which the difference in quality exceeds the quality threshold.
In some embodiments, a minimum group size is defined so that only groups having a number of clients larger than a given threshold are considered.
A numerical example is provided. Content owner Charlie's Studio uses CDNs A and B for delivering content. At some point, there are 1100 streams from ISP-1 in San Francisco, 1200 streams from ISP-2 in Los Angeles, 1500 streams from ISP-3 in New York, 1050 streams from ISP-4 in Boston, and 600 streams from ISP-1 in Denver, with exactly half the users in each group streaming from CDN A and the other half from CDN B. A minimum group size of 500 users streaming from a particular (ASN, CDN, Geo) group is used, and hence there are four groups to consider. A requirement of at least four pairs (K=4) exists. For CDN A, the buffering ratios for users in San Francisco, Los Angeles, and Boston is 0.3, and for users in Denver it is 0.1. For CDN B, the buffering ratio of all user groups is 0.05. The quality threshold to separate good and bad quality is 0.1, and the fraction F required is 75%. This condition is satisfied, since three out of the four groups have a quality difference between CDN A and CDN B as 0.25. Hence, a conclusion is made that CDN A is having problems streaming to users.
Suppose a content owner, such as XYZ, distributes its content via multiple CDNs (e.g., CDN A, CDN B, and CDN C). Assume that if a client connected to CDN A experiences buffering beyond a threshold, it switches to another CDN (and stays there for at least a threshold interval of time). Based on the amount of switching observed from a CDN, the relative extent of quality problems the CDNs have can be quantified. One way this analysis can be implemented on content distribution monitor 102 is as follows.
For each CDNi for a period T, determine the number of clients Ni that start with CDNi, and the number of clients Mi that start with CDNi and switch away from CDNi (i.e., count only the first switch of a client). Compute the switch fraction SWi=Mi/Ni for all CDNs. If (SWi−avg(SW)>SW_Threshold). A conclusion can be made that CDNi has quality problems in general. Similar analysis can also be performed with respect to a geographic region or an ASN restriction.
A numerical example is provided. A content owner Charlie's Studios uses CDN A and CDN B to deliver content. Over a 10-minute period, 10,000 users watch content starting streaming from CDN A, and in the course of viewing, 1000 users switch to CDN B based on a client-based quality detection algorithm. In the same period, 10,000 users watch the same content starting streaming from CDN B, and out of these, 2,500 switch to CDN B. The switch fraction for CDN A is 0.1 and that for CDN B is 0.25. Switching threshold SW_Threshold is 0.1, and a conclusion is made that CDN A has quality problems in general.
Other content distribution problems can also be detected using the techniques described herein. For example, a problem with a content item itself (e.g., a particular movie) can be inferred if several clients, using different CDNs and different ISPs, experience quality issues with the same content. As another example, a problem with ad server 150 can be inferred if several clients report excessively long advertisement load times or timeouts.
A numerical example is provided. A content owner publishes 100 clips daily using two CDNs: CDN A and CDN B. One of the clips, clip X, has 100% join failures on both CDNs. Using this information, an inference can be made that there is a problem in publishing clip X. Now assume that there is 100% join failure for clients that join CDN A, but <2% of the users have problems with CDN B. Then an inference can be made that CDN A's publishing path has problems for that clip (but CDN B's does not).
Other content distribution problems can also be detected using the techniques described herein. For example, a problem with a content item itself (e.g., a particular movie) can be inferred if several clients, using different CDNs and different ISPs, experience quality issues with the same content. As another example, a problem with ad server 150 can be inferred if several clients report excessively long advertisement load times or timeouts.
In various embodiments, when problems are detected by content distribution monitor 102, corrective actions are automatically taken, such as by a control module included in content distribution monitor 102, or by a separate control system, configured to work in conjunction with content distribution monitor 102.
Dynamic Client Logging and Reporting
As mentioned above, the logging and reporting performed by a client can be dynamically adjusted based on a variety of parameters. Four such example parameters are as follows:
When a decision to make a dynamic adjustment to logging/reporting is made solely by the client, it is possible that a systemic issue could result in the content distribution monitor being overwhelmed by the increased data (e.g., where all clients suddenly increase their reporting levels). One approach to preventing this from occurring is for each client to request permission from the monitor prior to sending more verbose information (or sending the information more frequently). The monitor can then enforce a limit on the number of clients it allows to increase their verbosity levels. A second approach is for each client to generate a random number, and only increase verbosity/frequency if the random number falls within a particular range.
The time range of the contents reported by the client to the monitor can also be adjusted dynamically. While in some cases diagnosing a problem will require only the logs collected after the problem has manifested, in other cases, diagnosing the problem may require logs that precede the manifestation of the problem. Accordingly, clients can be configured to store information (at least temporarily) with greater verbosity than is sent to the monitor, and can, upon request, retroactively supply the more detailed information.
Various examples of problem diagnosis using dynamic adjustments to client logging and reporting will now be provided.
In video streaming, buffering is a significant performance issue. It can thus be important to understand the exact causes of buffering.
Solution A: Trigger=Threshold; Decider=Joint; Who=Subset; What=Past and Current.
One approach to diagnosing buffering is to let each client determine that it is buffering and request permission to send the monitor more detailed logs to help isolate the cause of buffering for the client. The monitor decides whether to allow a given client to send more detailed logs or not based on the number of other clients currently logging detailed logs.
One example of this solution is to configure a threshold for buffering by using a metric called a “buffering ratio.” The buffering ratio is the percent of time that a player is in a buffering state (as opposed to a playing state). If the buffering ratio exceeds the threshold, the client will trigger the request to send more detailed logs. In some embodiments, the state of the player for the past five minutes is considered to accurately capture the current state of the player and not react to brief spikes in buffering. An example threshold for a buffering ratio is 2%, meaning that if more than 2% of the time in the last five minutes (i.e., more than six seconds) was spent in a buffering state, the client requests to send more detailed information to the monitor. The monitor will accept the request only if it has sufficient capacity to handle the additional log information. One way to accomplish this is to configure a threshold for the maximum number of concurrent clients that can send detailed logs. If the current number is less than the threshold, the client sending the request is allowed to send more detailed log information. The requesting client then sends detailed information starting from that point on and including information about the past five minutes. In this example, five minutes of data is sent because it corresponds to the window of time used in the buffering ratio calculation.
Solution B: Trigger=Threshold; Decider=Monitor; Who=Subset; What=Past and Current.
A second approach to diagnosing buffering is for all clients to send their player state (e.g., “buffering” or “playing”) to the monitor and for the monitor to decide when and which clients should send detailed log information.
One example of this solution again uses the buffering ratio metric. However, in this case the threshold is set and evaluated by the monitor. The monitor evaluates the buffering ratio of each client and decides which clients should send detailed logs. Within this decision the monitor will take into account the capacity of the monitor to handle the logs using the maximum concurrent client threshold as before. For example, suppose the monitor can handle verbose log information from a total of 100 clients and the monitor determines that 200 clients have a buffer ratio that exceeds the threshold (or, their respective thresholds, in an embodiment where different clients have different thresholds). The monitor will then select a subset of 100 of the clients and send them a message to request detailed log information. The subset of clients can be selected randomly and can also be selected based on additional criteria, for example so that several geographies and ISPs are included, to get a regional spread, and/or so that the 100 clients selected obtain content from diverse CDNs.
Certain errors are very good indicators of problems in an application. For example, in a Flash-based video streaming application, the error NetStream. StreamNoFound is a clear indication of a problem with retrieving a video asset from a CDN server. This error says that the CDN server does not have the video asset being requested. The root cause of this may be a distribution problem within the CDN where the asset does not get distributed to all the servers or a publishing problem where the asset is not published to the CDN. When the error occurs, knowing: (1) the location of the clients, (2) the time, (3) the asset name or identifier, and (4) CDN or CDN server's IP that returned the error are very useful in resolving the problem.
Solution: Trigger=Errors; Decider=Joint; Who=Subset; What=Current.
One approach to resolving errors is for the client to store detailed information about the error locally and also to request permission to send detailed information to the monitor. Based on factors such as the number of clients requesting to send detailed log information and the type of issues encountered by a particular client, the monitor can allow a given client to provide more detailed data. As with the previous example, secondary considerations such as what content is being consumed and where the client is located can be used when determining whether a given client should provide detailed information to the monitor. Once a client receives a response from the monitor affirming that additional log information should be provided, the client will send the detailed information about the error. In various embodiments, the client continues to send detailed log information until it exits the error state.
An example of a player action is a request by a user to switch from a compact mode to a full screen mode. Failures in player actions can be very annoying to the viewer and can cause viewers to navigate away from a site (in the case of web-based viewing) or close the player application (in the case of a standalone application).
Solution: Trigger=Error; Decider=Joint; Who=Subset; What=Past and Current.
One way to resolve player action problems is for the client, upon detection of the error, to request permission from the monitor to send detailed log information about the failure. In the case of diagnosing why a user action to “go to full screen mode” failed, any errors that occurred while attempting to switch to full screen mode, and any previous actions that were taken, will be of interest.
One example of this solution is for the client to continuously store and update the user actions taken in the last five minutes, as well as the internal player state. The client sends a request to the monitor to log the information when a user action such as “go to full screen” mode fails. If the monitor responds positively, the client sends the past five minutes of information it has stored.
In addition to individual client problems, global and regional problems can also occur. For example, suppose all viewers in the New York City area have a high buffering ratio.
Solution: Trigger=Threshold; Decider=Monitor; Who=Subset; What=Current.
The monitor sees the performance of a large number of clients across a wide variety of locations, machine types, etc. One way to implement regional problem isolation and diagnosis is as follows. High-level aggregate quality metrics can be used to localize buffering issues to a subset of clients. For example, a ratio of clients who have experienced buffering of more than a few seconds to users who did not have much buffering can be used to construct a high level metric to quantify the experience of viewers. In this scenario, a client that experienced more than five seconds of buffering is denoted as having a low quality experience. A threshold of 5% can be used for the ratio of clients having a low quality experience vs. other clients. The threshold implies that if more than 5% of the viewers are experiencing low quality, it is likely that there is a wide spread systemic root cause.
Telemetry data can be grouped with respect to different dimensions, and principal component analysis can be performed on the data. In doing so, subsets of clients that are experiencing quality issues can be discovered. Example dimensions for classifying clients include: geolocation of clients (indicating a geolocalized problem), ISP used by end users for connecting to the Internet (indicating a problem with access link of viewers), CDN servers that the clients connect to (indicating an issue with the server from which the video is being downloaded), and browser type or operating system of the viewer (indicating a problem with the end user's software).
High level metrics, such as geolocation, ISP, and CDN information correlate well with network related issues. Using the metrics to group clients and perform principal component analysis can help localize a low quality client experience to a subset of affected viewers which share certain attributes. However, once the subset of affected clients has been determined, additional information may be needed to further diagnose the issue and find the root cause of the problem that is resulting in the deterioration of quality of the users. In such a scenario, the monitor can issue a command to a subset of clients (e.g., identified by specific attributes) to send additional information. Examples of such additional information include (a) higher fidelity measurements, for example higher frequency measurement of the download rates (by looking at bytes downloaded); (b) computed correlations and trends of measurements, for example, information representing trends of the buffer lengths; and (c) measurements that might typically not otherwise be taken, such as a sequence of dropped frames. In some embodiments, the monitor drills down into the detailed data by iteratively sending commands to clients for increasingly detailed information.
In a video streaming application, failure to start playing video is an example of a fatal error.
Solution: Trigger=Error; Decider=Monitor; Who=Subset; What=Past and Current.
Successfully diagnosing client side issues such as fatal errors can require detailed information from the client, including past events.
One approach to diagnosing fatal errors is for the client to inform the monitor that a fatal error has occurred. Based on knowledge of how to diagnose the particular error, the monitor can request specific information. For example, the information could include all errors that occurred, the state transitions that occurred during the join phase, and any configuration files that were downloaded.
Further, past information can be summarized to reduce the amount of data transmitted. For example, (1) counts of error codes can be sent instead of listing each error code; (2) measured data can be sent at a lower frequency (e.g., one sample every ten seconds instead of five samples per second); and (3) statistics over the data, such as averages, variances, and distributions can be sent.
In some cases, such as the start of a football game, a particularly large number of clients may be expected to initiate the consumption of content.
Solution: Trigger=Schedule; Decider=Monitor; Who=Subset; What=Current.
When it is anticipated that an event will draw more viewers than usual, and/or when the content being served is of particular importance, certain clients can be instructed to provide detailed log information, even if they have not yet experienced any problems.
In some embodiments, monitor 102 is configured to instruct certain clients to provide detailed log information in accordance with a schedule. Clients periodically poll the monitor to find out whether they should send detailed logs or not. Based on the schedule, the monitor will respond to each client with either a negative response (meaning it should not send detailed logs) or a positive response with predefined keywords specifying which additional information to send. Examples of keywords are: (1) “bit rate”—send information about bit rate and bit rate switches, (2) “buffering”—send information about buffering events and buffer length changes, (3) “available bandwidth”—send information about the current available bandwidth and continuous measurements to track the trend, and (4) “user actions”—send all actions by the user, such as full screen toggle and any errors that resulted from them. The monitor can send multiple keywords to the same client, and/or send different combinations of keywords to different clients.
As another example, and irrespective of whether the content being delivered implicates a planned increase in viewers, monitor 102 can instruct certain clients that are not experiencing problems to provide additional information. In particular, monitor 102 can randomly select 100 clients, once an hour, to send detailed log information. So, in a first hour, client 404 might be instructed to provide detailed information, and in a second hour, client 408 might be instructed to provide detailed information.
Software version updates happen frequently and in most cases the final stage of testing a software version update is by releasing it to a portion of the production users.
Solution: Trigger=Schedule; Decider=Monitor; Who=Subset; What=Current.
The ability to request detailed logs from a subset of the users who get a new version can be useful to ensure that the new version is performing as expected. For example, suppose a new software version is deployed to 5% of an audience. Detailed logs can be requested from 10% (or 0.5% of the overall audience) of the clients with the new version.
In some embodiments, monitor 102 receives periodic messages from each client that include the client's current software version. When a software update is released, the monitor tracks a portion of the clients with the new version by requesting that those clients send detailed logs. The portion can be determined as a percentage of the new client and/or can be limited by a fixed number of slots. Once the new software release has been verified, the server can stop collecting detailed logs from clients running the new software.
Subscription-based services typically engage customer call centers to provide customer support. When a user of a content streaming application has an issue, it can be advantageous for a customer support representative to be able to receive detailed information pertinent to diagnosing the problem.
Solution: Trigger=Error; Decider=Monitor; Who=Specific Client; What=Past or Past and Current.
In various embodiments, customer support representatives are able to request a caller's client to send detailed information about the specific problem reported by the caller in real-time. If the caller is complaining about buffering, the detailed information requested can include higher fidelity measurements of the download rates, buffering and buffer length, the current bit rate and recent bit rate switches, and the client's capabilities and performance. If the caller is complaining about blank video, the detailed information requested can include errors, player state transitions during join, and configuration files. If the caller is complaining about a frozen player, the detailed information requested can include a stack trace and recent user actions. As a final example, if the caller is complaining about a low bitrate, the detailed information requested can include fine-grained bandwidth measurements, CPU measurements, and memory measurements. The requested detail can also be adjusted by the customer service representative to iteratively diagnose the problem.
One example of this solution is to provide a console to the call center representative that allows him to identify the caller's client and request that it send specific information. One way to perform the identification is through the use of a login ID (e.g., the user's email address). The user provides the login ID to the customer service representative, and the client also includes the login ID in heartbeats. The console matches the login ID entered by the representative with the client sending the same login ID. The representative then specifies the information to be requested from the client based on the problem described by the caller.
Example Processes for Performing Dynamic Adjustment to Client Logging and Reporting
At 604, the content distribution performance information is reported to a content distribution monitor at a first reporting level. As one example, at 604, client 172 sends minimal status information to monitor 102 (e.g., indicating the client version and client state, only).
At 606, in response to a triggering event, the first reporting level is changed to a second reporting level. One example of a triggering event is the client experiencing a performance degradation. Another example of a triggering event is the client encountering an error. Yet another example of a triggering event is the client receiving an external instruction, such as from monitor 102, to adjust the reporting level.
Finally, at 608 additional content distribution performance information is reported according to the second reporting level. As one example, at 608, client 172 provides detailed log information to monitor 102. In various embodiments, if the client is unable to connect with monitor 102, the client stores the content distribution performance information for delivery to monitor 102 once the connection is restored.
At 704, a determination is made that the first reporting level should be changed to a second reporting level. As one example, monitor 102 determines that a client is experiencing a degradation of performance. As another example, at 704 monitor 102 randomly selects client 172 to provide more information. As yet another example, at 704 monitor 102 determines that a problem has been resolved for a client currently providing verbose log information.
Finally, at 706 monitor 102 instructs client 172 to provide additional content distribution performance information at a second reporting level. As one example, at 706, monitor 102 instructs client 172 to provide its bitrate and its available memory to monitor 102, in addition to the information it provided at 604 in the process shown in
Although the foregoing embodiments have been described in some detail for purposes of clarity of understanding, the invention is not limited to the details provided. There are many alternative ways of implementing the invention. The disclosed embodiments are illustrative and not restrictive.
This application is a continuation of co-pending U.S. patent application Ser. No. 13/461,346 entitled DYNAMIC CLIENT LOGGING AND REPORTING filed May 1, 2012, which is a continuation-in-part of U.S. patent application Ser. No. 12/780,784, now U.S. Pat. No. 8,874,725 entitled MONITORING THE PERFORMANCE OF A CONTENT PLAYER filed May 14, 2010. Application Ser. No. 12/780,784 is a continuation-in-part of U.S. patent application Ser. No. 11/897,957, now U.S. Pat. No. 9,407,494 entitled REASSIGNING SOURCE PEERS filed Aug. 30, 2007, which claims priority to U.S. Provisional Patent Application No. 60/859,428 entitled CONTENT DISTRIBUTION filed Nov. 15, 2006. Application Ser. No. 12/780,784 also claims priority to U.S. Provisional Patent Application No. 61/227,066 entitled REAL-TIME TELEMETRY FOR CONTENT filed Jul. 20, 2009 and to U.S. Provisional Patent Application No. 61/339,925 entitled TELEMETRY FOR CONTENT filed Mar. 10, 2010. U.S. patent application Ser. No. 13/461,346 also claims priority to U.S. Provisional Patent Application No. 61/481,554 entitled DYNAMIC CLIENT LOGGING filed May 2, 2011. All of the aforementioned applications are incorporated herein by reference for all purposes.
Number | Name | Date | Kind |
---|---|---|---|
5926204 | Mayer | Jul 1999 | A |
5930473 | Teng | Jul 1999 | A |
5987621 | Duso | Nov 1999 | A |
6006264 | Colby | Dec 1999 | A |
6026077 | Iwata | Feb 2000 | A |
6032857 | Kitagawa | Mar 2000 | A |
6188993 | Eng | Feb 2001 | B1 |
6208977 | Hernandez | Mar 2001 | B1 |
6223206 | Dan | Apr 2001 | B1 |
6250557 | Forslund | Jun 2001 | B1 |
6279039 | Bhat | Aug 2001 | B1 |
6324565 | Holt, III | Nov 2001 | B1 |
6377996 | Lumelsky | Apr 2002 | B1 |
6405251 | Bullard | Jun 2002 | B1 |
6434159 | Woodward | Aug 2002 | B1 |
6438592 | Killian | Aug 2002 | B1 |
6469991 | Chuah | Oct 2002 | B1 |
6470389 | Chung | Oct 2002 | B1 |
6487540 | Smith | Nov 2002 | B1 |
6502747 | Stoutenburg | Jan 2003 | B1 |
6542933 | Durst, Jr. | Apr 2003 | B1 |
6735630 | Gelvin | May 2004 | B1 |
6754833 | Black | Jun 2004 | B1 |
6769028 | Sass | Jul 2004 | B1 |
6836691 | Stirton | Dec 2004 | B1 |
6892236 | Conrad | May 2005 | B1 |
6906743 | Maurer | Jun 2005 | B1 |
6920580 | Cramer | Jul 2005 | B1 |
6941270 | Hannula | Sep 2005 | B1 |
6950855 | Sampathkumar | Sep 2005 | B2 |
7006666 | Montgomery | Feb 2006 | B2 |
7010598 | Sitaraman | Mar 2006 | B2 |
7020082 | Bhagavath | Mar 2006 | B2 |
7024452 | O'Connell, Jr. | Apr 2006 | B1 |
7024468 | Meyer | Apr 2006 | B1 |
7039694 | Kampe | May 2006 | B2 |
7092696 | Hosain | Aug 2006 | B1 |
7139834 | Albanese | Nov 2006 | B1 |
7222190 | Klinker | May 2007 | B2 |
7233926 | Durand | Jun 2007 | B2 |
7277896 | Matsubara | Oct 2007 | B2 |
7313087 | Patil | Dec 2007 | B2 |
7318107 | Menon | Jan 2008 | B1 |
7353023 | Link, II | Apr 2008 | B1 |
7356341 | Nanda | Apr 2008 | B2 |
7367044 | Fowler | Apr 2008 | B2 |
7373415 | Deshan | May 2008 | B1 |
7389537 | Callon | Jun 2008 | B1 |
7487509 | Hugly | Feb 2009 | B2 |
7490136 | Suzuki | Feb 2009 | B2 |
7509372 | Dutta | Mar 2009 | B2 |
7519703 | Stuart | Apr 2009 | B1 |
7593333 | Li | Sep 2009 | B2 |
7599698 | Cheng | Oct 2009 | B2 |
7617525 | Moeck | Nov 2009 | B1 |
7620848 | Tanner | Nov 2009 | B1 |
7627872 | Hebeler | Dec 2009 | B2 |
7668761 | Jenkins | Feb 2010 | B2 |
7668914 | Parker | Feb 2010 | B2 |
7689508 | Davis | Mar 2010 | B2 |
7698460 | Zhang | Apr 2010 | B2 |
7702581 | Hogl | Apr 2010 | B2 |
7721292 | Frasier | May 2010 | B2 |
7725576 | Sitaraman | May 2010 | B2 |
7792889 | Lee | Sep 2010 | B1 |
7813326 | Kelm | Oct 2010 | B1 |
7844491 | Haitsuka | Nov 2010 | B1 |
7853529 | Walker | Dec 2010 | B1 |
7873727 | Pal | Jan 2011 | B2 |
7904580 | Mandera | Mar 2011 | B2 |
7921215 | Dessart | Apr 2011 | B2 |
7921222 | Courtemanche | Apr 2011 | B2 |
7930347 | Maxwell | Apr 2011 | B2 |
7941823 | Hasek | May 2011 | B2 |
7969987 | Hansen | Jun 2011 | B1 |
7970402 | Wu | Jun 2011 | B2 |
8028159 | Li | Sep 2011 | B2 |
8038535 | Jensen | Oct 2011 | B2 |
8046765 | Cherkasova | Oct 2011 | B2 |
8098160 | Howarth | Jan 2012 | B2 |
8108403 | Gopalraj | Jan 2012 | B2 |
8156204 | Leblanc | Apr 2012 | B2 |
8182326 | Speer, II | May 2012 | B2 |
8230105 | Melnyk | Jul 2012 | B2 |
8234350 | Gu | Jul 2012 | B1 |
8259597 | Oak | Sep 2012 | B1 |
8370887 | Virdi | Feb 2013 | B2 |
8374929 | Lappas | Feb 2013 | B1 |
8387094 | Ho | Feb 2013 | B1 |
8402494 | Hu | Mar 2013 | B1 |
8417797 | Thoen | Apr 2013 | B2 |
8489683 | Leblanc | Jul 2013 | B2 |
8489923 | Lakshminarayanan | Jul 2013 | B1 |
8555355 | Rathbun | Oct 2013 | B2 |
8639553 | Knauth | Jan 2014 | B1 |
8647203 | Albrecht | Feb 2014 | B2 |
8719876 | Kotecha | May 2014 | B2 |
8751605 | Zhang | Jun 2014 | B1 |
8751679 | McHugh | Jun 2014 | B2 |
8843597 | Leblanc | Sep 2014 | B2 |
8874725 | Ganjam | Oct 2014 | B1 |
8874964 | Lakshminarayanan | Oct 2014 | B1 |
8898338 | McGowan | Nov 2014 | B1 |
8909736 | Bosch | Dec 2014 | B1 |
8924996 | Shafiee | Dec 2014 | B2 |
8943170 | Li | Jan 2015 | B2 |
8954491 | Medved | Feb 2015 | B1 |
9098844 | Davis | Aug 2015 | B2 |
9100288 | Ganjam | Aug 2015 | B1 |
9100826 | Weiss | Aug 2015 | B2 |
9264780 | Stoica | Feb 2016 | B1 |
9456015 | Chen | Sep 2016 | B2 |
9549043 | Stoica | Jan 2017 | B1 |
9613042 | Joseph | Apr 2017 | B1 |
9819566 | Ganjam | Nov 2017 | B1 |
9898781 | Silverman | Feb 2018 | B1 |
10021672 | Cole | Jul 2018 | B2 |
10530852 | Newton | Jan 2020 | B2 |
20020002708 | Arye | Jan 2002 | A1 |
20020016831 | Peled | Feb 2002 | A1 |
20020029190 | Gutierrez-Sheris | Mar 2002 | A1 |
20020052841 | Guthrie | May 2002 | A1 |
20020082730 | Capps | Jun 2002 | A1 |
20020095400 | Johnson | Jul 2002 | A1 |
20020126135 | Ball | Sep 2002 | A1 |
20020133601 | Kennamer | Sep 2002 | A1 |
20020141343 | Bays | Oct 2002 | A1 |
20020143798 | Lisiecki | Oct 2002 | A1 |
20020175934 | Hand | Nov 2002 | A1 |
20020183972 | Enck | Dec 2002 | A1 |
20020184357 | Traversat | Dec 2002 | A1 |
20020198984 | Goldstein | Dec 2002 | A1 |
20030046383 | Lee | Mar 2003 | A1 |
20030046396 | Richter | Mar 2003 | A1 |
20030046704 | Laksono | Mar 2003 | A1 |
20030046708 | Jutzi | Mar 2003 | A1 |
20030050966 | Dutta | Mar 2003 | A1 |
20030051051 | O'Neal | Mar 2003 | A1 |
20030061305 | Copley | Mar 2003 | A1 |
20030061356 | Jason, Jr. | Mar 2003 | A1 |
20030065739 | Shnier | Apr 2003 | A1 |
20030065763 | Swildens | Apr 2003 | A1 |
20030074142 | Steeg | Apr 2003 | A1 |
20030084003 | Pinkas | May 2003 | A1 |
20030105850 | Lean | Jun 2003 | A1 |
20030135593 | Lee | Jul 2003 | A1 |
20030140108 | Sampathkumar | Jul 2003 | A1 |
20030145066 | Okada | Jul 2003 | A1 |
20030169863 | Hernandez | Sep 2003 | A1 |
20040010544 | Slater | Jan 2004 | A1 |
20040019675 | Hebeler | Jan 2004 | A1 |
20040047354 | Slater | Mar 2004 | A1 |
20040049793 | Chou | Mar 2004 | A1 |
20040064556 | Zhang | Apr 2004 | A1 |
20040088347 | Yeager | May 2004 | A1 |
20040093155 | Simonds | May 2004 | A1 |
20040107387 | Larsson | Jun 2004 | A1 |
20040133471 | Pisaris-Henderson | Jul 2004 | A1 |
20040136327 | Sitaraman | Jul 2004 | A1 |
20040158643 | Suzuki | Aug 2004 | A1 |
20040162901 | Mangipudi | Aug 2004 | A1 |
20040193716 | McConnell | Sep 2004 | A1 |
20040233918 | Larsson | Nov 2004 | A1 |
20040236846 | Alvarez | Nov 2004 | A1 |
20040267691 | Vasudeva | Dec 2004 | A1 |
20050021715 | Dugatkin | Jan 2005 | A1 |
20050060158 | Endo | Mar 2005 | A1 |
20050076104 | Liskov | Apr 2005 | A1 |
20050086300 | Yeager | Apr 2005 | A1 |
20050086469 | Dunagan | Apr 2005 | A1 |
20050089043 | Seckin | Apr 2005 | A1 |
20050114262 | Howard | May 2005 | A1 |
20050120131 | Allen | Jun 2005 | A1 |
20050169179 | Antal | Aug 2005 | A1 |
20050177785 | Shrader | Aug 2005 | A1 |
20050183120 | Jain | Aug 2005 | A1 |
20050187873 | Labrou | Aug 2005 | A1 |
20050243735 | Kashima | Nov 2005 | A1 |
20050251835 | Scott | Nov 2005 | A1 |
20050278259 | Gunaseelan | Dec 2005 | A1 |
20060052100 | Almgren | Mar 2006 | A1 |
20060059248 | Ikeda | Mar 2006 | A1 |
20060075094 | Wen | Apr 2006 | A1 |
20060085246 | Li | Apr 2006 | A1 |
20060100932 | Ohmori | May 2006 | A1 |
20060123080 | Baudino | Jun 2006 | A1 |
20060135172 | Dronne | Jun 2006 | A1 |
20060136218 | Lee | Jun 2006 | A1 |
20060136597 | Shabtai | Jun 2006 | A1 |
20060143350 | Miloushev | Jun 2006 | A1 |
20060165060 | Dua | Jul 2006 | A1 |
20060168304 | Bauer | Jul 2006 | A1 |
20060179154 | Sitaraman | Aug 2006 | A1 |
20060190615 | Panwar | Aug 2006 | A1 |
20060206539 | Thompson | Sep 2006 | A1 |
20060236017 | Rooholamini | Oct 2006 | A1 |
20060246880 | Baldwin | Nov 2006 | A1 |
20060259949 | Schaefer | Nov 2006 | A1 |
20060285489 | Francisco | Dec 2006 | A1 |
20070005809 | Kobayashi | Jan 2007 | A1 |
20070025381 | Feng | Feb 2007 | A1 |
20070055632 | Hogl | Mar 2007 | A1 |
20070066403 | Conkwright | Mar 2007 | A1 |
20070097997 | Maclean | May 2007 | A1 |
20070101202 | Garbow | May 2007 | A1 |
20070125840 | Law | Jun 2007 | A1 |
20070136311 | Kasten | Jun 2007 | A1 |
20070140113 | Gemelos | Jun 2007 | A1 |
20070150612 | Chaney | Jun 2007 | A1 |
20070183427 | Nylander | Aug 2007 | A1 |
20070198413 | Nagao | Aug 2007 | A1 |
20070204011 | Shaver | Aug 2007 | A1 |
20070232332 | Holur | Oct 2007 | A1 |
20070265984 | Santhana | Nov 2007 | A1 |
20070282994 | Beers | Dec 2007 | A1 |
20070286351 | Ethier | Dec 2007 | A1 |
20070288638 | Vuong | Dec 2007 | A1 |
20080016205 | Svendsen | Jan 2008 | A1 |
20080037438 | Twiss | Feb 2008 | A1 |
20080046499 | Cabrera | Feb 2008 | A1 |
20080046777 | Chen | Feb 2008 | A1 |
20080046974 | Minodier | Feb 2008 | A1 |
20080049616 | Kamath | Feb 2008 | A1 |
20080049786 | Ram | Feb 2008 | A1 |
20080052226 | Agarwal | Feb 2008 | A1 |
20080096562 | Wu | Apr 2008 | A1 |
20080104454 | White | May 2008 | A1 |
20080112315 | Hu | May 2008 | A1 |
20080120707 | Ramia | May 2008 | A1 |
20080140520 | Hyder | Jun 2008 | A1 |
20080140688 | Clayton | Jun 2008 | A1 |
20080141131 | Cerny | Jun 2008 | A1 |
20080144513 | Small | Jun 2008 | A1 |
20080151821 | Cho | Jun 2008 | A1 |
20080155586 | Yang | Jun 2008 | A1 |
20080195461 | Li | Aug 2008 | A1 |
20080209499 | Ramesh | Aug 2008 | A1 |
20080215718 | Stolorz | Sep 2008 | A1 |
20080215756 | Lee | Sep 2008 | A1 |
20080235746 | Peters | Sep 2008 | A1 |
20080247326 | Cormier | Oct 2008 | A1 |
20080263180 | Hurst | Oct 2008 | A1 |
20080313040 | Rose | Dec 2008 | A1 |
20090010155 | Liu | Jan 2009 | A1 |
20090019503 | Vorbau | Jan 2009 | A1 |
20090043906 | Hurst | Feb 2009 | A1 |
20090059812 | Chinnaswamy | Mar 2009 | A1 |
20090082020 | Ch'ng | Mar 2009 | A1 |
20090083631 | Sidi | Mar 2009 | A1 |
20090106392 | Zuckerman | Apr 2009 | A1 |
20090117893 | Weigand | May 2009 | A1 |
20090119722 | Versteeg | May 2009 | A1 |
20090125625 | Shim | May 2009 | A1 |
20090150487 | Wolfish | Jun 2009 | A1 |
20090164656 | Guan | Jun 2009 | A1 |
20090170440 | Eyuboglu | Jul 2009 | A1 |
20090172200 | Morrison | Jul 2009 | A1 |
20090187956 | Sommer | Jul 2009 | A1 |
20090192929 | Hoeflinger | Jul 2009 | A1 |
20090234940 | Pal | Sep 2009 | A1 |
20090248872 | Luzzatti | Oct 2009 | A1 |
20090271101 | Relyea | Oct 2009 | A1 |
20090271520 | Siddiqui | Oct 2009 | A1 |
20090288012 | Hertel | Nov 2009 | A1 |
20090327489 | Swildens | Dec 2009 | A1 |
20090328124 | Khouzam | Dec 2009 | A1 |
20100043014 | Hebeler, Jr. | Feb 2010 | A1 |
20100080290 | Mehrotra | Apr 2010 | A1 |
20100088373 | Pinkham | Apr 2010 | A1 |
20100100635 | Takemura | Apr 2010 | A1 |
20100114562 | Hutchinson | May 2010 | A1 |
20100125675 | Richardson | May 2010 | A1 |
20100131642 | Chalikouras | May 2010 | A1 |
20100138273 | Bateni | Jun 2010 | A1 |
20100161729 | Leblanc | Jun 2010 | A1 |
20100169195 | Trest | Jul 2010 | A1 |
20100235503 | Sitaraman | Sep 2010 | A1 |
20100302002 | Guo | Dec 2010 | A1 |
20100306368 | Gagliardi | Dec 2010 | A1 |
20110014972 | Herrmann | Jan 2011 | A1 |
20110016225 | Park | Jan 2011 | A1 |
20110058675 | Brueck | Mar 2011 | A1 |
20110060649 | Dunk | Mar 2011 | A1 |
20110082946 | Gopalakrishnan | Apr 2011 | A1 |
20110119724 | Damola | May 2011 | A1 |
20110179435 | Cordray | Jul 2011 | A1 |
20110196943 | Bornstein | Aug 2011 | A1 |
20110202593 | Vaderna | Aug 2011 | A1 |
20110218957 | Coon | Sep 2011 | A1 |
20110235103 | Ito | Sep 2011 | A1 |
20110252138 | Ahuja | Oct 2011 | A1 |
20110258049 | Ramer | Oct 2011 | A1 |
20120093098 | Charbit | Apr 2012 | A1 |
20120110167 | Joch | May 2012 | A1 |
20120166430 | Bakalov | Jun 2012 | A1 |
20120173753 | Moorthy | Jul 2012 | A1 |
20120178426 | Filipov | Jul 2012 | A1 |
20120204068 | Ye | Aug 2012 | A1 |
20120204153 | Peterson | Aug 2012 | A1 |
20120219271 | Vunic | Aug 2012 | A1 |
20120221421 | Hammad | Aug 2012 | A1 |
20120226734 | Poese | Sep 2012 | A1 |
20120231885 | Speer, II | Sep 2012 | A1 |
20120240176 | Ma | Sep 2012 | A1 |
20120259698 | Yurow | Oct 2012 | A1 |
20120265596 | Mazed | Oct 2012 | A1 |
20120311126 | Jadallah | Dec 2012 | A1 |
20130024364 | Shrivastava | Jan 2013 | A1 |
20130024371 | Hariramani | Jan 2013 | A1 |
20130046861 | Biderman | Feb 2013 | A1 |
20130094445 | De Foy | Apr 2013 | A1 |
20130124724 | Madgwick | May 2013 | A1 |
20130132605 | Kocks | May 2013 | A1 |
20130142129 | Rinne | Jun 2013 | A1 |
20130144785 | Karpenko | Jun 2013 | A1 |
20130151687 | Mooneyham | Jun 2013 | A1 |
20130166332 | Hammad | Jun 2013 | A1 |
20130198328 | Green et al. | Aug 2013 | A1 |
20130198361 | Matsuzaki | Aug 2013 | A1 |
20130218765 | Hammad | Aug 2013 | A1 |
20130304642 | Campos | Nov 2013 | A1 |
20130305299 | Bergstrom | Nov 2013 | A1 |
20130336221 | Damola | Dec 2013 | A1 |
20140019352 | Shrivastava | Jan 2014 | A1 |
20140108671 | Watson | Apr 2014 | A1 |
20140129303 | Aiglstorfer | May 2014 | A1 |
20140143089 | Campos | May 2014 | A1 |
20140198641 | Perkuhn | Jul 2014 | A1 |
20140324690 | Allen | Oct 2014 | A1 |
20140330980 | Richardson | Nov 2014 | A1 |
20140337175 | Katzin | Nov 2014 | A1 |
20150026239 | Hofmann | Jan 2015 | A1 |
20150067185 | Tamblin | Mar 2015 | A1 |
20150088607 | Georgoff | Mar 2015 | A1 |
20150095704 | Sokolik | Apr 2015 | A1 |
20150112774 | Georgoff | Apr 2015 | A1 |
20150134431 | Georgoff | May 2015 | A1 |
20150201042 | Shah | Jul 2015 | A1 |
20150220989 | Hayes | Aug 2015 | A1 |
20150302456 | Rego | Oct 2015 | A1 |
20150379554 | Copeland | Dec 2015 | A1 |
20160055583 | Liberty | Feb 2016 | A1 |
20160234293 | Berger | Aug 2016 | A1 |
20160292731 | Khwaja | Oct 2016 | A1 |
20160328272 | Ahmed | Nov 2016 | A1 |
20170161717 | Jun 2017 | A1 | |
20170289188 | Shaikh | Oct 2017 | A1 |
20170339222 | Newton | Nov 2017 | A1 |
Entry |
---|
“Firefly-Inspired Heartbeat Synchronization in Overlay Networks”—Binci et al., University of Bologna, Italy, Feb. 2007 http://www.cs.unibo.it/babaoglu/courses/cas06-07/papers/pdf/fireflies.pdf. |
“Relay Nodes in Wireless Sensor Networks: A Survey”—Ataul Bah, University of Windsor, Nov. 2005, http://richard.myweb.cs.uwindsor.ca/cs510/survey_bari.pdf. |
“Simple Opportunistic Routing Protocol for Wireless Mesh Networks”—Rozner et al, University of Texas at Austin, Aug. 2011 http://ericrozner.com/papers/wimesh06.pdf. |
http://www.cs.berkeley.edu/˜kubitron/articles/techreview.pdf “The Internet Reborn”—Wade Roush, Technology Review, Oct. 2003. |
Theotokis et al., A Survey of Peer-to-Peer Content Distribution Technologies, ACM Computing Surveys, vol. 36, No. 4, Dec. 2004, pp. 335-371. |
Wade Roush, Technology Review, Published by MIT, TR10: Peering into Video's Future, Mar. 12, 2007, http://technologyreview.com/printer_friendly_article.aspx?id=18284. |
Coppens et al., Design and Performance of a Self-Organizing Adaptive Content Distribution Network, 2006. |
Number | Date | Country | |
---|---|---|---|
60859428 | Nov 2006 | US | |
61227066 | Jul 2009 | US | |
61339925 | Mar 2010 | US | |
61481554 | May 2011 | US |
Number | Date | Country | |
---|---|---|---|
Parent | 13461346 | May 2012 | US |
Child | 15690016 | US |
Number | Date | Country | |
---|---|---|---|
Parent | 12780784 | May 2010 | US |
Child | 13461346 | US | |
Parent | 11897957 | Aug 2007 | US |
Child | 12780784 | US |