zoukankan      html  css  js  c++  java
  • MPTCP 源码分析(一) MPTCP的三次握手

    简述:
         MPTCP依然按照正常的TCP进行三次握手,只是在握手过程中增加了MPTCP特有的信息。
     
    建立过程
         三次握手过程如下图所示:
      左边客户端发送的第一个SYN包携带有客户端自身的KEY,右边发送SYN/ACK的时候携带了自身的KEY,
    而最后左边的客户端发送最后一个ACK的时候携带着双方的KEY。MPTCP中关于MP_CAPABLE的定义如下:
    Subtype的定义如下:
     
    MPTCP的内核实现 
         MPTCP在客户端上发送SYN包的调用情况如下:
    关键函数为mptcp_syn_options对MPTCP选项的填充,源码如下:
    "net/mptcp/mptcp_output.c" line 843 of 1667
    843 void mptcp_syn_options(struct sock *sk, struct tcp_out_options *opts,
    844                unsigned *remaining)
    845 {
    846     struct tcp_sock *tp = tcp_sk(sk);
    847
    848     opts->options |= OPTION_MPTCP;
    849     if (is_master_tp(tp)) {
    850         opts->mptcp_options |= OPTION_MP_CAPABLE | OPTION_TYPE_SYN;
    851         *remaining -= MPTCP_SUB_LEN_CAPABLE_SYN_ALIGN;
    852         opts->mp_capable.sender_key = tp->mptcp_loc_key;
    853         opts->dss_csum = !!sysctl_mptcp_checksum;
    854     } else {
    855         struct mptcp_cb *mpcb = tp->mpcb;
    856
    857         opts->mptcp_options |= OPTION_MP_JOIN | OPTION_TYPE_SYN;
    858         *remaining -= MPTCP_SUB_LEN_JOIN_SYN_ALIGN;
    859         opts->mp_join_syns.token = mpcb->mptcp_rem_token;
    860         opts->mp_join_syns.low_prio  = tp->mptcp->low_prio;
    861         opts->addr_id = tp->mptcp->loc_id;
    862         opts->mp_join_syns.sender_nonce = tp->mptcp->mptcp_loc_nonce;
    863     }
    864 }
    由于三次握手的肯定是master sock,在850行到853行对MPTCP选项进行了赋值。相应的
    服务端发送SYN/ACK包时使用mptcp_synack_options函数对选项进行了赋值。而最后一个ACK包
    则是调用函数mptcp_established_options操作。
     
    结论:
    1. MPTCP利用TCP的三次握手进行了KEY信息的交换。
     
    参考文献:
     
  • 相关阅读:
    【IIS错误】IIS各种错误
    【IIS错误
    【C#】C#操作Excel文件(转)
    【C#】语音识别
    【IIS错误】未能加载文件或程序集“AAAAA”或它的某一个依赖项。试图加载格式不正确的程序。
    【Web前端】清除css、javascript及背景图在浏览器中的缓存
    【模态窗口-Modeldialog】提交请求时禁止在新窗口打开页面的处理方法
    第八周学习进度表
    梦断代码阅读笔记01
    第二阶段冲刺第七天
  • 原文地址:https://www.cnblogs.com/lxgeek/p/4329922.html
Copyright © 2011-2022 走看看