ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

2-5:套接字(Socket)编程之从内核角度深入理解套接字

2021-06-07 13:01:39  阅读:187  来源: 互联网

标签:udp struct sock tcp sk 内核 接字 Socket


文章目录


以TCP通信为例,创建套接字时使用的接口是 socket,监听使用的 listen,绑定使用的 bind,不管怎样, 他们都是系统调用接口。在Linux内核代码中,是通过call来区分的
在这里插入图片描述
其实,创建套接字的时候,在底层会首先创建一个内核结构,叫做 struct socket
在这里插入图片描述
其中有两个非常重要的struct,分别是 filesockfile与文件有关,因为socket本质就是文件,而这是套接字,一定还要与网络相关,因此其内部还会有一个结构体是 sock
在这里插入图片描述
如下是sock结构体
在这里插入图片描述
当然这里不止这么一种 sock,还有很多种 sock,例如 tcp_sock, udp_sock, raw_sock

在sock中有两个结构体:

struct sk_buff_head	sk_receive_queue;//接受的数据放入接受队列
struct sk_buff_head	sk_write_queue;//用户层写入的数据放入该队列

当然如果你使用的是tcp,那么使用的sock就是tcp_sock
在这里插入图片描述
如果你使用的是udp,那么使用的sock就是udp_sock
在这里插入图片描述
大家可以看到无论是udp_sock还是tcp_sock,都必须保证“inet_sock has to be the first member ”
同时inet_sock里的第一个字段正是sock
在这里插入图片描述
整个过程实际有点绕,但是总结到下面这张图中就十分清晰了

结合前面说过的task_struct,访问时只要强转,也就是进行切片操作就可以完成任意结构体的访问了
在这里插入图片描述

在创建套接字时,会调用sock_map_fd,创建一个文件,然后分配文件描述符
在这里插入图片描述
然后再用sock_attach_fd,让文件和套接字产生关联
在这里插入图片描述
也就是下面这样
在这里插入图片描述

文件与套接字关系如下
在这里插入图片描述

标签:udp,struct,sock,tcp,sk,内核,接字,Socket
来源: https://blog.csdn.net/qq_39183034/article/details/117654304

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有