# rpc error: code = Unavailable desc = connection error: desc = "transport: http2Client.notifyError got notified that the client transport was broken EOF"

- **ID:** `go/grpc-keepalive-too-frequent`
- **Domain:** go
- **Category:** network_error
- **Verification:** ai_generated
- **Fix Rate:** 80%

## Root Cause

Client keepalive pings are more frequent than the server's enforcement policy allows; the server sends GOAWAY and closes the connection.

## Version Compatibility

| Version | Status | Introduced | Deprecated |
|---------|--------|------------|------------|
| google.golang.org/grpc v1.55+ | active | — | — |

## Workarounds

1. **** (92% success)
   ```
   kp := keepalive.ClientParameters{
    Time:                5 * time.Minute,
    Timeout:             20 * time.Second,
    PermitWithoutStream: false,
}
conn, _ := grpc.NewClient(addr,
    grpc.WithKeepaliveParams(kp),
    grpc.WithTransportCredentials(insecure.NewCredentials()),
)
   ```
2. **** (88% success)
   ```
   s := grpc.NewServer(grpc.KeepaliveEnforcementPolicy(keepalive.EnforcementPolicy{
    MinTime:             10 * time.Second,
    PermitWithoutStream: false,
}))
   ```

## Dead Ends

- **** — Idle connections behind NAT/LB get silently dropped; subsequent RPCs fail with Unavailable. (70% fail)
- **** — Makes the problem worse — server enforces MinTime and closes the connection faster. (95% fail)
