第十六章 socket的关闭
16.1 内核的关闭函数
服务器调用close(server_fd)主动关闭socket
最终在当前进程task_struct结构中通过文件号找到客户端socket的文件file, 文件结构的f_op指向文件函数表,如果存在就调用文件函数表的release()函数. 在初始化时被指定为sock_close()函数
sys_close()-->filp_close()-->fput()-->__fput()-->sock_close()-->sock_fasync()
-->sock_release()-->inet_release()-->tcp_close()-->inet_csk_listen_stop()-->tcp_disconnect()-->(递归)inet_csk_listen_stop()
-->inet_csk_destory_sock()-->tcp_v4_destory_sock()
-->tcp_disconnect()
sock_release()释入服务器的socket和文件节点
inet_csk_destory_sock()销毁客户端sock内容
16.2 服务器与客户端的共同关闭
FIN到达客户端后,最终到达tcp_v4_do_rcv()
tcp_rcv_established()-->tcp_data_queue()-->tcp_fin()
tcp_rcv_established()-->tcp_ack_snd_check()-->__tcp_ack_snd_check()-->tcp_send_ack()-->
tcp_send_ack()创建ACK数据包
服务器通过tcp_v4_do_rcv()进入tcp_rcv_state_process()处理接收的ACK数据包.
tcp_v4_do_rcv()-->tcp_rcv_state_process()
阅读(831) | 评论(0) | 转发(0) |