6.5 TCP Connection Repair

TCP Connection Repair是通过socket选项实现的修复模式,使socket在不触发实际协议行为的情况下进入完成状态。在该模式下,connect不发送SYN包,收发包系统调用有特殊处理,close时不发送FIN。此功能主要应用于TCP socket迁移,但目前在Linux内核中仍不完整,未来发展值得期待。
摘要由CSDN通过智能技术生成

         TCP Connection Repair即TCP连接修复,这个功能是通过TCP_REPAIR socket选项实现的。当这个选项开启时,socket就会切换到修复模式,这个模式下对socket的任何操作都不会导致实质的协议行为(发送TCP报文),但会使socket直接进入成功完成动作的状态。

6.5.1 相关选项

        与TCP修复模式有关的socket选项有4个:TCP_REPAIR、TCP_REPAIR_QUEUE、TCP_QUEUE_SEQ、TCP_REPAIR_OPTIONS。代码如下:

2371 static int do_tcp_setsockopt(struct sock *sk, int level,
2372         int optname, char __user *optval, unsigned int optlen)
2373 {
...
2456     case TCP_REPAIR:
2457         if (!tcp_can_repair_sock(sk))
2458             err = -EPERM;
2459         else if (val == 1) {
2460             tp->repair = 1;
2461             sk->sk_reuse = SK_FORCE_REUSE;
2462             tp->repair_queue = TCP_NO_QUEUE;
2463         } else if (val == 0) {
2464             tp->repair = 0;
2465             sk->sk_reuse = SK_NO_REUSE;
2466             tcp_send_window_probe(sk);
2467         } else
2468             err = -EINVAL;
2469 
2470         break;
2471 
2472     case TCP_REPAIR_QUEUE:
2473         if (!tp->repair)
2474             err = -EPERM;
2475         else if (val < TCP_QUEUES_NR)
2476             tp->repair_queue = val;
2477         else
2478             err = -EINVAL;
2479         break;
2480 
2481     case TCP_QUEUE_SEQ:
2482         if (sk->sk_state != TCP_CLOSE)
2483             err = -EPERM;
2484         else if (tp->repair_queue == TCP_SEND_QUEUE)
2485             tp->write_seq = val;
2486         else if (tp->repair_queue == TCP_RECV_QUEUE)
2487             tp->rcv_nxt = val;
2488         else
2489             err = -EINVAL;
2490         break;
2491 
2492     case TCP_REPAIR_OPTIONS:
2493         if (!tp->repair)
2494             err = -EINVAL;
2495         else if (sk->sk_state == TCP_ESTABLISHED)
2496             err = tcp_repair_options_est(tp,
2497                     (struct tcp_repair_opt __user *)optval,
2498                     optlen);
2499         else
2500             err = -EPERM;
2501         break;
...
         tcp_can_repair_sock判断soket是否允
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值