卷2 第24章 TCP:传输控制协议

24.1 引言

TCP是面向连接的可靠传输协议。实现约4500行代码。

24.2 代码介绍

文件

文件说明
netinet/tcp.hTCP首部
netinet/tcp_fsm.h有限状态机
netinet/tcp_seq.h序号比较
netinet/tcp_timer.h定时器
netinet/tcp_var.hTCP控制块
netinet/tcp_input.c输入处理
netinet/tcp_output.c输出处理
netinet/tcp_subr.c子函数
netinet/tcp_timer.c定时器
netinet/tcp_usrreq.c用户请求

24.3 TCP的protosw结构

  • 类型:SOCK_STREAM
  • 协议:IPPROTO_TCP(6)
  • 输入:tcp_input
  • 控制输入:tcp_ctlinput
  • 用户请求:tcp_usrreq

24.4 TCP的首部

struct tcphdr {
    u_short th_sport;
    u_short th_dport;
    tcp_seq th_seq;
    tcp_seq th_ack;
    u_char th_off:4;
    u_char th_x2:4;
    u_char th_flags;
    u_short th_win;
    u_short th_sum;
    u_short th_urp;
};
标志
标志	说明
TH_SYN	同步
TH_ACK	确认
TH_FIN	完成
TH_RST	复位
TH_PUSH	推送
TH_URG	紧急
24.5 TCP的控制块
tcpcb结构成员
成员	说明
t_state	连接状态
t_inpcb	回指PCB
t_rcv_nxt	接收序号
t_snd_una	未确认序号
t_snd_nxt	发送序号
t_snd_max	最大发送序号
t_snd_wnd	发送窗口
t_rcv_wnd	接收窗口
状态
状态	值
CLOSED	0
LISTEN	1
SYN_SENT	2
SYN_RCVD	3
ESTABLISHED	4
CLOSE_WAIT	5
FIN_WAIT_1	6
CLOSING	7
LAST_ACK	8
FIN_WAIT_2	9
TIME_WAIT	10
24.6 TCP的状态变迁图
关键状态转移
LISTEN → SYN_RCVD(被动打开)
 
SYN_SENT → ESTABLISHED(主动打开)
 
ESTABLISHED → FIN_WAIT_1(主动关闭)
 
ESTABLISHED → CLOSE_WAIT(被动关闭)
 
24.7 TCP的序号
发送序号空间
text
snd_una < snd_nxt <= snd_max
序号比较宏
宏	说明
SEQ_LT	小于
SEQ_LEQ	小于等于
SEQ_GT	大于
SEQ_GEQ	大于等于
24.8 tcp_init函数
初始化TCP PCB表
 
设置ISS(初始发送序号)
 
计算最大协议首部长度
 
MSL和平静时间
MSL:最大报文段生存时间(30秒)
 
平静时间:重启后MSL内不发送报文
 
24.9 小结
TCP使用tcpcb管理连接。状态变迁图是理解TCP的关键。