当前位置:首页>Linux>linux内核协议栈之tcp accept流程

linux内核协议栈之tcp accept流程

  • 2026-09-02 18:48:13
linux内核协议栈之tcp accept流程
   accept函数主要是用来接收tcp的connect请求,当存在connect请求时,此函数直接返回,并生成一个新的sock,否则会睡眠等待connect的到来,其代码流程如图1-1所示。
   图1-1:函数__sys_accept4代码流程图
1.函数__sys_accept4主要调用__sys_accept4_file来完成实际工作。
2.函数__sys_accept4_file首先分配一个newsock(struct socket *newsock),然后生成一个新的newfile(struct file *newfile),并将其与newsock关联,newsock->file = file,file->private_data = newsock,接着调用sock->ops->accept获取connect sk,最后将接收的sk对端地址返回给用户。
3.newsock分配函数。
4.file分配函数,并将其与newsock关联在一起。
5.接收对端请求的连接函数,对tcp来说其对应inet_stream_ops:inet_accept函数,其代码流程如图1-2所示。
6.返回对端地址给用户。
7.生成一个新的fd来关联新生成的sock,并返回给用户。
   图1-2:函数inet_accept代码流程图
8.inet_accept首先调用inet_csk_accept完成对端请求的接收,然后设置新sockàstate状态为SS_CONNECTED。
9.inet_csk_accept首先查看队列icsk->icsk_accept_queue中是否存在连接请求,不存在则等待,存在则直接从队列icsk->icsk_accept_queue中取出,返回newsk(struct sock *newsk)。
10.判断icsk->icsk_accept_queue队列是否为空。
11.为空则直接在listen sock 上等待。
12.从队列icsk->icsk_accept_queue取出连接请求。
参考
linux内核版本:5.7.8

最新文章

随机文章