public class PeerState extends Object
Modifier and Type | Field and Description |
---|---|
static int |
LARGE_MTU
IPv4 Max MTU
based on measurements, 1350 fits nearly all reasonably small I2NP messages
(larger I2NP messages may be up to 1900B-4500B, which isn't going to fit
into a live network MTU anyway)
TODO
VTBM is 2646, it would be nice to fit in two large
2646 / 2 = 1323
1323 + 74 + 46 + 1 + (4 * 9) = 1480
So why not make it 1492 (old ethernet is 1492, new is 1500)
Changed to 1492 in 0.8.9
BUT through 0.8.11,
size estimate was bad, actual packet was up to 48 bytes bigger
To be figured out.
|
static int |
MAX_IPV6_MTU |
static int |
MAX_MTU
Max of IPv4 and IPv6 max MTUs
|
static int |
MIN_IPV6_MTU
IPv6/UDP header is 48 bytes, so we want MTU % 16 == 0.
|
static int |
MIN_MTU
IPv4 Min MTU
596 gives us 588 IP byes, 568 UDP bytes, and with an SSU data message,
522 fragment bytes, which is enough to send a tunnel data message in 2
packets.
|
(package private) static long |
RETRANSMISSION_PERIOD_WIDTH
how many packets will be considered within the retransmission rate calculation
|
Constructor and Description |
---|
PeerState(RouterContext ctx,
UDPTransport transport,
byte[] remoteIP,
int remotePort,
Hash remotePeer,
boolean isInbound,
int rtt) |
Modifier and Type | Method and Description |
---|---|
(package private) boolean |
acked(ACKBitfield bitfield,
InboundMessageFragments.ModifiableLong highestSeqNumAcked)
A partial ACK was received.
|
(package private) boolean |
acked(long messageId,
InboundMessageFragments.ModifiableLong highestSeqNumAcked)
A full ACK was received.
|
(package private) void |
add(OutboundMessageState state)
TODO should this use a queue, separate from the list of msgs pending an ack?
TODO bring back tail drop?
TODO priority queue? (we don't implement priorities in SSU now)
TODO backlog / pushback / block instead of dropping? Can't really block here.
|
(package private) void |
adjustClockSkew(long skew)
Update the moving-average clock skew based on the current difference.
|
(package private) List<OutboundMessageState> |
allocateSend(long now)
Pick one or more messages we want to send and allocate them out of our window
Adjusts the retransmit timer if necessary.
|
(package private) void |
changePort(int newPort)
Caller should sync; UDPTransport must remove and add to peersByRemoteHost map
|
(package private) void |
dataReceived() |
(package private) void |
dropOutbound()
drop all outbound messages
|
(package private) void |
ECNReceived()
We received a backoff request, so cut our send window.
|
(package private) int |
expireInboundMessages()
Expire partially received inbound messages, returning how many are still pending.
|
(package private) void |
fetchPartialACKs(List<ACKBitfield> rv) |
(package private) int |
finishMessages(long now)
Expire / complete any outbound messages
High usage -
OutboundMessageFragments.getNextVolley() calls this 1st.
|
(package private) int |
fragmentOverhead()
Packet overhead plus room for acks
|
(package private) int |
fragmentSize()
how much payload data can we shove in there?
|
long |
getClockSkew()
How far off is the remote peer from our clock, in milliseconds?
A positive number means our clock is ahead of theirs.
|
int |
getConcurrentSends()
2nd stat in CWND column, otherwise unused,
candidate for removal
|
int |
getConcurrentSendWindow()
3rd stat in CWND column, otherwise unused,
candidate for removal
|
int |
getConsecutiveFailedSends()
how many seconds have we sent packets without any ACKs received?
|
int |
getConsecutiveSendRejections()
4th stat in CWND column, otherwise unused,
candidate for removal
|
(package private) SessionKey |
getCurrentCipherKey()
The AES key used to encrypt/decrypt packets, set only after the
connection is established.
|
(package private) List<Long> |
getCurrentFullACKs()
Grab a list of message ids (Long) that we want to send to the remote
peer, regardless of the packet size, but don't remove it from our
"want to send" list.
|
(package private) SessionKey |
getCurrentMACKey()
The AES key used to verify packets, set only after the connection is
established.
|
(package private) List<Long> |
getCurrentResendACKs()
Grab a list of message ids (Long) that we want to send to the remote
peer, regardless of the packet size, but don't remove it from our
"want to send" list.
|
long |
getInactivityTime() |
(package private) Map<Long,InboundMessageState> |
getInboundMessages()
Fetch the internal id (Long) to InboundMessageState for incomplete inbound messages.
|
(package private) long |
getIntroducerTime()
the last time we used them as an introducer, or 0
|
long |
getKeyEstablishedTime()
when were the current cipher and MAC keys established/rekeyed?
|
long |
getLastACKSend()
when did we last send an ACK to the peer?
|
long |
getLastReceiveTime()
when did we last receive a packet from them?
|
long |
getLastSendFullyTime()
when did we last send them a message that was ACKed?
|
(package private) long |
getLastSendOrPingTime()
Latest of last sent, last ACK, last ping
|
long |
getLastSendTime()
when did we last send them a packet?
|
boolean |
getMayDisconnect() |
int |
getMessagesReceived()
I2NP messages received.
|
int |
getMessagesSent()
I2NP messages sent.
|
int |
getMTU()
what is the largest packet we can send to the peer?
|
(package private) SessionKey |
getNextCipherKey()
The pending AES key for encrypting/decrypting packets if we are
rekeying the connection, or null if we are not in the process
of rekeying.
|
(package private) int |
getNextDelay(long now)
High usage -
OutboundMessageFragments.getNextVolley() calls this 3rd, if allocateSend() returned null.
|
(package private) SessionKey |
getNextMACKey()
The pending AES key for verifying packets if we are rekeying the
connection, or null if we are not in the process of rekeying.
|
int |
getOutboundMessageCount() |
int |
getPacketsReceived() |
int |
getPacketsReceivedDuplicate() |
int |
getPacketsRetransmitted() |
int |
getPacketsTransmitted() |
int |
getReceiveBps()
An approximation, for display only
|
int |
getReceiveMTU()
Estimate how large the other side's MTU is.
|
(package private) RemoteHostId |
getRemoteHostId() |
byte[] |
getRemoteIP()
what IP is the peer sending and receiving packets on?
|
InetAddress |
getRemoteIPAddress() |
Hash |
getRemotePeer()
The peer are we talking to.
|
int |
getRemotePort()
what port is the peer sending and receiving packets on?
|
int |
getRTO()
how soon should we retransmit an unacked packet?
|
int |
getRTT()
how long does it usually take to get a message ACKed?
|
int |
getRTTDeviation()
how skewed are the measured RTTs?
|
int |
getSendBps()
The Westwood+ bandwidth estimate
|
int |
getSendWindowBytes()
how many bytes should we send to the peer in a second
1st stat in CWND column, otherwise unused,
candidate for removal
|
int |
getSendWindowBytesRemaining()
how many bytes can we send to the peer in the current second
|
int |
getSlowStartThreshold()
stat in SST column, otherwise unused,
candidate for removal
|
long |
getTheyRelayToUsAs()
If they have offered to serve as an introducer to us, this is the tag
we can use to publish that fact.
|
(package private) UDPTransport |
getTransport()
Convenience for OutboundMessageState so it can fail itself
|
long |
getWantedACKSendSince() |
long |
getWeRelayToThemAs()
if we are serving as an introducer to them, this is the the tag that
they can publish that, when presented to us, will cause us to send
a relay introduction to the current peer
|
(package private) boolean |
highestSeqNumAcked(long highest)
Enter or leave fast retransmit mode, and adjust
SST and window variables accordingly.
|
(package private) int |
incrementConsecutiveFailedSends() |
boolean |
isBacklogged() |
boolean |
isInbound() |
boolean |
isIPv6() |
(package private) void |
loadFrom(PeerState oldPeer)
Transfer the basic activity/state from the old peer to the current peer
|
(package private) void |
messageFullyReceived(Long messageId,
int bytes)
We received the message specified completely.
|
(package private) void |
messagePartiallyReceived() |
(package private) void |
messageRetransmitted(int packets)
we are resending a packet, so lets jack up the rto
|
(package private) void |
packetReceived(int size) |
(package private) void |
packetsTransmitted(int packets) |
(package private) void |
removeACKMessage(Long messageId)
The ack was sent.
|
(package private) List<ACKBitfield> |
retrieveACKBitfields()
Deprecated.
unused
|
(package private) List<ACKBitfield> |
retrieveACKBitfields(boolean alwaysIncludeRetransmissions)
See above.
|
(package private) void |
setCurrentCipherKey(SessionKey key)
The AES key used to encrypt/decrypt packets, set only after the
connection is established.
|
(package private) void |
setCurrentMACKey(SessionKey key)
The AES key used to verify packets, set only after the connection is
established.
|
(package private) void |
setHisMTU(int mtu) |
(package private) void |
setIntroducerTime()
set the last time we used them as an introducer to now
|
void |
setLastACKSend(long when)
Deprecated.
unused
|
(package private) void |
setLastPingTime(long when)
Note ping sent.
|
(package private) void |
setLastReceiveTime(long when)
when did we last receive a packet from them?
|
(package private) void |
setLastSendTime(long when)
when did we last send them a packet?
|
void |
setMayDisconnect()
Sets to true.
|
(package private) void |
setTheyRelayToUsAs(long tag)
If they have offered to serve as an introducer to us, this is the tag
we can use to publish that fact.
|
(package private) void |
setWeRelayToThemAs(long tag)
if we are serving as an introducer to them, this is the the tag that
they can publish that, when presented to us, will cause us to send
a relay introduction to the current peer
|
String |
toString() |
(package private) boolean |
unsentACKThresholdReached()
Are we out of room to send all the current unsent acks in a single packet?
This is a huge threshold (134 for small MTU and 255 for large MTU)
that is rarely if ever exceeded in practice.
|
static final long RETRANSMISSION_PERIOD_WIDTH
public static final int MIN_MTU
public static final int MIN_IPV6_MTU
public static final int MAX_IPV6_MTU
public static final int LARGE_MTU
public static final int MAX_MTU
public PeerState(RouterContext ctx, UDPTransport transport, byte[] remoteIP, int remotePort, Hash remotePeer, boolean isInbound, int rtt)
rtt
- from the EstablishState, or 0 if not availablevoid changePort(int newPort)
public Hash getRemotePeer()
SessionKey getCurrentMACKey()
SessionKey getCurrentCipherKey()
SessionKey getNextMACKey()
SessionKey getNextCipherKey()
public long getKeyEstablishedTime()
public long getClockSkew()
public long getLastSendTime()
public long getLastSendFullyTime()
public long getLastReceiveTime()
public int getConsecutiveFailedSends()
public int getSendWindowBytes()
public int getSendWindowBytesRemaining()
public byte[] getRemoteIP()
public InetAddress getRemoteIPAddress()
public int getRemotePort()
public long getWeRelayToThemAs()
public long getTheyRelayToUsAs()
public int getMTU()
public int getReceiveMTU()
void setCurrentMACKey(SessionKey key)
void setCurrentCipherKey(SessionKey key)
void adjustClockSkew(long skew)
skew
- milliseconds, NOT adjusted for RTT.void setLastSendTime(long when)
void setLastReceiveTime(long when)
void setLastPingTime(long when)
long getLastSendOrPingTime()
public int getSendBps()
public int getReceiveBps()
int incrementConsecutiveFailedSends()
public long getInactivityTime()
void setWeRelayToThemAs(long tag)
tag
- 1 to Integer.MAX_VALUE, or 0 if relaying disabledvoid setTheyRelayToUsAs(long tag)
tag
- 1 to Integer.MAX_VALUE, or 0 if relaying disabledpublic int getSlowStartThreshold()
public int getConcurrentSends()
public int getConcurrentSendWindow()
public int getConsecutiveSendRejections()
public boolean isInbound()
public boolean isIPv6()
long getIntroducerTime()
void setIntroducerTime()
void messageFullyReceived(Long messageId, int bytes)
bytes
- if less than or equal to zero, message is a duplicate.void messagePartiallyReceived()
Map<Long,InboundMessageState> getInboundMessages()
int expireInboundMessages()
List<Long> getCurrentFullACKs()
List<Long> getCurrentResendACKs()
void removeACKMessage(Long messageId)
@Deprecated List<ACKBitfield> retrieveACKBitfields()
List<ACKBitfield> retrieveACKBitfields(boolean alwaysIncludeRetransmissions)
void fetchPartialACKs(List<ACKBitfield> rv)
rv
- out parameter, populated with true partial ACKBitfields.
no full bitfields are included.void setHisMTU(int mtu)
void messageRetransmitted(int packets)
void packetsTransmitted(int packets)
public int getRTT()
public int getRTO()
public int getRTTDeviation()
public int getMessagesSent()
public int getMessagesReceived()
public int getPacketsTransmitted()
public int getPacketsRetransmitted()
public int getPacketsReceived()
public int getPacketsReceivedDuplicate()
void packetReceived(int size)
size
- not including IP header, UDP header, MAC or IVvoid ECNReceived()
void dataReceived()
public long getLastACKSend()
@Deprecated public void setLastACKSend(long when)
public long getWantedACKSendSince()
boolean unsentACKThresholdReached()
RemoteHostId getRemoteHostId()
void add(OutboundMessageState state)
void dropOutbound()
public int getOutboundMessageCount()
public void setMayDisconnect()
public boolean getMayDisconnect()
int finishMessages(long now)
List<OutboundMessageState> allocateSend(long now)
int getNextDelay(long now)
now
- what time it is nowpublic boolean isBacklogged()
int fragmentSize()
int fragmentOverhead()
boolean acked(long messageId, InboundMessageFragments.ModifiableLong highestSeqNumAcked)
highestSeqNumAcked
- in/out param, will modify if this seq. number is higherboolean acked(ACKBitfield bitfield, InboundMessageFragments.ModifiableLong highestSeqNumAcked)
highestSeqNumAcked
- in/out param, will modify if this seq. number is higherboolean highestSeqNumAcked(long highest)
highest
- the highest sequence number that was ackedvoid loadFrom(PeerState oldPeer)
oldPeer
- non-nullUDPTransport getTransport()