卷2 第24章 TCP:传输控制协议
24.1 引言
TCP是面向连接的可靠传输协议。实现约4500行代码。
24.2 代码介绍
文件
| 文件 | 说明 |
|---|---|
| netinet/tcp.h | TCP首部 |
| netinet/tcp_fsm.h | 有限状态机 |
| netinet/tcp_seq.h | 序号比较 |
| netinet/tcp_timer.h | 定时器 |
| netinet/tcp_var.h | TCP控制块 |
| 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的关键。