-
-
[原创]在调试器下观察Linux内核的数据包发送过程
-
发表于: 2021-7-21 15:45 8783
-
TCP/IP参考模型与OSI参考模型的关系,如图1.1所示。
图1.1 TCP/IP参考模型与OSI参考模型的关系
断下函数sock_sendmsg,并查看栈回溯,如图2.1所示。
图2.1 查看栈回溯
有信息发送时的栈回溯 无信息发送时的栈回溯
lk!sock_sendmsg lk!sock_sendmsg
lk!sock_write_iter+0x8c lk!__sys_sendto+0x13f
lk!do_iter_readv_writev+0x14c lk!__x64_sys_sendto+0x28
lk!do_iter_write+0x86 lk!do_syscall_64+0x5a
lk!vfs_writev+0x98 lk!entry_SYSCALL_64+0x7c
//通过观察图2.1中的栈回溯,我们可看到应用程序层内调用的函数信息及过程。
//在应用程序层内,进程通过使用套接字,将信息写入套接字内。
使用套接字发送信息时,信息会到达系统调用的函数sock_sendmsg,与此同时也会检查用户缓冲区是否可读,如果可读,则通过套接字描述符(由发出调用的进程提供)获取结构体sock;然后它会根据所传输的信息创建消息头,并创建1个套接字控制信息(含有进程的UID、PID及GID)。
函数sock_sendmsg被调用时,它遍历sendmsg函数,通过结构体proto ops中的sendmsg字段查询协议类型,并调用对应协议类型的sendmsg函数。
//TCP套接字=>调用tcp _sendmsg函数;UDP套接字=>调用udp_ sendmsg函数。
断下函数inet_sendmsg,查看栈回溯,如图2.2所示。
图2.2 查看栈回溯
//通过观察图2.2中的栈回溯,我们可看到套接字层内调用的函数信息及过程,显然函数inet_sendmsg被函数sock_sendmsg所调用。
函数inet_sendmsg的代码信息,如图2.3所示。
图2.3 函数inet_sendmsg的代码信息
套接字层内先是提取sock中的信息并检查信息的有效性,然后根据连接类型的不同(面向连接及无连接)去选择合适的协议(显然识别协议的类型也是套接字层的工作);接下来套接字层为各种套接字创建线程,方便进程调用。
断下函数tcp_sendmsg。查看栈回溯,如图2.4所示。
图2.4 查看栈回溯
//通过观察图2.5中的栈回溯,我们可看到传输层内调用的函数信息及过程,显然函数tcp_sendmsg被函数inet_sendmsg所调用。
函数tcp_sendmsg会等待连接完成建立并为连接设置最大段的大小(不建立连接无法继续传输信息),最大段的大小如图2.5所示;建立连接之后会通过I/O结构发送信息,这也代表着用户数据会被传输到套接字的缓冲区中;TCP确认连接是否在规定时间内建立连接的代码信息,如图2.6所示。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)