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

假设客户端执行主动打开,已经经过第一次握手,即发送SYN包到服务器,状态变为SYN_SENT,服务器收到该包后,回复SYN+ACK包,客户端收到该包,进行主动打开端的第二次握手部分;流程中涉及到的函数和细节非常多,本篇只对主流程予以分析;

在ESTABLISHED和TIME_WAIT以外的状态时接收到包,会调用tcp_rcv_state_process函数来处理,处理部根据不同状态做对应处理,如果处于SYN_SENT状态,则会调用tcp_rcv_synsent_state_process函数进入和该状态的核心处理流程;

 

tcp_rcv_synsent_state_process函数为SYN_SENT状态输入数据包的核心处理函数,这里我们只关系服务器发送SYN+ACK的处理流程,其他部分暂且省略;函数主要完成以下几项工作:解析tcp选项;对序号,时间错,标志位等合法性做检查;调用函数tcp_ack对ack进行慢速路径处理;进行窗口,时间戳选项,MSS最大报文段,PMTU路径发现等初始化或更新;上述流程完毕后调用tcp_finish_connect完成连接建立,将连接状态更新为TCP_ESTABLISHED,若需要则开启保活定时器,以及对是否走快速路径做判断和标记;连接建立成功会进行一些唤醒操作;最后进行ACK模式是否切换的判断和操作,决定如何回复ACK;

 

以上流程中比较重要的两个函数为tcp_ack与tcp_finish_connect;

tcp_ack函数因为涉及内容较多,此处不做分析,后续单独分析后在补充链接;

 

tcp_finish_connect函数进行连接建立完成的处理,函数将连接状态更改为TCP_ESTABLISHED,检查并重建路由项,初始化拥塞控制,若需要则开启保活定时器,以及对是否走快速路径做判断和标记;

 

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

转载声明:转载请注明来源:Linux TCP/IP Stack,谢谢!


发表评论

电子邮件地址不会被公开。 必填项已用*标注