1 报文格式
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port (16bit) | Destination Port (16bit) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number (32bit) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number (32bit) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| (4bit)| (10bit) |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
四元组(源IP、源端口、目标IP、目标端口)唯一标识一个TCP报文。
seq,序列号,告诉对端本次发送数据的 offset,解决乱序问题。
ack,确认应答号,告诉对端已经确认的序列号,解决丢包问题。
win,窗口大小,使用滑动窗口实现流量控制、拥塞控制。
1.2 Flag
2 连接
2.1 握手
syn_backlog 半连接队列 server SYN_RCVD 时所在的队列
accept队列 全连接队列 server ESTABLISHED,但应用还未 accept() 时所在的队列。min(somaxconn, backlog)
ISN 初始化随机数
如何实现1次、2次、4次握手
2.1.1 配置参数
参数 | 实际值 | 备注 |
---|---|---|
somaxconn=1024 | 3278 | /proc/sys/net/core/ |
backlog | listen(int fd, int backlog) | |
tcp_max_syn_backlog=1024 | ||
tcp_synack_retries=5 | ||
tcp_syncookies=1 | 默认打开 | |
tcp_fastopen=0 | 绕过三次握手 | |
tcp_abort_on_overflow=0 | 全连接队列满了直接丢弃请求 |
2.1.2 相关函数
socket()
connect()
bind()
listen()
accept()
2.2 挥手
2.2.1 配置参数
参数 | 实际值 | 备注 |
---|---|---|
tcp_fin_timeout=60 | 60 | FIN_WAIT_2 超时,默认 60秒(2MSL) |
tcp_orphan_retries=8 | 5 | FIN 报文重传次数 |
tcp_max_orphans=0 | 16384 | 限制孤儿连接的个数 |
tcp_max_tw_buckets=18000 | 3000 | 限制 TIME_WAIT 的 socket 数量 |
so_linger | ||
tcp_tw_reuse=0 | 复用 TIME_WAIT 的 socket,默认关闭 | |
tcp_timestamps=1 |
2.2.2 相关函数
4 传输
MSS Maximum Segment Size、最大报文长度。TCP数据最大长度,不包含报文头。
MSL Maximum Segment Lifetime、最大报文寿命。TIME_WAIT 默认 2MSL(60秒)。
RTT Round Trip Time 往返时延。数据到达对端的单程耗时。
RTO Retransmission Timeout 重传超时。应该略大于 RTT。
SACK Selective Acknowledgment 选择性确认。D-SACK
Nagle 发送方避免发送小数据,默认开启,使用 TCP_NODELAY 关闭。
紧急指针
参数 | 实际值 | 备注 |
---|---|---|
tcp_window_scaling=1 | 扩大窗口的大小 | |
tcp_wmem | 发送缓冲区范围 | |
tcp_rmem | 接收缓冲区范围 | |
tcp_mem | 8980365 11973823 17960730 | 内存范围 |
tcp_moderate_rcvbuf | 动态调节接收缓冲区 |
4.1 确认应答
延迟确认 接收方避免发送不携带数据的 ACK
重传 解决丢包问题。