From http://www.cnblogs.com/lxgeek/p/4329922.html
簡述:
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 }
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信息的交換。
參考文獻: