header

package
v1.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 31, 2023 License: Apache-2.0 Imports: 5 Imported by: 0

Documentation

Overview

Package header provides the implementation of the encoding and decoding of network protocol headers.

Index

Constants

View Source
const (
	//ARPProtocolnumber是arp协议号  为0x0806
	ARPProtocolNumber tcpip.NetworkProtocolNumber = 0x0806
	//arpsize是arp报文在ipv4网络下的长度
	ARPSize = 2 + 2 + 1 + 1 + 2 + 2*6 + 2*4
)
View Source
const (
	ID      = 0
	OP      = 2
	QDCOUNT = 4
	ANCOUNT = 6
	NSCOUNT = 8
	ARCOUNT = 10

	DOMAIN = 12
)
View Source
const (
	//EthernetMinimusize 以太网帧最小的长度
	EtheernetMinimumsize = 14
	//EthernetAddressSize 以太网地址的长度
	EthernetAddressSize = 6
)
View Source
const (
	// ICMPv4MinimumSize is the minimum size of a valid ICMP packet.
	ICMPv4MinimumSize = 4

	// ICMPv4EchoMinimumSize is the minimum size of a valid ICMP echo packet.
	ICMPv4EchoMinimumSize = 6

	// ICMPv4DstUnreachableMinimumSize is the minimum size of a valid ICMP
	// destination unreachable packet.
	ICMPv4DstUnreachableMinimumSize = ICMPv4MinimumSize + 4

	// ICMPv4ProtocolNumber is the ICMP transport protocol number.
	ICMPv4ProtocolNumber tcpip.TransportProtocolNumber = 1
)
View Source
const (
	ICMPv4PortUnreachable     = 3
	ICMPv4FragmentationNeeded = 4
)

Values for ICMP code as defined in RFC 792.

View Source
const (
	// ICMPv6MinimumSize is the minimum size of a valid ICMP packet.
	ICMPv6MinimumSize = 4

	// ICMPv6ProtocolNumber is the ICMP transport protocol number.
	ICMPv6ProtocolNumber tcpip.TransportProtocolNumber = 58

	// ICMPv6NeighborSolicitMinimumSize is the minimum size of a
	// neighbor solicitation packet.
	ICMPv6NeighborSolicitMinimumSize = ICMPv6MinimumSize + 4 + 16

	// ICMPv6NeighborAdvertSize is size of a neighbor advertisement.
	ICMPv6NeighborAdvertSize = 32

	// ICMPv6EchoMinimumSize is the minimum size of a valid ICMP echo packet.
	ICMPv6EchoMinimumSize = 8

	// ICMPv6DstUnreachableMinimumSize is the minimum size of a valid ICMP
	// destination unreachable packet.
	ICMPv6DstUnreachableMinimumSize = ICMPv6MinimumSize + 4

	// ICMPv6PacketTooBigMinimumSize is the minimum size of a valid ICMP
	// packet-too-big packet.
	ICMPv6PacketTooBigMinimumSize = ICMPv6MinimumSize + 4
)
View Source
const (
	// IPv4MinimumSize is the minimum size of a valid IPv4 packet.
	IPv4MinimumSize = 20

	// IPv4MaximumHeaderSize is the maximum size of an IPv4 header. Given
	// that there are only 4 bits to represents the header length in 32-bit
	// units, the header cannot exceed 15*4 = 60 bytes.
	IPv4MaximumHeaderSize = 60

	// IPv4AddressSize is the size, in bytes, of an IPv4 address.
	IPv4AddressSize = 4

	// IPv4ProtocolNumber is IPv4's network protocol number.
	IPv4ProtocolNumber tcpip.NetworkProtocolNumber = 0x0800

	// IPv4Version is the version of the ipv4 protocol.
	IPv4Version = 4

	// IPv4Broadcast is the broadcast address of the IPv4 procotol.
	IPv4Broadcast tcpip.Address = "\xff\xff\xff\xff"

	// IPv4Any is the non-routable IPv4 "any" meta address.
	IPv4Any tcpip.Address = "\x00\x00\x00\x00"
)
View Source
const (
	IPv4FlagMoreFragments = 1 << iota
	IPv4FlagDontFragment
)

Flags that may be set in an IPv4 packet.

View Source
const (
	// IPv6MinimumSize is the minimum size of a valid IPv6 packet.
	IPv6MinimumSize = 40

	// IPv6AddressSize is the size, in bytes, of an IPv6 address.
	IPv6AddressSize = 16

	// IPv6ProtocolNumber is IPv6's network protocol number.
	IPv6ProtocolNumber tcpip.NetworkProtocolNumber = 0x86dd

	// IPv6Version is the version of the ipv6 protocol.
	IPv6Version = 6

	// IPv6MinimumMTU is the minimum MTU required by IPv6, per RFC 2460,
	// section 5.
	IPv6MinimumMTU = 1280
)
View Source
const (
	// IPv6FragmentHeader header is the number used to specify that the next
	// header is a fragment header, per RFC 2460.
	IPv6FragmentHeader = 44

	// IPv6FragmentHeaderSize is the size of the fragment header.
	IPv6FragmentHeaderSize = 8
)
View Source
const (
	// MaxWndScale is maximum allowed window scaling, as described in
	// RFC 1323, section 2.3, page 11.
	MaxWndScale = 14

	// TCPMaxSACKBlocks is the maximum number of SACK blocks that can
	// be encoded in a TCP option field.
	TCPMaxSACKBlocks = 4
)
View Source
const (
	TCPFlagFin = 1 << iota
	TCPFlagSyn
	TCPFlagRst
	TCPFlagPsh
	TCPFlagAck
	TCPFlagUrg
)

Flags that may be set in a TCP segment.

View Source
const (
	TCPOptionEOL           = 0
	TCPOptionNOP           = 1
	TCPOptionMSS           = 2
	TCPOptionWS            = 3
	TCPOptionTS            = 8
	TCPOptionSACKPermitted = 4
	TCPOptionSACK          = 5
)

Options that may be present in a TCP segment.

View Source
const (
	// TCPMinimumSize is the minimum size of a valid TCP packet.
	TCPMinimumSize = 20

	// TCPProtocolNumber is TCP's transport protocol number.
	TCPProtocolNumber tcpip.TransportProtocolNumber = 6
)
View Source
const (
	// UDPMinimumSize is the minimum size of a valid UDP packet.
	UDPMinimumSize = 8

	// UDPProtocolNumber is UDP's transport protocol number.
	UDPProtocolNumber tcpip.TransportProtocolNumber = 17
)
View Source
const (
	ICMPv6PortUnreachable = 4
)

Values for ICMP code as defined in RFC 4443.

View Source
const (
	// MaxIPPacketSize is the maximum supported IP packet size, excluding
	// jumbograms. The maximum IPv4 packet size is 64k-1 (total size must fit
	// in 16 bits). For IPv6, the payload max size (excluding jumbograms) is
	// 64k-1 (also needs to fit in 16 bits). So we use 64k - 1 + 2 * m, where
	// m is the minimum IPv6 header size; we leave room for some potential
	// IP options.
	MaxIPPacketSize = 0xffff + 2*IPv6MinimumSize
)

Variables

This section is empty.

Functions

func AddTCPOptionPadding

func AddTCPOptionPadding(options []byte, offset int) int

AddTCPOptionPadding adds the required number of TCPOptionNOP to quad align the option buffer. It adds padding bytes after the offset specified and returns the number of padding bytes added. The passed in options slice must have space for the padding bytes.

func Checksum

func Checksum(buf []byte, initial uint16) uint16

Checksum calculates the checksum (as defined in RFC 1071) of the bytes in the given byte array. 校验和的计算

func ChecksumCombine

func ChecksumCombine(a, b uint16) uint16

ChecksumCombine combines the two uint16 to form their checksum. This is done by adding them and the carry.

func EncodeMSSOption

func EncodeMSSOption(mss uint32, b []byte) int

EncodeMSSOption encodes the MSS TCP option with the provided MSS values in the supplied buffer. If the provided buffer is not large enough then it just returns without encoding anything. It returns the number of bytes written to the provided buffer.

func EncodeNOP

func EncodeNOP(b []byte) int

EncodeNOP adds an explicit NOP to the option list.

func EncodeSACKBlocks

func EncodeSACKBlocks(sackBlocks []SACKBlock, b []byte) int

EncodeSACKBlocks encodes the provided SACK blocks as a TCP SACK option block in the provided slice. It tries to fit in as many blocks as possible based on number of bytes available in the provided buffer. It returns the number of bytes written to the provided buffer.

func EncodeSACKPermittedOption

func EncodeSACKPermittedOption(b []byte) int

EncodeSACKPermittedOption encodes a SACKPermitted option into the provided buffer. If the buffer is smaller than required it just returns without encoding anything. It returns the number of bytes written to the provided buffer.

func EncodeTSOption

func EncodeTSOption(tsVal, tsEcr uint32, b []byte) int

EncodeTSOption encodes the provided tsVal and tsEcr values as a TCP timestamp option into the provided buffer. If the buffer is smaller than expected it just returns without encoding anything. It returns the number of bytes written to the provided buffer.

func EncodeWSOption

func EncodeWSOption(ws int, b []byte) int

EncodeWSOption encodes the WS TCP option with the WS value in the provided buffer. If the provided buffer is not large enough then it just returns without encoding anything. It returns the number of bytes written to the provided buffer.

func IPVersion

func IPVersion(b []byte) int

IPVersion returns the version of IP used in the given packet. It returns -1 if the packet is not large enough to contain the version field.

func IsV4MappedAddress

func IsV4MappedAddress(addr tcpip.Address) bool

IsV4MappedAddress determines if the provided address is an IPv4 mapped address by checking if its prefix is 0:0:0:0:0:ffff::/96.

func IsV4MulticastAddress

func IsV4MulticastAddress(addr tcpip.Address) bool

IsV4MulticastAddress determines if the provided address is an IPv4 multicast address (range 224.0.0.0 to 239.255.255.255). The four most significant bits will be 1110 = 0xe0.

func IsV6MulticastAddress

func IsV6MulticastAddress(addr tcpip.Address) bool

IsV6MulticastAddress determines if the provided address is an IPv6 multicast address (anything starting with FF).

func LinkLocalAddr

func LinkLocalAddr(linkAddr tcpip.LinkAddress) tcpip.Address

LinkLocalAddr computes the default IPv6 link-local address from a link-layer (MAC) address.

func PseudoHeaderChecksum

func PseudoHeaderChecksum(protocol tcpip.TransportProtocolNumber, srcAddr tcpip.Address, dstAddr tcpip.Address) uint16

PseudoHeaderChecksum calculates the pseudo-header checksum for the given destination protocol and network address, ignoring the length field. Pseudo-headers are needed by transport layers when calculating their own checksum.

func SolicitedNodeAddr

func SolicitedNodeAddr(addr tcpip.Address) tcpip.Address

SolicitedNodeAddr computes the solicited-node multicast address. This is used for NDP. Described in RFC 4291. The argument must be a full-length IPv6 address.

Types

type ARP

type ARP []byte

ARP报文的封装

func (ARP) HardwareAddressSender

func (a ARP) HardwareAddressSender() []byte

HardwareAddressSender 从报文中得到arp发送方的硬件地址

func (ARP) HardwareAddressTarget

func (a ARP) HardwareAddressTarget() []byte

HardwareAddressTarget从报文中得到arp目的方硬件地址

func (ARP) IsValid

func (a ARP) IsValid() bool

Ivalid检查arp报文是否有效

func (ARP) Op

func (a ARP) Op() ARPOp

Op从报文中得到arp操作码

func (ARP) ProtocolAddressSender

func (a ARP) ProtocolAddressSender() []byte

ProtocolAddressDender 从报文中得到arp发送方的协议地址,为ipv4地址

func (ARP) ProtocolAddressTarget

func (a ARP) ProtocolAddressTarget() []byte

ProtocolAddressTarget从报文中得到ar目的方的协议地址,为ipv4地址

func (ARP) SetIpv4OverEthernet

func (a ARP) SetIpv4OverEthernet()

SetIpv4overethernet 设置ipv4网络在以太网中arp报文的硬件和协议信息

func (ARP) SetOp

func (a ARP) SetOp(op ARPOp)

SetOp 设置arp操作码

type ARPOp

type ARPOp uint16

ARPop 表示ARP的操作码 1 2 3 4

const (
	//arp请求
	ARPRequest ARPOp = 1
	//arp应答
	ARPReply ARPOp = 2
)

type DNS

type DNS []byte

DNS 报文的封装

func (DNS) GetANCount

func (d DNS) GetANCount() uint16

GetANCount

func (DNS) GetARCount

func (d DNS) GetARCount() uint16

GetQACount

func (DNS) GetAnswer

func (d DNS) GetAnswer() *[]DNSResource

GetAnswer

func (DNS) GetDomainLen

func (d DNS) GetDomainLen() (rs int)

GetDomainLen 计算domain的长度字节数

func (DNS) GetId

func (d DNS) GetId() uint16

GetId

func (DNS) GetNSCount

func (d DNS) GetNSCount() uint16

GetNSCount

func (DNS) GetQDCount

func (d DNS) GetQDCount() uint16

GetQDCount

func (DNS) SetCount

func (d DNS) SetCount(qd, an, ns, qa uint16)

SetCount

func (*DNS) SetQuestion

func (d *DNS) SetQuestion(domain string, qtype, qclass uint16)

SetQuestion query field domain url qtype type qclass class

func (DNS) Setheader

func (d DNS) Setheader(id uint16)

Setheader

type DNSQuestion

type DNSQuestion struct {
	QuestionType  uint16
	QuestionClass uint16
}

DNSQuestion

type DNSResource

type DNSResource struct {
	Name    uint16
	Type    DNSResourceType
	Class   uint16
	TTL     uint32
	RDlen   uint16
	RData   []byte
	Address string
}

DNSResource ansower,authority,additional

type DNSResourceType

type DNSResourceType uint16

DNSResourceType resource type 表示资源类型

const (
	A  DNSResourceType = iota + 1 // name = hostname value = ipaddress
	NS                            //name = ,value = dns hostname
	MD
	MF
	CNAME //name = hostname
	SOA
	MB
	MG
	MR
	NULL
	WKS
	PTR
	HINFO
	MINFO
	MX
)

type Ethernet

type Ethernet []byte

Ethernet 以太网数据包的封装

func (Ethernet) DestinationAddress

func (b Ethernet) DestinationAddress() tcpip.LinkAddress

DestinationAddress 从帧 头部中得到目的地址

func (Ethernet) Encode

func (b Ethernet) Encode(e *EthernetFields)

Encode 根据传入的帧头部信息编码成Ethernet二进制形式,注意Ethernet应先分配好内存

func (Ethernet) SourceAddress

func (b Ethernet) SourceAddress() tcpip.LinkAddress

SourceAddress 从帧投不中得到源地址

func (Ethernet) Type

Type 从帧头部中得到协议类型

type EthernetFields

type EthernetFields struct {
	//源地址 (string)
	SrcAddr tcpip.LinkAddress
	//目的地址
	DstAddr tcpip.LinkAddress
	//协议类型
	Type tcpip.NetworkProtocolNumber
}

EthernetFields 表示链路层以太网帧的头部

type ICMPv4

type ICMPv4 []byte

ICMPv4 represents an ICMPv4 header stored in a byte array.

func (ICMPv4) Checksum

func (b ICMPv4) Checksum() uint16

Checksum is the ICMP checksum field.

func (ICMPv4) Code

func (b ICMPv4) Code() byte

Code is the ICMP code field. Its meaning depends on the value of Type.

func (ICMPv4) DestinationPort

func (ICMPv4) DestinationPort() uint16

DestinationPort implements Transport.DestinationPort.

func (ICMPv4) Payload

func (b ICMPv4) Payload() []byte

Payload implements Transport.Payload.

func (ICMPv4) SetChecksum

func (b ICMPv4) SetChecksum(checksum uint16)

SetChecksum sets the ICMP checksum field.

func (ICMPv4) SetCode

func (b ICMPv4) SetCode(c byte)

SetCode sets the ICMP code field.

func (ICMPv4) SetDestinationPort

func (ICMPv4) SetDestinationPort(uint16)

SetDestinationPort implements Transport.SetDestinationPort.

func (ICMPv4) SetSourcePort

func (ICMPv4) SetSourcePort(uint16)

SetSourcePort implements Transport.SetSourcePort.

func (ICMPv4) SetType

func (b ICMPv4) SetType(t ICMPv4Type)

SetType sets the ICMP type field.

func (ICMPv4) SourcePort

func (ICMPv4) SourcePort() uint16

SourcePort implements Transport.SourcePort.

func (ICMPv4) Type

func (b ICMPv4) Type() ICMPv4Type

Type is the ICMP type field.

type ICMPv4Type

type ICMPv4Type byte

ICMPv4Type is the ICMP type field described in RFC 792.

const (
	ICMPv4EchoReply      ICMPv4Type = 0
	ICMPv4DstUnreachable ICMPv4Type = 3
	ICMPv4SrcQuench      ICMPv4Type = 4
	ICMPv4Redirect       ICMPv4Type = 5
	ICMPv4Echo           ICMPv4Type = 8
	ICMPv4TimeExceeded   ICMPv4Type = 11
	ICMPv4ParamProblem   ICMPv4Type = 12
	ICMPv4Timestamp      ICMPv4Type = 13
	ICMPv4TimestampReply ICMPv4Type = 14
	ICMPv4InfoRequest    ICMPv4Type = 15
	ICMPv4InfoReply      ICMPv4Type = 16
)

Typical values of ICMPv4Type defined in RFC 792.

type ICMPv6

type ICMPv6 []byte

ICMPv6 represents an ICMPv6 header stored in a byte array.

func (ICMPv6) Checksum

func (b ICMPv6) Checksum() uint16

Checksum is the ICMP checksum field.

func (ICMPv6) Code

func (b ICMPv6) Code() byte

Code is the ICMP code field. Its meaning depends on the value of Type.

func (ICMPv6) DestinationPort

func (ICMPv6) DestinationPort() uint16

DestinationPort implements Transport.DestinationPort.

func (ICMPv6) Payload

func (b ICMPv6) Payload() []byte

Payload implements Transport.Payload.

func (ICMPv6) SetChecksum

func (b ICMPv6) SetChecksum(checksum uint16)

SetChecksum calculates and sets the ICMP checksum field.

func (ICMPv6) SetCode

func (b ICMPv6) SetCode(c byte)

SetCode sets the ICMP code field.

func (ICMPv6) SetDestinationPort

func (ICMPv6) SetDestinationPort(uint16)

SetDestinationPort implements Transport.SetDestinationPort.

func (ICMPv6) SetSourcePort

func (ICMPv6) SetSourcePort(uint16)

SetSourcePort implements Transport.SetSourcePort.

func (ICMPv6) SetType

func (b ICMPv6) SetType(t ICMPv6Type)

SetType sets the ICMP type field.

func (ICMPv6) SourcePort

func (ICMPv6) SourcePort() uint16

SourcePort implements Transport.SourcePort.

func (ICMPv6) Type

func (b ICMPv6) Type() ICMPv6Type

Type is the ICMP type field.

type ICMPv6Type

type ICMPv6Type byte

ICMPv6Type is the ICMP type field described in RFC 4443 and friends.

const (
	ICMPv6DstUnreachable ICMPv6Type = 1
	ICMPv6PacketTooBig   ICMPv6Type = 2
	ICMPv6TimeExceeded   ICMPv6Type = 3
	ICMPv6ParamProblem   ICMPv6Type = 4
	ICMPv6EchoRequest    ICMPv6Type = 128
	ICMPv6EchoReply      ICMPv6Type = 129

	ICMPv6RouterSolicit   ICMPv6Type = 133
	ICMPv6RouterAdvert    ICMPv6Type = 134
	ICMPv6NeighborSolicit ICMPv6Type = 135
	ICMPv6NeighborAdvert  ICMPv6Type = 136
	ICMPv6RedirectMsg     ICMPv6Type = 137
)

Typical values of ICMPv6Type defined in RFC 4443.

type IPv4

type IPv4 []byte

IPv4 represents an ipv4 header stored in a byte array. Most of the methods of IPv4 access to the underlying slice without checking the boundaries and could panic because of 'index out of range'. Always call IsValid() to validate an instance of IPv4 before using other methods.

func (IPv4) CalculateChecksum

func (b IPv4) CalculateChecksum() uint16

CalculateChecksum calculates the checksum of the ipv4 header.

func (IPv4) Checksum

func (b IPv4) Checksum() uint16

Checksum returns the checksum field of the ipv4 header.

func (IPv4) DestinationAddress

func (b IPv4) DestinationAddress() tcpip.Address

DestinationAddress returns the "destination address" field of the ipv4 header.

func (IPv4) Encode

func (b IPv4) Encode(i *IPv4Fields)

Encode encodes all the fields of the ipv4 header.

func (IPv4) EncodePartial

func (b IPv4) EncodePartial(partialChecksum, totalLength uint16)

EncodePartial updates the total length and checksum fields of ipv4 header, taking in the partial checksum, which is the checksum of the header without the total length and checksum fields. It is useful in cases when similar packets are produced.

func (IPv4) Flags

func (b IPv4) Flags() uint8

Flags returns the "flags" field of the ipv4 header.

func (IPv4) FragmentOffset

func (b IPv4) FragmentOffset() uint16

FragmentOffset returns the "fragment offset" field of the ipv4 header.

func (IPv4) HeaderLength

func (b IPv4) HeaderLength() uint8

HeaderLength returns the value of the "header length" field of the ipv4 header.

func (IPv4) ID

func (b IPv4) ID() uint16

ID returns the value of the identifier field of the ipv4 header.

func (IPv4) IsValid

func (b IPv4) IsValid(pktSize int) bool

IsValid performs basic validation on the packet.

func (IPv4) Payload

func (b IPv4) Payload() []byte

Payload implements Network.Payload.

func (IPv4) PayloadLength

func (b IPv4) PayloadLength() uint16

PayloadLength returns the length of the payload portion of the ipv4 packet.

func (IPv4) Protocol

func (b IPv4) Protocol() uint8

Protocol returns the value of the protocol field of the ipv4 header.

func (IPv4) SetChecksum

func (b IPv4) SetChecksum(v uint16)

SetChecksum sets the checksum field of the ipv4 header.

func (IPv4) SetDestinationAddress

func (b IPv4) SetDestinationAddress(addr tcpip.Address)

SetDestinationAddress sets the "destination address" field of the ipv4 header.

func (IPv4) SetFlagsFragmentOffset

func (b IPv4) SetFlagsFragmentOffset(flags uint8, offset uint16)

SetFlagsFragmentOffset sets the "flags" and "fragment offset" fields of the ipv4 header.

func (IPv4) SetSourceAddress

func (b IPv4) SetSourceAddress(addr tcpip.Address)

SetSourceAddress sets the "source address" field of the ipv4 header.

func (IPv4) SetTOS

func (b IPv4) SetTOS(v uint8, _ uint32)

SetTOS sets the "type of service" field of the ipv4 header.

func (IPv4) SetTotalLength

func (b IPv4) SetTotalLength(totalLength uint16)

SetTotalLength sets the "total length" field of the ipv4 header.

func (IPv4) SourceAddress

func (b IPv4) SourceAddress() tcpip.Address

SourceAddress returns the "source address" field of the ipv4 header.

func (IPv4) TOS

func (b IPv4) TOS() (uint8, uint32)

TOS returns the "type of service" field of the ipv4 header.

func (IPv4) TTL

func (b IPv4) TTL() uint8

TTL returns the "TTL" field of the ipv4 header.

func (IPv4) TotalLength

func (b IPv4) TotalLength() uint16

TotalLength returns the "total length" field of the ipv4 header.

func (IPv4) TransportProtocol

func (b IPv4) TransportProtocol() tcpip.TransportProtocolNumber

TransportProtocol implements Network.TransportProtocol.

type IPv4Fields

type IPv4Fields struct {
	// IHL is the "internet header length" field of an IPv4 packet.
	// 头部长度
	IHL uint8

	// TOS is the "type of service" field of an IPv4 packet.
	// 服务区分的表示
	TOS uint8

	// TotalLength is the "total length" field of an IPv4 packet.
	// 数据报文总长
	TotalLength uint16

	// ID is the "identification" field of an IPv4 packet.
	// 标识符
	ID uint16

	// Flags is the "flags" field of an IPv4 packet.
	// 标签
	Flags uint8

	// FragmentOffset is the "fragment offset" field of an IPv4 packet.
	// 分片偏移
	FragmentOffset uint16

	// TTL is the "time to live" field of an IPv4 packet.
	// 存活时间
	TTL uint8

	// Protocol is the "protocol" field of an IPv4 packet.
	// 表示的传输层协议
	Protocol uint8

	// Checksum is the "checksum" field of an IPv4 packet.
	// 首部校验和
	Checksum uint16

	// SrcAddr is the "source ip address" of an IPv4 packet.
	// 源IP地址
	SrcAddr tcpip.Address

	// DstAddr is the "destination ip address" of an IPv4 packet.
	// 目的IP地址
	DstAddr tcpip.Address
}

IPv4Fields contains the fields of an IPv4 packet. It is used to describe the fields of a packet that needs to be encoded. 表示IPv4头部信息的结构体

type IPv6

type IPv6 []byte

IPv6 represents an ipv6 header stored in a byte array. Most of the methods of IPv6 access to the underlying slice without checking the boundaries and could panic because of 'index out of range'. Always call IsValid() to validate an instance of IPv6 before using other methods.

func (IPv6) Checksum

func (IPv6) Checksum() uint16

Checksum implements Network.Checksum. Given that IPv6 doesn't have a checksum, it just returns 0.

func (IPv6) DestinationAddress

func (b IPv6) DestinationAddress() tcpip.Address

DestinationAddress returns the "destination address" field of the ipv6 header.

func (IPv6) Encode

func (b IPv6) Encode(i *IPv6Fields)

Encode encodes all the fields of the ipv6 header.

func (IPv6) HopLimit

func (b IPv6) HopLimit() uint8

HopLimit returns the value of the "hop limit" field of the ipv6 header.

func (IPv6) IsValid

func (b IPv6) IsValid(pktSize int) bool

IsValid performs basic validation on the packet.

func (IPv6) NextHeader

func (b IPv6) NextHeader() uint8

NextHeader returns the value of the "next header" field of the ipv6 header.

func (IPv6) Payload

func (b IPv6) Payload() []byte

Payload implements Network.Payload.

func (IPv6) PayloadLength

func (b IPv6) PayloadLength() uint16

PayloadLength returns the value of the "payload length" field of the ipv6 header.

func (IPv6) SetChecksum

func (IPv6) SetChecksum(uint16)

SetChecksum implements Network.SetChecksum. Given that IPv6 doesn't have a checksum, it is empty.

func (IPv6) SetDestinationAddress

func (b IPv6) SetDestinationAddress(addr tcpip.Address)

SetDestinationAddress sets the "destination address" field of the ipv6 header.

func (IPv6) SetNextHeader

func (b IPv6) SetNextHeader(v uint8)

SetNextHeader sets the value of the "next header" field of the ipv6 header.

func (IPv6) SetPayloadLength

func (b IPv6) SetPayloadLength(payloadLength uint16)

SetPayloadLength sets the "payload length" field of the ipv6 header.

func (IPv6) SetSourceAddress

func (b IPv6) SetSourceAddress(addr tcpip.Address)

SetSourceAddress sets the "source address" field of the ipv6 header.

func (IPv6) SetTOS

func (b IPv6) SetTOS(t uint8, l uint32)

SetTOS sets the "traffic class" and "flow label" fields of the ipv6 header.

func (IPv6) SourceAddress

func (b IPv6) SourceAddress() tcpip.Address

SourceAddress returns the "source address" field of the ipv6 header.

func (IPv6) TOS

func (b IPv6) TOS() (uint8, uint32)

TOS returns the "traffic class" and "flow label" fields of the ipv6 header.

func (IPv6) TransportProtocol

func (b IPv6) TransportProtocol() tcpip.TransportProtocolNumber

TransportProtocol implements Network.TransportProtocol.

type IPv6Fields

type IPv6Fields struct {
	// TrafficClass is the "traffic class" field of an IPv6 packet.
	TrafficClass uint8

	// FlowLabel is the "flow label" field of an IPv6 packet.
	FlowLabel uint32

	// PayloadLength is the "payload length" field of an IPv6 packet.
	PayloadLength uint16

	// NextHeader is the "next header" field of an IPv6 packet.
	NextHeader uint8

	// HopLimit is the "hop limit" field of an IPv6 packet.
	HopLimit uint8

	// SrcAddr is the "source ip address" of an IPv6 packet.
	SrcAddr tcpip.Address

	// DstAddr is the "destination ip address" of an IPv6 packet.
	DstAddr tcpip.Address
}

IPv6Fields contains the fields of an IPv6 packet. It is used to describe the fields of a packet that needs to be encoded.

type IPv6Fragment

type IPv6Fragment []byte

IPv6Fragment represents an ipv6 fragment header stored in a byte array. Most of the methods of IPv6Fragment access to the underlying slice without checking the boundaries and could panic because of 'index out of range'. Always call IsValid() to validate an instance of IPv6Fragment before using other methods.

func (IPv6Fragment) Checksum

func (b IPv6Fragment) Checksum() uint16

Checksum is not supported by IPv6Fragment.

func (IPv6Fragment) DestinationAddress

func (b IPv6Fragment) DestinationAddress() tcpip.Address

DestinationAddress is not supported by IPv6Fragment.

func (IPv6Fragment) Encode

func (b IPv6Fragment) Encode(i *IPv6FragmentFields)

Encode encodes all the fields of the ipv6 fragment.

func (IPv6Fragment) FragmentOffset

func (b IPv6Fragment) FragmentOffset() uint16

FragmentOffset returns the "fragment offset" field of the ipv6 fragment.

func (IPv6Fragment) ID

func (b IPv6Fragment) ID() uint32

ID returns the value of the identifier field of the ipv6 fragment.

func (IPv6Fragment) IsValid

func (b IPv6Fragment) IsValid() bool

IsValid performs basic validation on the fragment header.

func (IPv6Fragment) More

func (b IPv6Fragment) More() bool

More returns the "more" field of the ipv6 fragment.

func (IPv6Fragment) NextHeader

func (b IPv6Fragment) NextHeader() uint8

NextHeader returns the value of the "next header" field of the ipv6 fragment.

func (IPv6Fragment) Payload

func (b IPv6Fragment) Payload() []byte

Payload implements Network.Payload.

func (IPv6Fragment) SetChecksum

func (b IPv6Fragment) SetChecksum(uint16)

SetChecksum is not supported by IPv6Fragment.

func (IPv6Fragment) SetDestinationAddress

func (b IPv6Fragment) SetDestinationAddress(tcpip.Address)

SetDestinationAddress is not supported by IPv6Fragment.

func (IPv6Fragment) SetSourceAddress

func (b IPv6Fragment) SetSourceAddress(tcpip.Address)

SetSourceAddress is not supported by IPv6Fragment.

func (IPv6Fragment) SetTOS

func (b IPv6Fragment) SetTOS(t uint8, l uint32)

SetTOS is not supported by IPv6Fragment.

func (IPv6Fragment) SourceAddress

func (b IPv6Fragment) SourceAddress() tcpip.Address

SourceAddress is not supported by IPv6Fragment.

func (IPv6Fragment) TOS

func (b IPv6Fragment) TOS() (uint8, uint32)

TOS is not supported by IPv6Fragment.

func (IPv6Fragment) TransportProtocol

func (b IPv6Fragment) TransportProtocol() tcpip.TransportProtocolNumber

TransportProtocol implements Network.TransportProtocol.

type IPv6FragmentFields

type IPv6FragmentFields struct {
	// NextHeader is the "next header" field of an IPv6 fragment.
	NextHeader uint8

	// FragmentOffset is the "fragment offset" field of an IPv6 fragment.
	FragmentOffset uint16

	// M is the "more" field of an IPv6 fragment.
	M bool

	// Identification is the "identification" field of an IPv6 fragment.
	Identification uint32
}

IPv6FragmentFields contains the fields of an IPv6 fragment. It is used to describe the fields of a packet that needs to be encoded.

type Network

type Network interface {
	// SourceAddress returns the value of the "source address" field.
	SourceAddress() tcpip.Address

	// DestinationAddress returns the value of the "destination address"
	// field.
	DestinationAddress() tcpip.Address

	// Checksum returns the value of the "checksum" field.
	Checksum() uint16

	// SetSourceAddress sets the value of the "source address" field.
	SetSourceAddress(tcpip.Address)

	// SetDestinationAddress sets the value of the "destination address"
	// field.
	SetDestinationAddress(tcpip.Address)

	// SetChecksum sets the value of the "checksum" field.
	SetChecksum(uint16)

	// TransportProtocol returns the number of the transport protocol
	// stored in the payload.
	TransportProtocol() tcpip.TransportProtocolNumber

	// Payload returns a byte slice containing the payload of the network
	// packet.
	Payload() []byte

	// TOS returns the values of the "type of service" and "flow label" fields.
	TOS() (uint8, uint32)

	// SetTOS sets the values of the "type of service" and "flow label" fields.
	SetTOS(t uint8, l uint32)
}

Network offers generic methods to query and/or update the fields of the header of a network protocol buffer.

type SACKBlock

type SACKBlock struct {
	// Start indicates the lowest sequence number in the block.
	Start seqnum.Value

	// End indicates the sequence number immediately following the last
	// sequence number of this block.
	End seqnum.Value
}

SACKBlock represents a single contiguous SACK block.

+stateify savable 表示 sack 块的结构体

type TCP

type TCP []byte

TCP represents a TCP header stored in a byte array.

func (TCP) AckNumber

func (b TCP) AckNumber() uint32

AckNumber returns the "ack number" field of the tcp header.

func (TCP) CalculateChecksum

func (b TCP) CalculateChecksum(partialChecksum uint16, totalLen uint16) uint16

CalculateChecksum calculates the checksum of the tcp segment given the totalLen and partialChecksum(descriptions below) totalLen is the total length of the segment partialChecksum is the checksum of the network-layer pseudo-header (excluding the total length) and the checksum of the segment data.

func (TCP) Checksum

func (b TCP) Checksum() uint16

Checksum returns the "checksum" field of the tcp header.

func (TCP) DataOffset

func (b TCP) DataOffset() uint8

DataOffset returns the "data offset" field of the tcp header.

func (TCP) DestinationPort

func (b TCP) DestinationPort() uint16

DestinationPort returns the "destination port" field of the tcp header.

func (TCP) Encode

func (b TCP) Encode(t *TCPFields)

Encode encodes all the fields of the tcp header.

func (TCP) EncodePartial

func (b TCP) EncodePartial(partialChecksum, length uint16, seqnum, acknum uint32, flags byte, rcvwnd uint16)

EncodePartial updates a subset of the fields of the tcp header. It is useful in cases when similar segments are produced.

func (TCP) Flags

func (b TCP) Flags() uint8

Flags returns the flags field of the tcp header.

func (TCP) Options

func (b TCP) Options() []byte

Options returns a slice that holds the unparsed TCP options in the segment.

func (TCP) ParsedOptions

func (b TCP) ParsedOptions() TCPOptions

ParsedOptions returns a TCPOptions structure which parses and caches the TCP option values in the TCP segment. NOTE: Invoking this function repeatedly is expensive as it reparses the options on each invocation.

func (TCP) Payload

func (b TCP) Payload() []byte

Payload returns the data in the tcp packet.

func (TCP) SequenceNumber

func (b TCP) SequenceNumber() uint32

SequenceNumber returns the "sequence number" field of the tcp header.

func (TCP) SetChecksum

func (b TCP) SetChecksum(checksum uint16)

SetChecksum sets the checksum field of the tcp header.

func (TCP) SetDestinationPort

func (b TCP) SetDestinationPort(port uint16)

SetDestinationPort sets the "destination port" field of the tcp header.

func (TCP) SetSourcePort

func (b TCP) SetSourcePort(port uint16)

SetSourcePort sets the "source port" field of the tcp header.

func (TCP) SourcePort

func (b TCP) SourcePort() uint16

SourcePort returns the "source port" field of the tcp header.

func (TCP) WindowSize

func (b TCP) WindowSize() uint16

WindowSize returns the "window size" field of the tcp header.

type TCPFields

type TCPFields struct {
	// SrcPort is the "source port" field of a TCP packet.
	SrcPort uint16

	// DstPort is the "destination port" field of a TCP packet.
	DstPort uint16

	// SeqNum is the "sequence number" field of a TCP packet.
	SeqNum uint32

	// AckNum is the "acknowledgement number" field of a TCP packet.
	AckNum uint32

	// DataOffset is the "data offset" field of a TCP packet.
	DataOffset uint8

	// Flags is the "flags" field of a TCP packet.
	Flags uint8

	// WindowSize is the "window size" field of a TCP packet.
	WindowSize uint16

	// Checksum is the "checksum" field of a TCP packet.
	Checksum uint16

	// UrgentPointer is the "urgent pointer" field of a TCP packet.
	UrgentPointer uint16
}

TCPFields contains the fields of a TCP packet. It is used to describe the fields of a packet that needs to be encoded. tcp首部字段

type TCPOptions

type TCPOptions struct {
	// TS is true if the TimeStamp option is enabled.
	TS bool

	// TSVal is the value in the TSVal field of the segment.
	TSVal uint32

	// TSEcr is the value in the TSEcr field of the segment.
	TSEcr uint32

	// SACKBlocks are the SACK blocks specified in the segment.
	SACKBlocks []SACKBlock
}

TCPOptions are used to parse and cache the TCP segment options for a non syn/syn-ack segment.

+stateify savable tcp选项结构,这个结构不表示 syn/syn-ack 报文

func ParseTCPOptions

func ParseTCPOptions(b []byte) TCPOptions

ParseTCPOptions extracts and stores all known options in the provided byte slice in a TCPOptions structure.

type TCPSynOptions

type TCPSynOptions struct {
	// MSS is the maximum segment size provided by the peer in the SYN.
	MSS uint16

	// WS is the window scale option provided by the peer in the SYN.
	//
	// Set to -1 if no window scale option was provided.
	WS int

	// TS is true if the timestamp option was provided in the syn/syn-ack.
	TS bool

	// TSVal is the value of the TSVal field in the timestamp option.
	TSVal uint32

	// TSEcr is the value of the TSEcr field in the timestamp option.
	TSEcr uint32

	// SACKPermitted is true if the SACK option was provided in the SYN/SYN-ACK.
	SACKPermitted bool
}

TCPSynOptions is used to return the parsed TCP Options in a syn segment. syn 报文的选项

func ParseSynOptions

func ParseSynOptions(opts []byte, isAck bool) TCPSynOptions

ParseSynOptions parses the options received in a SYN segment and returns the relevant ones. opts should point to the option part of the TCP Header.

type Transport

type Transport interface {
	// SourcePort returns the value of the "source port" field.
	SourcePort() uint16

	// Destination returns the value of the "destination port" field.
	DestinationPort() uint16

	// Checksum returns the value of the "checksum" field.
	Checksum() uint16

	// SetSourcePort sets the value of the "source port" field.
	SetSourcePort(uint16)

	// SetDestinationPort sets the value of the "destination port" field.
	SetDestinationPort(uint16)

	// SetChecksum sets the value of the "checksum" field.
	SetChecksum(uint16)

	// Payload returns the data carried in the transport buffer.
	Payload() []byte
}

Transport offers generic methods to query and/or update the fields of the header of a transport protocol buffer.

type UDP

type UDP []byte

UDP represents a UDP header stored in a byte array.

func (UDP) CalculateChecksum

func (b UDP) CalculateChecksum(partialChecksum uint16, totalLen uint16) uint16

CalculateChecksum calculates the checksum of the udp packet, given the total length of the packet and the checksum of the network-layer pseudo-header (excluding the total length) and the checksum of the payload.

func (UDP) Checksum

func (b UDP) Checksum() uint16

Checksum returns the "checksum" field of the udp header.

func (UDP) DestinationPort

func (b UDP) DestinationPort() uint16

DestinationPort returns the "destination port" field of the udp header.

func (UDP) Encode

func (b UDP) Encode(u *UDPFields)

Encode encodes all the fields of the udp header.

func (UDP) Length

func (b UDP) Length() uint16

Length returns the "length" field of the udp header.

func (UDP) Payload

func (b UDP) Payload() []byte

Payload returns the data contained in the UDP datagram.

func (UDP) SetChecksum

func (b UDP) SetChecksum(checksum uint16)

SetChecksum sets the "checksum" field of the udp header.

func (UDP) SetDestinationPort

func (b UDP) SetDestinationPort(port uint16)

SetDestinationPort sets the "destination port" field of the udp header.

func (UDP) SetSourcePort

func (b UDP) SetSourcePort(port uint16)

SetSourcePort sets the "source port" field of the udp header.

func (UDP) SourcePort

func (b UDP) SourcePort() uint16

SourcePort returns the "source port" field of the udp header.

type UDPFields

type UDPFields struct {
	// SrcPort is the "source port" field of a UDP packet.
	SrcPort uint16

	// DstPort is the "destination port" field of a UDP packet.
	DstPort uint16

	// Length is the "length" field of a UDP packet.
	Length uint16

	// Checksum is the "checksum" field of a UDP packet.
	Checksum uint16
}

UDPFields contains the fields of a UDP packet. It is used to describe the fields of a packet that needs to be encoded. udp 首部字段

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL