📄 tcp.h
字号:
/* * tcp.h * * Transmission Control Protocol (RFC 793). * * Copyright (c) 2000 Dug Song <dugsong@monkey.org> * * $Id: tcp.h,v 1.17 2004/02/23 10:02:11 dugsong Exp $ */#ifndef DNET_TCP_H#define DNET_TCP_H#define TCP_HDR_LEN 20 /* base TCP header length */#define TCP_OPT_LEN 2 /* base TCP option length */#define TCP_OPT_LEN_MAX 40#define TCP_HDR_LEN_MAX (TCP_HDR_LEN + TCP_OPT_LEN_MAX)#ifndef __GNUC__# define __attribute__(x)# pragma pack(1)#endif/* * TCP header, without options */struct tcp_hdr { uint16_t th_sport; /* source port */ uint16_t th_dport; /* destination port */ uint32_t th_seq; /* sequence number */ uint32_t th_ack; /* acknowledgment number */#if DNET_BYTESEX == DNET_BIG_ENDIAN uint8_t th_off:4, /* data offset */ th_x2:4; /* (unused) */#elif DNET_BYTESEX == DNET_LIL_ENDIAN uint8_t th_x2:4, th_off:4;#else# error "need to include <dnet.h>"#endif uint8_t th_flags; /* control flags */ uint16_t th_win; /* window */ uint16_t th_sum; /* checksum */ uint16_t th_urp; /* urgent pointer */};/* * TCP control flags (th_flags) */#define TH_FIN 0x01 /* end of data */#define TH_SYN 0x02 /* synchronize sequence numbers */#define TH_RST 0x04 /* reset connection */#define TH_PUSH 0x08 /* push */#define TH_ACK 0x10 /* acknowledgment number set */#define TH_URG 0x20 /* urgent pointer set */#define TH_ECE 0x40 /* ECN echo, RFC 3168 */#define TH_CWR 0x80 /* congestion window reduced */#define TCP_PORT_MAX 65535 /* maximum port */#define TCP_WIN_MAX 65535 /* maximum (unscaled) window *//* * Sequence number comparison macros */#define TCP_SEQ_LT(a,b) ((int)((a)-(b)) < 0)#define TCP_SEQ_LEQ(a,b) ((int)((a)-(b)) <= 0)#define TCP_SEQ_GT(a,b) ((int)((a)-(b)) > 0)#define TCP_SEQ_GEQ(a,b) ((int)((a)-(b)) >= 0)/* * TCP FSM states */#define TCP_STATE_CLOSED 0 /* closed */#define TCP_STATE_LISTEN 1 /* listening from connection */#define TCP_STATE_SYN_SENT 2 /* active, have sent SYN */#define TCP_STATE_SYN_RECEIVED 3 /* have sent and received SYN */#define TCP_STATE_ESTABLISHED 4 /* established */#define TCP_STATE_CLOSE_WAIT 5 /* rcvd FIN, waiting for close */#define TCP_STATE_FIN_WAIT_1 6 /* have closed, sent FIN */#define TCP_STATE_CLOSING 7 /* closed xchd FIN, await FIN-ACK */#define TCP_STATE_LAST_ACK 8 /* had FIN and close, await FIN-ACK */#define TCP_STATE_FIN_WAIT_2 9 /* have closed, FIN is acked */#define TCP_STATE_TIME_WAIT 10 /* in 2*MSL quiet wait after close */#define TCP_STATE_MAX 11/* * Options (opt_type) - http://www.iana.org/assignments/tcp-parameters */#define TCP_OPT_EOL 0 /* end of option list */#define TCP_OPT_NOP 1 /* no operation */#define TCP_OPT_MSS 2 /* maximum segment size */#define TCP_OPT_WSCALE 3 /* window scale factor, RFC 1072 */#define TCP_OPT_SACKOK 4 /* SACK permitted, RFC 2018 */#define TCP_OPT_SACK 5 /* SACK, RFC 2018 */#define TCP_OPT_ECHO 6 /* echo (obsolete), RFC 1072 */#define TCP_OPT_ECHOREPLY 7 /* echo reply (obsolete), RFC 1072 */#define TCP_OPT_TIMESTAMP 8 /* timestamp, RFC 1323 */#define TCP_OPT_POCONN 9 /* partial order conn, RFC 1693 */#define TCP_OPT_POSVC 10 /* partial order service, RFC 1693 */#define TCP_OPT_CC 11 /* connection count, RFC 1644 */#define TCP_OPT_CCNEW 12 /* CC.NEW, RFC 1644 */#define TCP_OPT_CCECHO 13 /* CC.ECHO, RFC 1644 */#define TCP_OPT_ALTSUM 14 /* alt checksum request, RFC 1146 */#define TCP_OPT_ALTSUMDATA 15 /* alt checksum data, RFC 1146 */#define TCP_OPT_SKEETER 16 /* Skeeter */#define TCP_OPT_BUBBA 17 /* Bubba */#define TCP_OPT_TRAILSUM 18 /* trailer checksum */#define TCP_OPT_MD5 19 /* MD5 signature, RFC 2385 */#define TCP_OPT_SCPS 20 /* SCPS capabilities */#define TCP_OPT_SNACK 21 /* selective negative acks */#define TCP_OPT_REC 22 /* record boundaries */#define TCP_OPT_CORRUPT 23 /* corruption experienced */#define TCP_OPT_SNAP 24 /* SNAP */#define TCP_OPT_TCPCOMP 26 /* TCP compression filter */#define TCP_OPT_MAX 27#define TCP_OPT_TYPEONLY(type) \ ((type) == TCP_OPT_EOL || (type) == TCP_OPT_NOP)/* * TCP option (following TCP header) */struct tcp_opt { uint8_t opt_type; /* option type */ uint8_t opt_len; /* option length >= TCP_OPT_LEN */ union tcp_opt_data { uint16_t mss; /* TCP_OPT_MSS */ uint8_t wscale; /* TCP_OPT_WSCALE */ uint16_t sack[19]; /* TCP_OPT_SACK */ uint32_t echo; /* TCP_OPT_ECHO{REPLY} */ uint32_t timestamp[2]; /* TCP_OPT_TIMESTAMP */ uint32_t cc; /* TCP_OPT_CC{NEW,ECHO} */ uint8_t cksum; /* TCP_OPT_ALTSUM */ uint8_t md5[16]; /* TCP_OPT_MD5 */ uint8_t data8[TCP_OPT_LEN_MAX - TCP_OPT_LEN]; } opt_data;} __attribute__((__packed__));#ifndef __GNUC__# pragma pack()#endif#define tcp_pack_hdr(hdr, sport, dport, seq, ack, flags, win, urp) do { \ struct tcp_hdr *tcp_pack_p = (struct tcp_hdr *)(hdr); \ tcp_pack_p->th_sport = htons(sport); \ tcp_pack_p->th_dport = htons(dport); \ tcp_pack_p->th_seq = htonl(seq); \ tcp_pack_p->th_ack = htonl(ack); \ tcp_pack_p->th_x2 = 0; tcp_pack_p->th_off = 5; \ tcp_pack_p->th_flags = flags; \ tcp_pack_p->th_win = htons(win); \ tcp_pack_p->th_urp = htons(urp); \} while (0)#endif /* DNET_TCP_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -