mirror of
https://github.com/impact-eintr/netstack.git
synced 2025-10-06 05:16:50 +08:00
tcp可靠性实现 抄了一堆东西 信息量太大了 看不过来
This commit is contained in:
@@ -6,7 +6,9 @@ import (
|
||||
"netstack/sleep"
|
||||
"netstack/tcpip"
|
||||
"netstack/tcpip/buffer"
|
||||
"netstack/tcpip/header"
|
||||
"netstack/tcpip/ports"
|
||||
"netstack/tcpip/seqnum"
|
||||
"netstack/waiter"
|
||||
"sync"
|
||||
"time"
|
||||
@@ -21,12 +23,22 @@ const (
|
||||
resolutionAttempts = 3
|
||||
)
|
||||
|
||||
// TODO 需要解读
|
||||
type TCPProbeFunc func(s TcpEndpointState)
|
||||
// TCPProbeFunc is the expected function type for a TCP probe function to be
|
||||
// passed to stack.AddTCPProbe.
|
||||
type TCPProbeFunc func(s TCPEndpointState)
|
||||
|
||||
// TODO 需要解读
|
||||
type TcpEndpointState struct {
|
||||
// TODO 需要添加
|
||||
// TCPCubicState is used to hold a copy of the internal cubic state when the
|
||||
// TCPProbeFunc is invoked.
|
||||
type TCPCubicState struct {
|
||||
WLastMax float64
|
||||
WMax float64
|
||||
T time.Time
|
||||
TimeSinceLastCongestion time.Duration
|
||||
C float64
|
||||
K float64
|
||||
Beta float64
|
||||
WC float64
|
||||
WEst float64
|
||||
}
|
||||
|
||||
// 传输层协议状态机 包含传输层协议以及默认处理方法
|
||||
@@ -35,6 +47,207 @@ type transportProtocolState struct {
|
||||
defaultHandler func(*Route, TransportEndpointID, buffer.VectorisedView) bool
|
||||
}
|
||||
|
||||
// TCPEndpointID is the unique 4 tuple that identifies a given endpoint.
|
||||
type TCPEndpointID struct {
|
||||
// LocalPort is the local port associated with the endpoint.
|
||||
LocalPort uint16
|
||||
|
||||
// LocalAddress is the local [network layer] address associated with
|
||||
// the endpoint.
|
||||
LocalAddress tcpip.Address
|
||||
|
||||
// RemotePort is the remote port associated with the endpoint.
|
||||
RemotePort uint16
|
||||
|
||||
// RemoteAddress it the remote [network layer] address associated with
|
||||
// the endpoint.
|
||||
RemoteAddress tcpip.Address
|
||||
}
|
||||
|
||||
// TCPFastRecoveryState holds a copy of the internal fast recovery state of a
|
||||
// TCP endpoint.
|
||||
type TCPFastRecoveryState struct {
|
||||
// Active if true indicates the endpoint is in fast recovery.
|
||||
Active bool
|
||||
|
||||
// First is the first unacknowledged sequence number being recovered.
|
||||
First seqnum.Value
|
||||
|
||||
// Last is the 'recover' sequence number that indicates the point at
|
||||
// which we should exit recovery barring any timeouts etc.
|
||||
Last seqnum.Value
|
||||
|
||||
// MaxCwnd is the maximum value we are permitted to grow the congestion
|
||||
// window during recovery. This is set at the time we enter recovery.
|
||||
MaxCwnd int
|
||||
}
|
||||
|
||||
// TCPReceiverState holds a copy of the internal state of the receiver for
|
||||
// a given TCP endpoint.
|
||||
type TCPReceiverState struct {
|
||||
// RcvNxt is the TCP variable RCV.NXT.
|
||||
RcvNxt seqnum.Value
|
||||
|
||||
// RcvAcc is the TCP variable RCV.ACC.
|
||||
RcvAcc seqnum.Value
|
||||
|
||||
// RcvWndScale is the window scaling to use for inbound segments.
|
||||
RcvWndScale uint8
|
||||
|
||||
// PendingBufUsed is the number of bytes pending in the receive
|
||||
// queue.
|
||||
PendingBufUsed seqnum.Size
|
||||
|
||||
// PendingBufSize is the size of the socket receive buffer.
|
||||
PendingBufSize seqnum.Size
|
||||
}
|
||||
|
||||
// TCPSenderState holds a copy of the internal state of the sender for
|
||||
// a given TCP Endpoint.
|
||||
type TCPSenderState struct {
|
||||
// LastSendTime is the time at which we sent the last segment.
|
||||
LastSendTime time.Time
|
||||
|
||||
// DupAckCount is the number of Duplicate ACK's received.
|
||||
DupAckCount int
|
||||
|
||||
// SndCwnd is the size of the sending congestion window in packets.
|
||||
SndCwnd int
|
||||
|
||||
// Ssthresh is the slow start threshold in packets.
|
||||
Ssthresh int
|
||||
|
||||
// SndCAAckCount is the number of packets consumed in congestion
|
||||
// avoidance mode.
|
||||
SndCAAckCount int
|
||||
|
||||
// Outstanding is the number of packets in flight.
|
||||
Outstanding int
|
||||
|
||||
// SndWnd is the send window size in bytes.
|
||||
SndWnd seqnum.Size
|
||||
|
||||
// SndUna is the next unacknowledged sequence number.
|
||||
SndUna seqnum.Value
|
||||
|
||||
// SndNxt is the sequence number of the next segment to be sent.
|
||||
SndNxt seqnum.Value
|
||||
|
||||
// RTTMeasureSeqNum is the sequence number being used for the latest RTT
|
||||
// measurement.
|
||||
RTTMeasureSeqNum seqnum.Value
|
||||
|
||||
// RTTMeasureTime is the time when the RTTMeasureSeqNum was sent.
|
||||
RTTMeasureTime time.Time
|
||||
|
||||
// Closed indicates that the caller has closed the endpoint for sending.
|
||||
Closed bool
|
||||
|
||||
// SRTT is the smoothed round-trip time as defined in section 2 of
|
||||
// RFC 6298.
|
||||
SRTT time.Duration
|
||||
|
||||
// RTO is the retransmit timeout as defined in section of 2 of RFC 6298.
|
||||
RTO time.Duration
|
||||
|
||||
// RTTVar is the round-trip time variation as defined in section 2 of
|
||||
// RFC 6298.
|
||||
RTTVar time.Duration
|
||||
|
||||
// SRTTInited if true indicates take a valid RTT measurement has been
|
||||
// completed.
|
||||
SRTTInited bool
|
||||
|
||||
// MaxPayloadSize is the maximum size of the payload of a given segment.
|
||||
// It is initialized on demand.
|
||||
MaxPayloadSize int
|
||||
|
||||
// SndWndScale is the number of bits to shift left when reading the send
|
||||
// window size from a segment.
|
||||
SndWndScale uint8
|
||||
|
||||
// MaxSentAck is the highest acknowledgement number sent till now.
|
||||
MaxSentAck seqnum.Value
|
||||
|
||||
// FastRecovery holds the fast recovery state for the endpoint.
|
||||
FastRecovery TCPFastRecoveryState
|
||||
|
||||
// Cubic holds the state related to CUBIC congestion control.
|
||||
Cubic TCPCubicState
|
||||
}
|
||||
|
||||
// TCPSACKInfo holds TCP SACK related information for a given TCP endpoint.
|
||||
type TCPSACKInfo struct {
|
||||
// Blocks is the list of SACK block currently received by the
|
||||
// TCP endpoint.
|
||||
Blocks []header.SACKBlock
|
||||
}
|
||||
|
||||
// TCPEndpointState is a copy of the internal state of a TCP endpoint.
|
||||
type TCPEndpointState struct {
|
||||
// ID is a copy of the TransportEndpointID for the endpoint.
|
||||
ID TCPEndpointID
|
||||
|
||||
// SegTime denotes the absolute time when this segment was received.
|
||||
SegTime time.Time
|
||||
|
||||
// RcvBufSize is the size of the receive socket buffer for the endpoint.
|
||||
RcvBufSize int
|
||||
|
||||
// RcvBufUsed is the amount of bytes actually held in the receive socket
|
||||
// buffer for the endpoint.
|
||||
RcvBufUsed int
|
||||
|
||||
// RcvClosed if true, indicates the endpoint has been closed for reading.
|
||||
RcvClosed bool
|
||||
|
||||
// SendTSOk is used to indicate when the TS Option has been negotiated.
|
||||
// When sendTSOk is true every non-RST segment should carry a TS as per
|
||||
// RFC7323#section-1.1.
|
||||
SendTSOk bool
|
||||
|
||||
// RecentTS is the timestamp that should be sent in the TSEcr field of
|
||||
// the timestamp for future segments sent by the endpoint. This field is
|
||||
// updated if required when a new segment is received by this endpoint.
|
||||
RecentTS uint32
|
||||
|
||||
// TSOffset is a randomized offset added to the value of the TSVal field
|
||||
// in the timestamp option.
|
||||
TSOffset uint32
|
||||
|
||||
// SACKPermitted is set to true if the peer sends the TCPSACKPermitted
|
||||
// option in the SYN/SYN-ACK.
|
||||
SACKPermitted bool
|
||||
|
||||
// SACK holds TCP SACK related information for this endpoint.
|
||||
SACK TCPSACKInfo
|
||||
|
||||
// SndBufSize is the size of the socket send buffer.
|
||||
SndBufSize int
|
||||
|
||||
// SndBufUsed is the number of bytes held in the socket send buffer.
|
||||
SndBufUsed int
|
||||
|
||||
// SndClosed indicates that the endpoint has been closed for sends.
|
||||
SndClosed bool
|
||||
|
||||
// SndBufInQueue is the number of bytes in the send queue.
|
||||
SndBufInQueue seqnum.Size
|
||||
|
||||
// PacketTooBigCount is used to notify the main protocol routine how
|
||||
// many times a "packet too big" control packet is received.
|
||||
PacketTooBigCount int
|
||||
|
||||
// SndMTU is the smallest MTU seen in the control packets received.
|
||||
SndMTU int
|
||||
|
||||
// Receiver holds variables related to the TCP receiver for the endpoint.
|
||||
Receiver TCPReceiverState
|
||||
|
||||
// Sender holds state related to the TCP Sender for the endpoint.
|
||||
Sender TCPSenderState
|
||||
}
|
||||
|
||||
// Stack 是一个网络堆栈,具有所有支持的协议、NIC 和路由表。
|
||||
type Stack struct {
|
||||
transportProtocols map[tcpip.TransportProtocolNumber]*transportProtocolState // 各种传输层协议
|
||||
|
Reference in New Issue
Block a user