sock结构和socket结构的区别和联系

本文深入解析了socket与sock的概念及其实现原理。socket作为一种统一结构,提供了BSD socket接口,而sock则是inet地址族为上层提供的抽象。文章详细介绍了通过socket函数创建套接字的过程,包括sock_create和sock_alloc等关键函数的作用。
socket是为引用层提供的统一结构,也就是所谓的BSD socket
而sock则是inet地址族为上层提供的一个抽象,
我们所说的建立一个套接字其实就是建立一个sock结构,其中包含了一个连接的绝大部分信息.
socket就是通常使用的socket接口,处于用户空间
例如在intsocket(int family, int type, intprotocol)调用时候,首先会掉用sock_create,而sock_create回调用sock_alloc()分配一个具体的socket,接下来sock_create将根据protocol调用具体的sock create函数创建sock结构

int sock_create(int family, int type, int protocol, struct socket **res)
{
   int i;
   struct socket *sock;

   /*
    *  Check protocol is in range
    */
   if (family < 0 || family >= NPROTO)
       return -EINVAL;
       
#if defined(CONFIG_KMOD) && defined(CONFIG_NET)
   /* Attempt to load a protocol module if the find failed.
    *
    * 12/09/1996 Marcin: But! this makes REALLY only sense, if the user
    * requested real, full-featured networking support upon configuration.
    * Otherwise module support will break!
    */
   if (net_families[family] == NULL) {
       char module_name[30];
       
       sprintf(module_name,"net-pf-%d",family);
       request_module(module_name);
   }
#endif

   if (net_families[family]==NULL)
       return -EINVAL;

/*
*  Check that this is a type that we know how to manipulate and
*  the protocol makes sense here. The family can still reject the
*  protocol later.
*/

   if ((type != SOCK_STREAM && type != SOCK_DGRAM &&
        type != SOCK_SEQPACKET && type != SOCK_RAW && type != SOCK_RDM &&
#ifdef CONFIG_XTP
       type != SOCK_WEB  &&
#endif
        type != SOCK_PACKET) || protocol < 0)
           return -EINVAL;

/*
*  Allocate the socket and allow the family to set things up. if
*  the protocol is 0, the family is instructed to select an appropriate
*  default.
*/
   
   if (!(sock = sock_alloc())) {
       printf("no more alloc sockets");
       return -ENFILE;     /* Not exactly a match, but its the closest posix thing */                      
   }

   sock->type = type;

   if ((i = net_families[family]->create(sock, protocol)) < 0) {
       sock_release(sock);
       return i;
   }

   *res = sock;
   return i;
}
链接: http://oldlinux.org/cgi-bin/LB5000XP/topic.cgi?forum=23&topic=7&show=

<think>我们被要求解释"sock""socket"之间的关系区别。首先,需要明确在计算机网络编程中,这两个术语通常指的是同一概念的不同表示或抽象层次。下面我将详细解释它们的联系区别,并确保最后按照要求输出相关问题。 </think>### socksocket 的关系及区别详解 #### 核心关系 **sock(套接字内核对象)** **socket(用户空间句柄)** 是同一通信管道的不同层次抽象: ```mermaid graph TD A[用户空间进程] -->|操作| B((socket 句柄)) B -->|映射| C[[sock 内核对象]] C -->|通信| D[网络协议栈] D --> E[物理网络] ``` #### 本质区别 | 特性 | socket | sock | |------|--------|------| | **存在位置** | 用户空间(文件描述符表) | 内核空间(套接字缓存区) | | **表现形式** | 整数型文件描述符(如 fd=3) | 内核结构体(`struct sock`) | | **生命周期** | 随进程结束销毁 | 内核维护,可独立存在 | | **操作方式** | 通过系统调用(socket(), bind()等) | 内核协议栈直接管理 | | **数据结构** | 无独立结构,仅是索引 | 包含完整连接状态:<br>- 接收/发送缓存区<br>- 协议控制块<br>- 队列指针 | #### 工作流程示例 当用户调用 `send()` 时: 1. 用户空间通过 **socket 描述符** 发起系统调用 2. 内核查找对应的 **sock 对象** 3. 数据从用户缓冲区拷贝到 sock 的发送缓冲区 4. 内核协议栈处理数据包: ```plaintext sock发送队列 → TCP分段 → IP封装 → 网卡驱动 ``` #### 关键交互接口 | 系统调用 | socket层作用 | sock层作用 | |----------|--------------|------------| | `socket()` | 创建新描述符 | 分配sock结构体 | | `bind()` | 传递地址参数 | 绑定IP/端口到sock | | `listen()` | 设置监听状态 | 创建连接请求队列 | | `accept()` | 返回新描述符 | 克隆sock建立新连接 | #### 特殊场景说明 1. **内核直接使用sock** 例如 ICMP 协议处理时,内核直接操作 sock 对象无需用户空间参与 2. **socket描述符复用** 通过 `dup()` 复制描述符时: - 多个 socket 指向同一 sock 对象 - 引用计数增加 ```c // 示例:两个描述符共享sock int fd1 = socket(AF_INET, SOCK_STREAM, 0); int fd2 = dup(fd1); // 内核sock_refcnt++ ``` 3. **sock的跨进程继承** 通过 fork() 创建子进程时: - socket描述符被复制 - 底层sock对象保持不变 ```mermaid graph BT P[父进程 fd=3] --> S[sock#123] C[子进程 fd=3] --> S ``` #### 性能影响对比 | 操作 | socket层开销 | sock层开销 | |------|--------------|------------| | 创建 | 用户-内核切换 | 内存分配+协议初始化 | | 数据传输 | 系统调用代价 | 内存拷贝+协议处理 | | 关闭 | 描述符表更新 | 资源释放+连接终止 | **总结**:socket 是用户空间的访问句柄,sock 是内核承载网络状态的核心对象,二者共同构成 Linux 网络编程的基础设施。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值