Documentation ¶
Overview ¶
Package tcp contains the implementation of the TCP transport protocol.
Index ¶
- Constants
- func FindWndScale(wnd seqnum.Size) int
- func GetTCPReceiveBufferLimits(s tcpip.StackHandler) tcpip.ReceiveBufferSizeOption
- func GetTCPSendBufferLimits(s tcpip.StackHandler) tcpip.SendBufferSizeOption
- func NewProtocol(s *stack.Stack) stack.TransportProtocol
- func TrimSACKBlockList(sack *SACKInfo, rcvNxt seqnum.Value)
- func UpdateSACKBlocks(sack *SACKInfo, segStart seqnum.Value, segEnd seqnum.Value, ...)
- type EndpointState
- type Forwarder
- type ForwarderRequest
- type ReceiveErrors
- type SACKInfo
- type SACKScoreboard
- func (s *SACKScoreboard) Copy() (sackBlocks []header.SACKBlock, maxSACKED seqnum.Value)
- func (s *SACKScoreboard) Delete(seq seqnum.Value)
- func (s *SACKScoreboard) Empty() bool
- func (s *SACKScoreboard) Insert(r header.SACKBlock)
- func (s *SACKScoreboard) IsLost(seq seqnum.Value) bool
- func (s *SACKScoreboard) IsRangeLost(r header.SACKBlock) bool
- func (s *SACKScoreboard) IsSACKED(r header.SACKBlock) bool
- func (s *SACKScoreboard) MaxSACKED() seqnum.Value
- func (s *SACKScoreboard) Reset()
- func (s *SACKScoreboard) SMSS() uint16
- func (s *SACKScoreboard) Sacked() seqnum.Size
- func (s *SACKScoreboard) StateFields() []string
- func (s *SACKScoreboard) StateLoad(stateSourceObject state.Source)
- func (s *SACKScoreboard) StateSave(stateSinkObject state.Sink)
- func (s *SACKScoreboard) StateTypeName() string
- func (s *SACKScoreboard) String() string
- type SendErrors
- type Stats
Constants ¶
const ( // ProtocolNumber is the tcp protocol number. ProtocolNumber = header.TCPProtocolNumber // MinBufferSize is the smallest size of a receive or send buffer. MinBufferSize = 4 << 10 // 4096 bytes. // DefaultSendBufferSize is the default size of the send buffer for // an endpoint. DefaultSendBufferSize = 1 << 20 // 1MB // DefaultReceiveBufferSize is the default size of the receive buffer // for an endpoint. DefaultReceiveBufferSize = 1 << 20 // 1MB // MaxBufferSize is the largest size a receive/send buffer can grow to. MaxBufferSize = 4 << 20 // 4MB // DefaultTCPLingerTimeout is the amount of time that sockets linger in // FIN_WAIT_2 state before being marked closed. DefaultTCPLingerTimeout = 60 * time.Second // MaxTCPLingerTimeout is the maximum amount of time that sockets // linger in FIN_WAIT_2 state before being marked closed. MaxTCPLingerTimeout = 120 * time.Second // DefaultTCPTimeWaitTimeout is the amount of time that sockets linger // in TIME_WAIT state before being marked closed. DefaultTCPTimeWaitTimeout = 60 * time.Second // DefaultSynRetries is the default value for the number of SYN retransmits // before a connect is aborted. DefaultSynRetries = 6 // DefaultKeepaliveIdle is the idle time for a connection before keep-alive // probes are sent. DefaultKeepaliveIdle = 2 * time.Hour // DefaultKeepaliveInterval is the time between two successive keep-alive // probes. DefaultKeepaliveInterval = 75 * time.Second // DefaultKeepaliveCount is the number of keep-alive probes that are sent // before declaring the connection dead. DefaultKeepaliveCount = 9 )
const ( // MinRTO is the minimum allowed value for the retransmit timeout. MinRTO = 200 * time.Millisecond // MaxRTO is the maximum allowed value for the retransmit timeout. MaxRTO = 120 * time.Second // MinSRTT is the minimum allowed value for smoothed RTT. MinSRTT = 1 * time.Millisecond // InitialCwnd is the initial congestion window. InitialCwnd = 10 // MaxRetries is the maximum number of probe retries sender does // before timing out the connection. // Linux default TCP_RETR2, net.ipv4.tcp_retries2. MaxRetries = 15 )
const InitialRTO = time.Second
InitialRTO is the initial retransmission timeout. https://github.com/torvalds/linux/blob/7c636d4d20f/include/net/tcp.h#L142
const ( // MaxSACKBlocks is the maximum number of SACK blocks stored // at receiver side. MaxSACKBlocks = 6 )
const ( // SegOverheadFactor is used to multiply the value provided by the // user on a SetSockOpt for setting the socket send/receive buffer sizes. SegOverheadFactor = 2 )
const ( // SegOverheadSize is the size of an empty seg in memory including packet // buffer overhead. It is advised to use SegOverheadSize instead of segSize // in all cases where accounting for segment memory overhead is important. SegOverheadSize = segSize + stack.PacketBufferStructSize + header.IPv4MaximumHeaderSize )
Variables ¶
This section is empty.
Functions ¶
func FindWndScale ¶
FindWndScale determines the window scale to use for the given maximum window size.
func GetTCPReceiveBufferLimits ¶
func GetTCPReceiveBufferLimits(s tcpip.StackHandler) tcpip.ReceiveBufferSizeOption
GetTCPReceiveBufferLimits is used to get send buffer size limits for TCP.
func GetTCPSendBufferLimits ¶
func GetTCPSendBufferLimits(s tcpip.StackHandler) tcpip.SendBufferSizeOption
GetTCPSendBufferLimits is used to get send buffer size limits for TCP.
func NewProtocol ¶
func NewProtocol(s *stack.Stack) stack.TransportProtocol
NewProtocol returns a TCP transport protocol.
func TrimSACKBlockList ¶
TrimSACKBlockList updates the sack block list by removing/modifying any block where start is < rcvNxt.
func UpdateSACKBlocks ¶
func UpdateSACKBlocks(sack *SACKInfo, segStart seqnum.Value, segEnd seqnum.Value, rcvNxt seqnum.Value)
UpdateSACKBlocks updates the list of SACK blocks to include the segment specified by segStart->segEnd. If the segment happens to be an out of order delivery then the first block in the sack.blocks always includes the segment identified by segStart->segEnd.
Types ¶
type EndpointState ¶
type EndpointState tcpip.EndpointState
EndpointState represents the state of a TCP endpoint.
const ( // TCP protocol states in sync with the definitions in // https://github.com/torvalds/linux/blob/7acac4b3196/include/net/tcp_states.h#L13 StateEstablished EndpointState StateSynSent StateSynRecv StateFinWait1 StateFinWait2 StateTimeWait StateClose StateCloseWait StateLastAck StateListen StateClosing // Endpoint states internal to netstack. StateInitial StateBound StateConnecting // Connect() called, but the initial SYN hasn't been sent. StateError )
Endpoint states. Note that are represented in a netstack-specific manner and may not be meaningful externally. Specifically, they need to be translated to Linux's representation for these states if presented to userspace.
func (EndpointState) String ¶
func (s EndpointState) String() string
String implements fmt.Stringer.String.
type Forwarder ¶
type Forwarder struct {
// contains filtered or unexported fields
}
Forwarder is a connection request forwarder, which allows clients to decide what to do with a connection request, for example: ignore it, send a RST, or attempt to complete the 3-way handshake.
The canonical way of using it is to pass the Forwarder.HandlePacket function to stack.SetTransportProtocolHandler.
func NewForwarder ¶
func NewForwarder(s *stack.Stack, rcvWnd, maxInFlight int, handler func(*ForwarderRequest)) *Forwarder
NewForwarder allocates and initializes a new forwarder with the given maximum number of in-flight connection attempts. Once the maximum is reached new incoming connection requests will be ignored.
If rcvWnd is set to zero, the default buffer size is used instead.
func (*Forwarder) HandlePacket ¶
func (f *Forwarder) HandlePacket(id stack.TransportEndpointID, pkt stack.PacketBufferPtr) bool
HandlePacket handles a packet if it is of interest to the forwarder (i.e., if it's a SYN packet), returning true if it's the case. Otherwise the packet is not handled and false is returned.
This function is expected to be passed as an argument to the stack.SetTransportProtocolHandler function.
type ForwarderRequest ¶
type ForwarderRequest struct {
// contains filtered or unexported fields
}
ForwarderRequest represents a connection request received by the forwarder and passed to the client. Clients must eventually call Complete() on it, and may optionally create an endpoint to represent it via CreateEndpoint.
func (*ForwarderRequest) Complete ¶
func (r *ForwarderRequest) Complete(sendReset bool)
Complete completes the request, and optionally sends a RST segment back to the sender.
func (*ForwarderRequest) CreateEndpoint ¶
CreateEndpoint creates a TCP endpoint for the connection request, performing the 3-way handshake in the process.
func (*ForwarderRequest) ID ¶
func (r *ForwarderRequest) ID() stack.TransportEndpointID
ID returns the 4-tuple (src address, src port, dst address, dst port) that represents the connection request.
type ReceiveErrors ¶
type ReceiveErrors struct { tcpip.ReceiveErrors // SegmentQueueDropped is the number of segments dropped due to // a full segment queue. SegmentQueueDropped tcpip.StatCounter // ChecksumErrors is the number of segments dropped due to bad checksums. ChecksumErrors tcpip.StatCounter // ListenOverflowSynDrop is the number of times the listen queue overflowed // and a SYN was dropped. ListenOverflowSynDrop tcpip.StatCounter // ListenOverflowAckDrop is the number of times the final ACK // in the handshake was dropped due to overflow. ListenOverflowAckDrop tcpip.StatCounter // ZeroRcvWindowState is the number of times we advertised // a zero receive window when rcvQueue is full. ZeroRcvWindowState tcpip.StatCounter // WantZeroWindow is the number of times we wanted to advertise a // zero receive window but couldn't because it would have caused // the receive window's right edge to shrink. WantZeroRcvWindow tcpip.StatCounter }
ReceiveErrors collect segment receive errors within transport layer.
+stateify savable
func (*ReceiveErrors) StateFields ¶
func (r *ReceiveErrors) StateFields() []string
func (*ReceiveErrors) StateLoad ¶
func (r *ReceiveErrors) StateLoad(stateSourceObject state.Source)
+checklocksignore
func (*ReceiveErrors) StateSave ¶
func (r *ReceiveErrors) StateSave(stateSinkObject state.Sink)
+checklocksignore
func (*ReceiveErrors) StateTypeName ¶
func (r *ReceiveErrors) StateTypeName() string
type SACKInfo ¶
type SACKInfo struct { // Blocks is the maximum number of SACK blocks we track // per endpoint. Blocks [MaxSACKBlocks]header.SACKBlock // NumBlocks is the number of valid SACK blocks stored in the // blocks array above. NumBlocks int }
SACKInfo holds TCP SACK related information for a given endpoint.
+stateify savable
func (*SACKInfo) StateFields ¶
func (*SACKInfo) StateTypeName ¶
type SACKScoreboard ¶
type SACKScoreboard struct {
// contains filtered or unexported fields
}
SACKScoreboard stores a set of disjoint SACK ranges.
+stateify savable
func NewSACKScoreboard ¶
func NewSACKScoreboard(smss uint16, iss seqnum.Value) *SACKScoreboard
NewSACKScoreboard returns a new SACK Scoreboard.
func (*SACKScoreboard) Copy ¶
func (s *SACKScoreboard) Copy() (sackBlocks []header.SACKBlock, maxSACKED seqnum.Value)
Copy provides a copy of the SACK scoreboard.
func (*SACKScoreboard) Delete ¶
func (s *SACKScoreboard) Delete(seq seqnum.Value)
Delete removes all SACK information prior to seq.
func (*SACKScoreboard) Empty ¶
func (s *SACKScoreboard) Empty() bool
Empty returns true if the SACK scoreboard has no entries, false otherwise.
func (*SACKScoreboard) Insert ¶
func (s *SACKScoreboard) Insert(r header.SACKBlock)
Insert inserts/merges the provided SACKBlock into the scoreboard.
func (*SACKScoreboard) IsLost ¶
func (s *SACKScoreboard) IsLost(seq seqnum.Value) bool
IsLost implements the IsLost(SeqNum) operation defined in RFC3517 section 4.
This routine returns whether the given sequence number is considered to be lost. The routine returns true when either nDupAckThreshold discontiguous SACKed sequences have arrived above 'SeqNum' or (nDupAckThreshold * SMSS) bytes with sequence numbers greater than 'SeqNum' have been SACKed. Otherwise, the routine returns false.
func (*SACKScoreboard) IsRangeLost ¶
func (s *SACKScoreboard) IsRangeLost(r header.SACKBlock) bool
IsRangeLost implements the IsLost(SeqNum) operation defined in RFC 6675 section 4 but operates on a range of sequence numbers and returns true if there are at least nDupAckThreshold SACK blocks greater than the range being checked or if at least (nDupAckThreshold-1)*s.smss bytes have been SACKED with sequence numbers greater than the block being checked.
func (*SACKScoreboard) IsSACKED ¶
func (s *SACKScoreboard) IsSACKED(r header.SACKBlock) bool
IsSACKED returns true if the a given range of sequence numbers denoted by r are already covered by SACK information in the scoreboard.
func (*SACKScoreboard) MaxSACKED ¶
func (s *SACKScoreboard) MaxSACKED() seqnum.Value
MaxSACKED returns the highest sequence number ever inserted in the SACK scoreboard.
func (*SACKScoreboard) Reset ¶
func (s *SACKScoreboard) Reset()
Reset erases all known range information from the SACK scoreboard.
func (*SACKScoreboard) SMSS ¶
func (s *SACKScoreboard) SMSS() uint16
SMSS returns the sender's MSS as held by the SACK scoreboard.
func (*SACKScoreboard) Sacked ¶
func (s *SACKScoreboard) Sacked() seqnum.Size
Sacked returns the current number of bytes held in the SACK scoreboard.
func (*SACKScoreboard) StateFields ¶
func (s *SACKScoreboard) StateFields() []string
func (*SACKScoreboard) StateLoad ¶
func (s *SACKScoreboard) StateLoad(stateSourceObject state.Source)
+checklocksignore
func (*SACKScoreboard) StateSave ¶
func (s *SACKScoreboard) StateSave(stateSinkObject state.Sink)
+checklocksignore
func (*SACKScoreboard) StateTypeName ¶
func (s *SACKScoreboard) StateTypeName() string
func (*SACKScoreboard) String ¶
func (s *SACKScoreboard) String() string
String returns human-readable state of the scoreboard structure.
type SendErrors ¶
type SendErrors struct { tcpip.SendErrors // SegmentSendToNetworkFailed is the number of TCP segments failed to be sent // to the network endpoint. SegmentSendToNetworkFailed tcpip.StatCounter // SynSendToNetworkFailed is the number of TCP SYNs failed to be sent // to the network endpoint. SynSendToNetworkFailed tcpip.StatCounter // Retransmits is the number of TCP segments retransmitted. Retransmits tcpip.StatCounter // FastRetransmit is the number of segments retransmitted in fast // recovery. FastRetransmit tcpip.StatCounter // Timeouts is the number of times the RTO expired. Timeouts tcpip.StatCounter }
SendErrors collect segment send errors within the transport layer.
+stateify savable
func (*SendErrors) StateFields ¶
func (s *SendErrors) StateFields() []string
func (*SendErrors) StateLoad ¶
func (s *SendErrors) StateLoad(stateSourceObject state.Source)
+checklocksignore
func (*SendErrors) StateSave ¶
func (s *SendErrors) StateSave(stateSinkObject state.Sink)
+checklocksignore
func (*SendErrors) StateTypeName ¶
func (s *SendErrors) StateTypeName() string
type Stats ¶
type Stats struct { // SegmentsReceived is the number of TCP segments received that // the transport layer successfully parsed. SegmentsReceived tcpip.StatCounter // SegmentsSent is the number of TCP segments sent. SegmentsSent tcpip.StatCounter // FailedConnectionAttempts is the number of times we saw Connect and // Accept errors. FailedConnectionAttempts tcpip.StatCounter // ReceiveErrors collects segment receive errors within the // transport layer. ReceiveErrors ReceiveErrors // ReadErrors collects segment read errors from an endpoint read call. ReadErrors tcpip.ReadErrors // SendErrors collects segment send errors within the transport layer. SendErrors SendErrors // WriteErrors collects segment write errors from an endpoint write call. WriteErrors tcpip.WriteErrors }
Stats holds statistics about the endpoint.
+stateify savable
func (*Stats) IsEndpointStats ¶
func (*Stats) IsEndpointStats()
IsEndpointStats is an empty method to implement the tcpip.EndpointStats marker interface.
func (*Stats) StateFields ¶
func (*Stats) StateTypeName ¶
Source Files ¶
- accept.go
- connect.go
- connect_unsafe.go
- cubic.go
- dispatcher.go
- endpoint.go
- endpoint_state.go
- forwarder.go
- protocol.go
- rack.go
- rcv.go
- reno.go
- reno_recovery.go
- sack.go
- sack_recovery.go
- sack_scoreboard.go
- segment.go
- segment_heap.go
- segment_queue.go
- segment_state.go
- segment_unsafe.go
- snd.go
- tcp_endpoint_list.go
- tcp_segment_list.go
- tcp_segment_refs.go
- tcp_state_autogen.go
- tcp_unsafe_state_autogen.go
- timer.go