简述:
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信息的交换。
参考文献:
1.RFC6824