第二次握手

TCP被动打开 之 第二次握手-发送SYN+ACK

↘锁芯ラ 提交于 2019-12-02 14:47:12
假定客户端执行主动打开,发送syn包到服务器,服务器执行完该包的第一次握手操作后,调用af_ops->send_synack向客户端发送syn+ack包,该回调实际调用tcp_v4_send_synack函数; 1 int tcp_conn_request(struct request_sock_ops *rsk_ops, 2 const struct tcp_request_sock_ops *af_ops, 3 struct sock *sk, struct sk_buff *skb) 4 { 5 /* 第一次握手的服务器处理 */ 6 7 /* 发送syn+ack */ 8 af_ops->send_synack(sk, dst, &fl, req, &foc, 9 !want_cookie ? TCP_SYNACK_NORMAL : 10 TCP_SYNACK_COOKIE); 11 return 0; 12 } tcp_v4_send_synack完成路由查找,构造syn+ack包,构造ip包,然后发送出去; 1 /* 2 * Send a SYN-ACK after having received a SYN. 3 * This still operates on a request_sock only, not on a big 4 * socket. 5 */ 6

TCP主动打开 之 第二次握手-接收SYN+ACK

落爺英雄遲暮 提交于 2019-12-02 14:42:55
假设客户端执行主动打开,已经经过第一次握手,即发送SYN包到服务器,状态变为SYN_SENT,服务器收到该包后,回复SYN+ACK包,客户端收到该包,进行主动打开端的第二次握手部分;流程中涉及到的函数和细节非常多,本篇只对主流程予以分析; 在ESTABLISHED和TIME_WAIT以外的状态时接收到包,会调用tcp_rcv_state_process函数来处理,处理部根据不同状态做对应处理,如果处于SYN_SENT状态,则会调用tcp_rcv_synsent_state_process函数进入和该状态的核心处理流程; 1 /* 2 * This function implements the receiving procedure of RFC 793 for 3 * all states except ESTABLISHED and TIME_WAIT. 4 * It's called from both tcp_v4_rcv and tcp_v6_rcv and should be 5 * address independent. 6 */ 7 8 int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) 9 { 10 switch (sk->sk_state) { 11 case TCP_CLOSE: