On Wednesday 08 August 2007 15:39, Matthew Toseland wrote: > There hasn't been any such debate for some time. IIRC it stopped just > before one of the earlier spam attacks, and hasn't resumed since. You might > want to talk to mrogers about it. I will go through the messages from Frost > (which fortunately I still have on freenet.tech because of my long expiry > setting) and post the most important ones on tech or devl.
I posted all of them to tech. > > On Tuesday 07 August 2007 23:28, vive wrote: > > I could not find this discussion on the frost board any longer. Did it > > continue? Then I'd be happy if someone could post it to the list or send > > me a copy. :-) > > > > Also regarding the blocking-sockets method to let a node delay requests. > > This seems to have some sideeffects to me that may be unwanted later on. > > If Freenet would need a QoS mechanism or OOB data (some sort of control > > messages with higher priority) -- wouldnt blocking socket reads entirely > > for limiting requests also block these out? But I still find the idea > > interesting to delay traffic when the load is high rather than > > preemptively rejecting it. This would simplify adapting greedy routing to > > take delays into account (e.g. only having to consider delays as the > > extra factor when making routing decisions at a node will simplify things > > a lot by incorporating both the effect from link delay and node load). > > This is what I'm currently working on.. > > > > regards, > > Vilhelm > > > > On Mon, Jun 18, 2007 at 04:40:16PM +0100, Matthew Toseland wrote: > > > MRogers and Anonymous have been arguing that we should limit load only > > > on the immediate bandwidth level. Some of the thread is below, and my > > > response including a proposal for a bandwidth limiting mechanism: > > > > > > ----- mrogers at UU62+3E1vKT1k+7fR0Gx7ZN2IB0 ----- 2007.06.14 - > > > 21:32:43GMT ----- > > > > > > No, what I've been arguing is that we don't need to *explicitly* take > > > the lifetime overhead into account, because the feedback loop should be > > > slow enough that it will *implicitly* take it into account anyway. If > > > the feedback loop takes a few minutes to adapt (which it must if we > > > don't want to over-adapt to short-term conditions) then we're > > > implicitly measuring the lifetime overhead of a search, and we don't > > > need to make an additional explicit estimate of the lifetime overhead. > > > > > > ----- toad at zceUWxlSaHLmvEMnbr4RHnVfehA ----- 2007.06.15 - 17:12:52GMT > > > ----- > > > > > > What makes you think it would work at all? It seems to me that it would > > > simply oscillate - we accept too many requests, most of them time out, > > > the we accept too many requests again, and most of them timeout again. > > > KISS is one thing, but not slitting your own throat with occam's razor > > > is another! > > > > > > ----- mrogers at UU62+3E1vKT1k+7fR0Gx7ZN2IB0 ----- 2007.06.15 - > > > 21:44:34GMT ----- > > > > > > :) If the feedback loop is slow enough it shouldn't oscillate - that > > > : applies > > > > > > equally to bandwidth liability estimation, token passing or any other > > > mechanism - we musn't get into the situation of saying "I accepted 100 > > > requests in the last 10 seconds and nothing bad has happened yet, > > > therefore I can accept another 100". As far as I can see, the only way > > > to avoid that situation is by adapting very slowly, ie on the order of > > > the longest timeout. Luckily we expect the connections to be relatively > > > long-lived (minutes or hours) so we can afford to take a few minutes to > > > get up to speed. > > > > > > Assuming that we have a suitably slow feedback loop in place, the next > > > question is how to tell our peers when we're ready to accept another > > > search. We could use tokens, preemptive rejection or blocking sockets. > > > I don't have any religious opinions on this issue, but I thought > > > Anonymous made a fairly good case for handling it in the same way as > > > any other network app: don't read from the socket until you're ready to > > > process more data. I realise there's a highly variable relationship > > > between bytes in and bytes out, but regardless of which mechanism we > > > use we'll have to rely on the slow feedback loop to smooth that out, > > > because so far nobody's suggested a way of dealing with it that doesn't > > > involve favouring some kinds of traffic over others. (I hope we agree > > > that we don't want the whole network to end up favouring SSK traffic > > > over CHK traffic just because it happens to come in smaller quanta. > > > Maybe there are reasons for giving SSK traffic priority, but that isn't > > > one of them.) > > > > > > ----- toad at zceUWxlSaHLmvEMnbr4RHnVfehA ----- 2007.06.18 - 14:25:49GMT > > > ----- > > > > > > It's not possible using the mechanism you propose *on its own*, while > > > it *is* interesting. Here's why: I have 48kB/sec output. With your > > > proposed mechanism, the fact that I have 1MB/sec input won't matter. So > > > a leaf node requests a splitfile through me, which is all in the > > > network, but is not in my datastore. I route his requests. It takes 5 > > > seconds for enough of the requests to start transferring to make a > > > difference. Over that 5 seconds, he's sent me 240kB of requests. That's > > > around 240k/50 = 4,915 requests. Which will yield 160MB of data. > > > Unfortunately it will take me 160M/48k = nearly an hour to transfer all > > > the data. > > > > > > This is not acceptable, because we want Freenet requests to complete in > > > a reasonable amount of time - if only for fproxy support, which IMHO is > > > an important application. And I don't like the idea of having different > > > request priorities either; it gives away information on the traffic and > > > allows for Bad Things. > > > > > > Imposing an arbitrary limit on the number of requests running is not > > > the solution either. A limit may be imposed because of threads/memory > > > usage, but this is likely to be heavily architecture dependant. The > > > solution IMHO is to take into account likely future bandwidth usage. If > > > we want to guarantee that there are no timeouts, this means bandwidth > > > liability limiting. The current code will accept an SSK request only if > > > it could also accept a CHK request, and vice versa, so I don't see any > > > reason to think it is excessively biased in favour of CHKs. However if > > > you like I will add code to collect the probability of rejection for > > > SSKs and CHKs individually. > > > > > > For data blocks, clearly we cannot send one if there is no available > > > space in the congestion window to the peer in question. However we may > > > want the data for ourself, or for multiple peers, in which case the > > > slowest peer should not necessarily dictate the transfer rate; AFAICS > > > we must accept the data as fast as we can manage within memory/cpu/etc > > > limits, and limit the incoming bandwidth at a higher level. > > > > > > So given that we must limit traffic on the request level (as well as > > > the congestion control level), how can we do this? We can either: > > > > > > A) Wait for a request, and then either accept it or reject it, based on > > > e.g. how many requests are running already. > > > PRO: > > > - Simple > > > CON: > > > - Wasteful of time and bandwidth when we have to ask multiple peers > > > before one accepts > > > - Difficult to adapt to propagate load back to source > > > > > > Queueing doesn't help much here because we still have to complete the > > > request - including queueing it - in a reasonable time. > > > > > > or > > > > > > B) Tell our peers when they can send us a request. The obvious way to > > > do this is to compute our overall quota of requests (or > > > request-success-bytes), and allocate it to our peers (and tell them on > > > every packet/response/etc), initially equally, but progressively > > > allowing more to busier nodes and less to nodes that don't use their > > > quota (but with diminishing returns: a node with a low quota that > > > suddenly starts using more will take quota away from an established > > > heavy requestor). Thus, initially, if most nodes aren't busy we won't > > > run many requests, but as we identify those nodes which need a bigger > > > quota, more requests run overall. Note that running fewer requests than > > > we could isn't necessarily a problem anyway unless they complete really > > > slowly. > > > > > > How to avoid excessive misrouting? > > > Options: > > > 1: We don't need to queue requests, as they are queued on the next node > > > for us (running requests can be regarded as queued requests). When we > > > get a request, we identify the set of nodes that we are willing to > > > route it to, and if none of them have any free request slots, we reject > > > it. 2: Queueing requests helps, because we can match requests with > > > nodes. When we get a request, (if it's allowable by the node's current > > > quota), we queue it. When we have a slot in an outgoing node's quota, > > > we send the request which is closest to the node's location (which > > > hasn't already been to that node), regardless of the time it's been > > > queued for (if multiple nodes have space, we find the best request/node > > > pair until they don't or we run out of requests). If after a certain > > > period a request hasn't been sent, we reject it. This avoids excessive > > > misrouting without requiring arbitrary parameters (as the first option > > > does), and sends more specialised requests to slower nodes. 3: > > > Simulated queueing: remember the locations of recent requests we could > > > have sent to a node, and calculate a threshold, which decays over time > > > if we don't accept a request (obviously this will result in fewer > > > requests being sent, but lower latency). > > > > > > Does this prevent flooding? Yes: we only accept, and offer, as many > > > requests as we can handle, and with the right fairness algorithms, a > > > flood will be limited to what the other peers don't need, although if > > > our overall quota calculation is too generous flooding may still be an > > > effective attack. Obviously on opennet, connecting to several hundred > > > peers and flooding to each of them will be fairly effective; opennet > > > sucks, we all know this, it's a transition phase. > > > > > > Does this propagate load back to the originator? Not explicitly, as > > > it's not an originator-throttles scheme (such schemes don't prevent > > > flooding and may make it easier to identify the originator). However, > > > the rate at which a node can send requests is quite clearly limited by > > > the rate at which the rest of the network can handle them: > > > > > > O - A - B - C > > > > > > If B is a bottleneck, then O will only send requests at the rate that > > > can be funneled through it (or satisfied on A). > > > > > > > > > > > > _______________________________________________ > > > Devl mailing list > > > Devl at freenetproject.org > > > http://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 189 bytes Desc: not available URL: <https://emu.freenetproject.org/pipermail/devl/attachments/20070808/f1bdd77f/attachment.pgp>