Christmas Patriarch

Killing Floor Dedicated Server Internet Optimization

Strong hardware and a fast internet uplink do not automatically make Killing Floor smooth. An Unreal Engine server can show good ping in the browser while players still see jitter, ping spikes, packet loss, phantom hits, and map-travel disconnects.

The goal is to show KF1 admins how to read network stats, where to look for bottlenecks, and which IpDrv.TcpNetDriver settings are worth changing.

First things to check

SymptomCheckTool
Ping jumps for everyoneCPU tick time, tickrate, outgoing bandwidthstat net, inject userflag 1, CPU monitoring
Packet loss for one playerroute to server and local player networktracert, PingPlotter, stat net
Packet loss for many playersserver uplink, redirect, tickrateserver monitoring, bytes/sec, packets/sec
Hits feel like they do not registerping, packet loss OUT, server authoritystat net, client FPS
Slow connectionsdownloads, redirect, InitialConnectTimeoutIpDrv.TcpNetDriver, HTTP redirect

Start with diagnostics. Blindly raising NetServerMaxTickRate often helps some players while making the server worse for everyone else.

1. Ping, latency, and bandwidth

Online play depends on two different things:

High bandwidth does not guarantee low ping. You can have a fast uplink and still have a bad route to a specific player. That is why “the server lags” should be checked with route quality, packet loss, and server load, not only internet speed.

2. Tracert and the route to the server

If only some players have the problem, ask them to test the route:

tracert server-ip-or-domain

What to look for:

For longer tests, PingPlotter or a similar tool is better than tracert, because tracert is only a snapshot.

3. stat net: main in-game diagnostic

Open the console and run:

stat net

Important fields:

FieldMeaning
Pinggame latency, not always the same as ICMP ping
Channelsrelevant actors the server tracks for this client
Unordered/secpackets that arrived out of order
Packet loss INloss from server to client
Packet loss OUTloss from client to server
Packets/secpackets per second
Bunches/secactor updates per second
Bytes/secactual data flow
Netspeedclient connection speed cap

Packet loss should be 0. Occasional spikes happen, but a constant nonzero value means the player is missing game information in one or both directions.

4. Why F1 ping and stat net differ

The scoreboard ping and stat net ping are calculated differently. Client FPS, server tickrate, and packet timing all affect the result, so F1 can show a nice number while the game still feels bad.

For diagnostics, prioritize:

If client FPS drops below incoming packets/sec, the player may feel “invisible packet loss”: packet loss stats look clean, but packet processing falls behind.

5. inject userflag 1: tickrate and CPU-time

For deeper testing, enable userflag:

inject userflag 1

Disable it with:

inject userflag 0

This can expose maximum tickrate and last server tick time. Use it only for diagnostics: it adds extra traffic and is not needed during normal play.

CPU sanity check:

net + act << 1000 / tickrate

Example: at tickrate 50, one tick has a 20 ms budget. If net + act regularly gets close to 20 ms, the server cannot reliably hold that tickrate.

6. Base IpDrv.TcpNetDriver block

The main settings live in KillingFloor.ini:

[IpDrv.TcpNetDriver]
AllowDownloads=True
ConnectionTimeout=15.0
InitialConnectTimeout=150.0
AckTimeout=1.0
KeepAliveTime=0.2
MaxInternetClientRate=10000
MaxClientRate=20000
SimLatency=0
RelevantTimeout=5.0
SpawnPrioritySeconds=1.0
ServerTravelPause=4.0
NetServerMaxTickRate=30
LanServerMaxTickRate=35
DownloadManagers=IpDrv.HTTPDownload
DownloadManagers=Engine.ChannelDownload

7. What is actually worth changing

SettingPractice
MaxInternetClientRateUsually 10000-15000; higher only when clients and uplink are stable
MaxClientRateLAN limit, 20000 is fine
NetServerMaxTickRateMain smoothness and load setting
LanServerMaxTickRateFor LAN or private low-ping games
InitialConnectTimeoutLower only for specific stuck-connection problems
RelevantTimeoutUsually keep 5.0
SpawnPrioritySecondsUsually keep 1.0
ServerTravelPauseUsually keep 4.0

MaxInternetClientRate caps server-to-client traffic. It does not fix a bad route from client to server and does not solve packet loss OUT.

8. Tickrate starting points

Tickrate is server FPS. Higher tickrate means the server accepts and sends updates more often. It can improve responsiveness, but it increases CPU and network load.

Server typeStarting tickrateNotes
6 players, normal KF30Good baseline
12 players40Watch bytes/sec and packet loss
12 players, strong clients45-50Only if players have no loss
20 players50-55Needs good CPU, bandwidth, and testing
International server30-40Routes matter more than theoretical speed

For heavily-modded servers, high zed counts, or mutators, start lower. More actors means more Channels and Bunches/sec, which means more data per client.

9. How to spot an excessive tickrate

Tickrate is too high if:

Lower NetServerMaxTickRate by 5 and test again.

10. Windows and Linux servers

Older Unreal/UT Linux servers could send packets less consistently relative to NetServerMaxTickRate, even when CPU was not maxed out.

Practical takeaway:

Modern hosting may behave differently, but the diagnostic principle is the same.

11. Downloads and HTTP redirect

AllowDownloads=True is needed for custom content, but large maps should not be served by the game process. When a player downloads a map directly from the server, they compete with active players for bandwidth.

Use HTTP redirect:

[IpDrv.HTTPDownload]
RedirectToURL=https://example.com/kf-redirect/
UseCompression=True

If redirect causes version errors, check that redirect files exactly match the server files.

12. Client settings still matter

Even a perfect server cannot fix bad client netspeed, weak FPS, or background software.

Players should check:

For old DSL/ISDN-class connections, too high client netspeed can create more traffic than the line can reliably handle. For modern connections, server caps around 10000-15000 are usually enough.

[IpDrv.TcpNetDriver]
AllowDownloads=True
ConnectionTimeout=15.0
InitialConnectTimeout=150.0
AckTimeout=1.0
KeepAliveTime=0.2
MaxInternetClientRate=10000
MaxClientRate=20000
SimLatency=0
RelevantTimeout=5.0
SpawnPrioritySeconds=1.0
ServerTravelPause=4.0
NetServerMaxTickRate=30
LanServerMaxTickRate=35
DownloadManagers=IpDrv.HTTPDownload
DownloadManagers=Engine.ChannelDownload

Then raise NetServerMaxTickRate gradually: 30 -> 35 -> 40 -> 45 -> 50, checking stat net, packet loss, CPU tick time, and player reports after each step.