一、TCP协议简介
TCP协议,是一种面向连接,可靠的、基于字节流的传输层通信协议
二、TCP协议报文结构
PACK_STRUCT_BEGIN
struct tcp_hdr
{
PACK_STRUCT_FIELD(u16_t src);
PACK_STRUCT_FIELD(u16_t dest);
PACK_STRUCT_FIELD(u32_t seqno);
PACK_STRUCT_FIELD(u32_t ackno);
PACK_STRUCT_FIELD(u16_t
_hdrlen_rsvd_flags);
PACK_STRUCT_FIELD(u16_t wnd);
PACK_STRUCT_FIELD(u16_t chksum);
PACK_STRUCT_FIELD(u16_t urgp);
} PACK_STRUCT_STRUCT;
PACK_STRUCT_END
三、TCP转换状态
enum tcp_state
{
CLOSED = 0,
LISTEN = 1,
SYN_SENT = 2,
SYN_RCVD = 3,
ESTABLISHED = 4,
FIN_WAIT_1 = 5,
FIN_WAIT_2 = 6,
CLOSE_WAIT = 7,
CLOSING = 8,
LAST_ACK = 9,
TIME_WAIT = 10
};
四、TCP控制块
前面我们在讲UDP的时候讲过UDP控制块,那么TCP同样也有TCP控制块,在tcp.h中有定义,叫做tcp_pcb,如下:
struct tcp_pcb
{
IP_PCB; /* 公共PCB构件 :IP地址、生存时间等*/
TCP_PCB_COMMON(struct tcp_pcb); /* 协议特定的PCB成员 :指向下一个节点指针、回调函数参数等*/
u16_t remote_port; /* 远程端口号 */
tcpflags_t flags; /* 标志位字段(U、 A、 P、 R、 S、 F)*/
.............
tcp_sent_fn sent; /* 发送数据成功后的回调函数*/
tcp_recv_fn recv; /* 接收数据成功后的回调函数 */
tcp_connected_fn connected; /* 连接成功时调用的回调函数 */
tcp_poll_fn poll; /* 周期性调用的函数 */
tcp_err_fn errf; /* 在发生致命错误时调用 */
};
lwIP中将TCP控制块组合成链表的形式,如下图:
TCP回调函数
RAW编程接口的TCP实验需要我们自行实现对应的回调 函数,然后将这些回调函数注册给指定的TCP控制块,这些注册函数如下: