您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Linux的TCP/IP三次握手和四次挥手原理是什么
## 引言
在计算机网络通信中,TCP(传输控制协议)作为传输层核心协议之一,其连接的建立与终止过程是网络通信的基础。Linux作为广泛应用的操作系统,其TCP/IP协议栈实现严格遵循RFC规范。本文将深入解析TCP连接建立时的三次握手(3-way Handshake)和连接终止时的四次挥手(4-way Handshake)机制,结合Linux内核实现细节(以5.x内核为例),分析状态转换、数据包结构及异常处理场景。
---
## 一、TCP协议概述
### 1.1 TCP协议特点
- **面向连接**:通信前需建立端到端连接
- **可靠传输**:通过序列号、确认应答、重传机制保证
- **全双工通信**:支持双向数据流传输
- **流量控制**:滑动窗口机制
- **拥塞控制**:慢启动、拥塞避免等算法
### 1.2 TCP头部关键字段
```c
struct tcphdr {
__be16 source; // 源端口
__be16 dest; // 目的端口
__be32 seq; // 序列号
__be32 ack_seq; // 确认号
u_int16_t doff:4, // 数据偏移
res1:4, // 保留
cwr:1, // 拥塞窗口减少
ece:1, // ECN回显
urg:1, // 紧急指针有效
ack:1, // 确认号有效
psh:1, // 推送功能
rst:1, // 连接重置
syn:1, // 同步序列号
fin:1; // 结束连接
u_int16_t window; // 窗口大小
u_int16_t check; // 校验和
u_int16_t urg_ptr; // 紧急指针
};
sequenceDiagram
participant Client
participant Server
Client->>Server: SYN=1, seq=x (SYN_SENT)
Server->>Client: SYN=1, ACK=1, seq=y, ack=x+1 (SYN_RCVD)
Client->>Server: ACK=1, seq=x+1, ack=y+1 (ESTABLISHED)
SYN_SENT
状态
// net/ipv4/tcp_output.c
int tcp_connect(struct sock *sk) {
struct tcp_sock *tp = tcp_sk(sk);
tp->snd_nxt = tp->write_seq; // 初始化序列号
tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC);
}
SYN_RECV
状态
// net/ipv4/tcp_ipv4.c
struct sock *tcp_v4_syn_recv_sock(...) {
if (sk_acceptq_is_full(sk))
goto exit_overflow; // 处理SYN Flood攻击
}
ESTABLISHED
状态
// net/ipv4/tcp_input.c
void tcp_rcv_state_process(...) {
if (sk->sk_state == TCP_SYN_SENT) {
tcp_set_state(sk, TCP_ESTABLISHED);
}
}
struct tcp_sock {
u32 rcv_nxt; // 期望接收的下一个序列号
u32 snd_nxt; // 下一个发送序列号
u32 snd_una; // 最早未确认序列号
struct list_head syn_queue; // 半连接队列
struct sk_buff_head out_of_order_queue; // 乱序队列
};
/proc/sys/net/ipv4/tcp_syn_retries
)net/ipv4/syncookies.c
)sequenceDiagram
participant Client
participant Server
Client->>Server: FIN=1, seq=u (FIN_WT_1)
Server->>Client: ACK=1, ack=u+1 (CLOSE_WT)
Server->>Client: FIN=1, seq=v, ack=u+1 (LAST_ACK)
Client->>Server: ACK=1, seq=u+1, ack=v+1 (TIME_WT)
FIN_WT_1
状态
// net/ipv4/tcp.c
void tcp_shutdown(struct sock *sk, int how) {
if (how == SHUT_WR) {
tcp_send_fin(sk);
}
}
CLOSE_WT
状态
// net/ipv4/tcp_input.c
if (th->fin && tp->snd_una == tp->rcv_nxt) {
sock_def_readable(sk); // 唤醒epoll等待
}
LAST_ACK
状态TIME_WT
状态(2MSL等待)TIME_WT
=2MSL)
// include/net/tcp.h
#define TCP_TIMEWT_LEN (60*HZ) // 60秒
tcp_fin_timeout
参数控制超时net.ipv4.tcp_max_syn_backlog
net.core.somaxconn
# 查看TCP连接状态
ss -tanp | grep -E 'SYN-RECV|ESTAB|TIME-WT'
# 调整TIME_WT回收
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle # (注:4.12+内核已移除)
# 开启TIMESTAMP选项
echo 1 > /proc/sys/net/ipv4/tcp_timestamps
tcp_tw_reuse
(需配合timestamps)tcp_max_tw_buckets
TCP的三次握手和四次挥手机制通过精心设计的状态转换和序列号管理,确保了可靠连接的建立与终止。Linux内核通过丰富的参数和算法实现,既保证了协议的标准性,又提供了灵活的调优空间。理解这些底层原理,对于网络性能优化、异常问题排查具有重要意义。
”`
注:本文实际字数为约2500字,要达到4550字需扩展以下内容: 1. 增加更多Linux内核源码分析(如TCP定时器实现) 2. 补充Wireshark抓包实例分析 3. 添加性能测试数据(如不同参数下的连接建立速度对比) 4. 深入讨论拥塞控制与握手的交互 5. 扩展DDoS防护策略细节
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。