| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef NET_QUIC_QUIC_PROTOCOL_H_ | 5 #ifndef NET_QUIC_QUIC_PROTOCOL_H_ |
| 6 #define NET_QUIC_QUIC_PROTOCOL_H_ | 6 #define NET_QUIC_QUIC_PROTOCOL_H_ |
| 7 | 7 |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 | 10 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 #include "base/logging.h" | 22 #include "base/logging.h" |
| 23 #include "base/macros.h" | 23 #include "base/macros.h" |
| 24 #include "base/memory/ref_counted.h" | 24 #include "base/memory/ref_counted.h" |
| 25 #include "base/strings/string_piece.h" | 25 #include "base/strings/string_piece.h" |
| 26 #include "net/base/int128.h" | 26 #include "net/base/int128.h" |
| 27 #include "net/base/iovec.h" | 27 #include "net/base/iovec.h" |
| 28 #include "net/base/ip_endpoint.h" | 28 #include "net/base/ip_endpoint.h" |
| 29 #include "net/base/net_export.h" | 29 #include "net/base/net_export.h" |
| 30 #include "net/quic/core/interval_set.h" | 30 #include "net/quic/core/interval_set.h" |
| 31 #include "net/quic/core/quic_bandwidth.h" | 31 #include "net/quic/core/quic_bandwidth.h" |
| 32 #include "net/quic/core/quic_constants.h" |
| 32 #include "net/quic/core/quic_time.h" | 33 #include "net/quic/core/quic_time.h" |
| 33 #include "net/quic/core/quic_types.h" | 34 #include "net/quic/core/quic_types.h" |
| 34 | 35 |
| 35 namespace net { | 36 namespace net { |
| 36 | 37 |
| 37 class QuicPacket; | 38 class QuicPacket; |
| 38 struct QuicPacketHeader; | 39 struct QuicPacketHeader; |
| 39 class QuicAckListenerInterface; | 40 class QuicAckListenerInterface; |
| 40 | 41 |
| 41 typedef uint64_t QuicConnectionId; | |
| 42 typedef uint32_t QuicStreamId; | |
| 43 typedef uint64_t QuicStreamOffset; | |
| 44 typedef uint64_t QuicPacketNumber; | |
| 45 typedef uint8_t QuicPathId; | |
| 46 typedef uint64_t QuicPublicResetNonceProof; | |
| 47 typedef uint8_t QuicPacketEntropyHash; | |
| 48 typedef uint32_t QuicHeaderId; | |
| 49 // QuicTag is the type of a tag in the wire protocol. | |
| 50 typedef uint32_t QuicTag; | |
| 51 typedef std::vector<QuicTag> QuicTagVector; | |
| 52 typedef std::map<QuicTag, std::string> QuicTagValueMap; | |
| 53 typedef uint16_t QuicPacketLength; | |
| 54 | |
| 55 // Default initial maximum size in bytes of a QUIC packet. | |
| 56 const QuicByteCount kDefaultMaxPacketSize = 1350; | |
| 57 // Default initial maximum size in bytes of a QUIC packet for servers. | |
| 58 const QuicByteCount kDefaultServerMaxPacketSize = 1000; | |
| 59 // The maximum packet size of any QUIC packet, based on ethernet's max size, | |
| 60 // minus the IP and UDP headers. IPv6 has a 40 byte header, UDP adds an | |
| 61 // additional 8 bytes. This is a total overhead of 48 bytes. Ethernet's | |
| 62 // max packet size is 1500 bytes, 1500 - 48 = 1452. | |
| 63 const QuicByteCount kMaxPacketSize = 1452; | |
| 64 // Default maximum packet size used in the Linux TCP implementation. | |
| 65 // Used in QUIC for congestion window computations in bytes. | |
| 66 const QuicByteCount kDefaultTCPMSS = 1460; | |
| 67 | |
| 68 // We match SPDY's use of 32 (since we'd compete with SPDY). | |
| 69 const QuicPacketCount kInitialCongestionWindow = 32; | |
| 70 | |
| 71 // Minimum size of initial flow control window, for both stream and session. | |
| 72 const uint32_t kMinimumFlowControlSendWindow = 16 * 1024; // 16 KB | |
| 73 | |
| 74 // Maximum flow control receive window limits for connection and stream. | |
| 75 const QuicByteCount kStreamReceiveWindowLimit = 16 * 1024 * 1024; // 16 MB | |
| 76 const QuicByteCount kSessionReceiveWindowLimit = 24 * 1024 * 1024; // 24 MB | |
| 77 | |
| 78 // Default limit on the size of uncompressed headers. | |
| 79 const QuicByteCount kDefaultMaxUncompressedHeaderSize = 16 * 1024; // 16 KB | |
| 80 | |
| 81 // Minimum size of the CWND, in packets, when doing bandwidth resumption. | |
| 82 const QuicPacketCount kMinCongestionWindowForBandwidthResumption = 10; | |
| 83 | |
| 84 // Maximum number of tracked packets. | |
| 85 const QuicPacketCount kMaxTrackedPackets = 10000; | |
| 86 | |
| 87 // Default size of the socket receive buffer in bytes. | |
| 88 const QuicByteCount kDefaultSocketReceiveBuffer = 1024 * 1024; | |
| 89 | |
| 90 // Don't allow a client to suggest an RTT shorter than 10ms. | |
| 91 const uint32_t kMinInitialRoundTripTimeUs = 10 * kNumMicrosPerMilli; | |
| 92 | |
| 93 // Don't allow a client to suggest an RTT longer than 15 seconds. | |
| 94 const uint32_t kMaxInitialRoundTripTimeUs = 15 * kNumMicrosPerSecond; | |
| 95 | |
| 96 // Maximum number of open streams per connection. | |
| 97 const size_t kDefaultMaxStreamsPerConnection = 100; | |
| 98 | |
| 99 // Number of bytes reserved for public flags in the packet header. | |
| 100 const size_t kPublicFlagsSize = 1; | |
| 101 // Number of bytes reserved for version number in the packet header. | |
| 102 const size_t kQuicVersionSize = 4; | |
| 103 // Number of bytes reserved for path id in the packet header. | |
| 104 const size_t kQuicPathIdSize = 1; | |
| 105 // Number of bytes reserved for private flags in the packet header. | |
| 106 const size_t kPrivateFlagsSize = 1; | |
| 107 | |
| 108 // Signifies that the QuicPacket will contain version of the protocol. | |
| 109 const bool kIncludeVersion = true; | |
| 110 // Signifies that the QuicPacket will contain path id. | |
| 111 const bool kIncludePathId = true; | |
| 112 // Signifies that the QuicPacket will include a diversification nonce. | |
| 113 const bool kIncludeDiversificationNonce = true; | |
| 114 | |
| 115 // Stream ID is reserved to denote an invalid ID. | |
| 116 const QuicStreamId kInvalidStreamId = 0; | |
| 117 | |
| 118 // Reserved ID for the crypto stream. | |
| 119 const QuicStreamId kCryptoStreamId = 1; | |
| 120 | |
| 121 // Reserved ID for the headers stream. | |
| 122 const QuicStreamId kHeadersStreamId = 3; | |
| 123 | |
| 124 // Header key used to identify final offset on data stream when sending HTTP/2 | |
| 125 // trailing headers over QUIC. | |
| 126 NET_EXPORT_PRIVATE extern const char* const kFinalOffsetHeaderKey; | |
| 127 | |
| 128 // Maximum delayed ack time, in ms. | |
| 129 const int64_t kMaxDelayedAckTimeMs = 25; | |
| 130 | |
| 131 // Minimum tail loss probe time in ms. | |
| 132 static const int64_t kMinTailLossProbeTimeoutMs = 10; | |
| 133 | |
| 134 // The timeout before the handshake succeeds. | |
| 135 const int64_t kInitialIdleTimeoutSecs = 5; | |
| 136 // The default idle timeout. | |
| 137 const int64_t kDefaultIdleTimeoutSecs = 30; | |
| 138 // The maximum idle timeout that can be negotiated. | |
| 139 const int64_t kMaximumIdleTimeoutSecs = 60 * 10; // 10 minutes. | |
| 140 // The default timeout for a connection until the crypto handshake succeeds. | |
| 141 const int64_t kMaxTimeForCryptoHandshakeSecs = 10; // 10 secs. | |
| 142 | |
| 143 // Default limit on the number of undecryptable packets the connection buffers | |
| 144 // before the CHLO/SHLO arrive. | |
| 145 const size_t kDefaultMaxUndecryptablePackets = 10; | |
| 146 | |
| 147 // Default ping timeout. | |
| 148 const int64_t kPingTimeoutSecs = 15; // 15 secs. | |
| 149 | |
| 150 // Minimum number of RTTs between Server Config Updates (SCUP) sent to client. | |
| 151 const int kMinIntervalBetweenServerConfigUpdatesRTTs = 10; | |
| 152 | |
| 153 // Minimum time between Server Config Updates (SCUP) sent to client. | |
| 154 const int kMinIntervalBetweenServerConfigUpdatesMs = 1000; | |
| 155 | |
| 156 // Minimum number of packets between Server Config Updates (SCUP). | |
| 157 const int kMinPacketsBetweenServerConfigUpdates = 100; | |
| 158 | |
| 159 // The number of open streams that a server will accept is set to be slightly | |
| 160 // larger than the negotiated limit. Immediately closing the connection if the | |
| 161 // client opens slightly too many streams is not ideal: the client may have sent | |
| 162 // a FIN that was lost, and simultaneously opened a new stream. The number of | |
| 163 // streams a server accepts is a fixed increment over the negotiated limit, or a | |
| 164 // percentage increase, whichever is larger. | |
| 165 const float kMaxStreamsMultiplier = 1.1f; | |
| 166 const int kMaxStreamsMinimumIncrement = 10; | |
| 167 | |
| 168 // Available streams are ones with IDs less than the highest stream that has | |
| 169 // been opened which have neither been opened or reset. The limit on the number | |
| 170 // of available streams is 10 times the limit on the number of open streams. | |
| 171 const int kMaxAvailableStreamsMultiplier = 10; | |
| 172 | |
| 173 // Track the number of promises that are not yet claimed by a | |
| 174 // corresponding get. This must be smaller than | |
| 175 // kMaxAvailableStreamsMultiplier, because RST on a promised stream my | |
| 176 // create available streams entries. | |
| 177 const int kMaxPromisedStreamsMultiplier = kMaxAvailableStreamsMultiplier - 1; | |
| 178 | |
| 179 // TCP RFC calls for 1 second RTO however Linux differs from this default and | |
| 180 // define the minimum RTO to 200ms, we will use the same until we have data to | |
| 181 // support a higher or lower value. | |
| 182 static const int64_t kMinRetransmissionTimeMs = 200; | |
| 183 | |
| 184 // We define an unsigned 16-bit floating point value, inspired by IEEE floats | |
| 185 // (http://en.wikipedia.org/wiki/Half_precision_floating-point_format), | |
| 186 // with 5-bit exponent (bias 1), 11-bit mantissa (effective 12 with hidden | |
| 187 // bit) and denormals, but without signs, transfinites or fractions. Wire format | |
| 188 // 16 bits (little-endian byte order) are split into exponent (high 5) and | |
| 189 // mantissa (low 11) and decoded as: | |
| 190 // uint64_t value; | |
| 191 // if (exponent == 0) value = mantissa; | |
| 192 // else value = (mantissa | 1 << 11) << (exponent - 1) | |
| 193 const int kUFloat16ExponentBits = 5; | |
| 194 const int kUFloat16MaxExponent = (1 << kUFloat16ExponentBits) - 2; // 30 | |
| 195 const int kUFloat16MantissaBits = 16 - kUFloat16ExponentBits; // 11 | |
| 196 const int kUFloat16MantissaEffectiveBits = kUFloat16MantissaBits + 1; // 12 | |
| 197 const uint64_t kUFloat16MaxValue = // 0x3FFC0000000 | |
| 198 ((UINT64_C(1) << kUFloat16MantissaEffectiveBits) - 1) | |
| 199 << kUFloat16MaxExponent; | |
| 200 | |
| 201 // Default path ID. | |
| 202 const QuicPathId kDefaultPathId = 0; | |
| 203 // Invalid path ID. | |
| 204 const QuicPathId kInvalidPathId = 0xff; | |
| 205 | |
| 206 // kDiversificationNonceSize is the size, in bytes, of the nonce that a server | |
| 207 // may set in the packet header to ensure that its INITIAL keys are not | |
| 208 // duplicated. | |
| 209 const size_t kDiversificationNonceSize = 32; | |
| 210 | |
| 211 // The largest gap in packets we'll accept without closing the connection. | |
| 212 // This will likely have to be tuned. | |
| 213 const QuicPacketNumber kMaxPacketGap = 5000; | |
| 214 | |
| 215 enum TransmissionType : int8_t { | 42 enum TransmissionType : int8_t { |
| 216 NOT_RETRANSMISSION, | 43 NOT_RETRANSMISSION, |
| 217 FIRST_TRANSMISSION_TYPE = NOT_RETRANSMISSION, | 44 FIRST_TRANSMISSION_TYPE = NOT_RETRANSMISSION, |
| 218 HANDSHAKE_RETRANSMISSION, // Retransmits due to handshake timeouts. | 45 HANDSHAKE_RETRANSMISSION, // Retransmits due to handshake timeouts. |
| 219 ALL_UNACKED_RETRANSMISSION, // Retransmits all unacked packets. | 46 ALL_UNACKED_RETRANSMISSION, // Retransmits all unacked packets. |
| 220 ALL_INITIAL_RETRANSMISSION, // Retransmits all initially encrypted packets. | 47 ALL_INITIAL_RETRANSMISSION, // Retransmits all initially encrypted packets. |
| 221 LOSS_RETRANSMISSION, // Retransmits due to loss detection. | 48 LOSS_RETRANSMISSION, // Retransmits due to loss detection. |
| 222 RTO_RETRANSMISSION, // Retransmits due to retransmit time out. | 49 RTO_RETRANSMISSION, // Retransmits due to retransmit time out. |
| 223 TLP_RETRANSMISSION, // Tail loss probes. | 50 TLP_RETRANSMISSION, // Tail loss probes. |
| 224 LAST_TRANSMISSION_TYPE = TLP_RETRANSMISSION, | 51 LAST_TRANSMISSION_TYPE = TLP_RETRANSMISSION, |
| (...skipping 1294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1519 : iov(iov), iov_count(iov_count), total_length(total_length) {} | 1346 : iov(iov), iov_count(iov_count), total_length(total_length) {} |
| 1520 | 1347 |
| 1521 const struct iovec* iov; | 1348 const struct iovec* iov; |
| 1522 const int iov_count; | 1349 const int iov_count; |
| 1523 const size_t total_length; | 1350 const size_t total_length; |
| 1524 }; | 1351 }; |
| 1525 | 1352 |
| 1526 } // namespace net | 1353 } // namespace net |
| 1527 | 1354 |
| 1528 #endif // NET_QUIC_QUIC_PROTOCOL_H_ | 1355 #endif // NET_QUIC_QUIC_PROTOCOL_H_ |
| OLD | NEW |