diff --git a/session.go b/session.go index c3859a97c..bce7e67a8 100644 --- a/session.go +++ b/session.go @@ -579,6 +579,10 @@ func (s *session) sendPacket() error { utils.Debugf("\tDequeueing retransmission for packet 0x%x", retransmitPacket.PacketNumber) if retransmitPacket.EncryptionLevel != protocol.EncryptionForwardSecure { + if s.handshakeComplete { + // Don't retransmit handshake packets when the handshake is complete + continue + } utils.Debugf("\tDequeueing handshake retransmission for packet 0x%x", retransmitPacket.PacketNumber) stopWaitingFrame := s.sentPacketHandler.GetStopWaitingFrame(true) var packet *packedPacket diff --git a/session_test.go b/session_test.go index a16d10bd9..5ba27cc6e 100644 --- a/session_test.go +++ b/session_test.go @@ -991,6 +991,18 @@ var _ = Describe("Session", func() { Expect(sentPackets[0].Frames).To(HaveLen(2)) Expect(sentPackets[0].Frames).To(ContainElement(sf)) }) + + It("doesn't retransmit handshake packets when the handshake is complete", func() { + sess.handshakeComplete = true + sf := &frames.StreamFrame{StreamID: 1, Data: []byte("foobar")} + sph.retransmissionQueue = []*ackhandler.Packet{{ + Frames: []frames.Frame{sf}, + EncryptionLevel: protocol.EncryptionSecure, + }} + err := sess.sendPacket() + Expect(err).ToNot(HaveOccurred()) + Expect(mconn.written).To(BeEmpty()) + }) }) Context("for packets after the handshake", func() {