首页
社区
课程
招聘
[原创]在调试器下观察Linux内核的数据包发送过程
发表于: 2021-7-21 15:45 8783

[原创]在调试器下观察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期)

最后于 2021-7-21 15:50 被birdring编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//