BSD socket

NOTE: 这篇文章假定读者熟悉 UNIX 下的 socket 和网络编程. 对用户级编程知识, 本文不作叙述.

socket 机制在系统中的地位

socket 机制是作为一个通用的, 跨机器, 跨平台的进程间通讯机制出现在系统中的. 我们通常把它作为网络通讯之用. 它使用了与文件系统相同的接口, 提供了协议无关的进程间通讯功能.

因此, 我们可以想到. 一个 socket 的机构应该被连接在 file 结构的 f_data 域中, 这样才能与上层的 VFS 相连, 并且应该逐个实现 fileops 中的函数接口 , 连在 file 结构的 f_ops 之中, 这样我们才可以如我们实际所做的那样, 用文件系统的 read(2), write(2) 函数进行 socket 通信. 同时, socket 的机构也应该包含一个域, 它是一个函数跳转表, 以跳转到底层协议, 如 TCP 的实现函数中. 在这个角度上看, socket 的作用也跟 VFS 是类似的. 但它与 VFS 大部分操作直接转接不同, 它还有大量需要自己处理的工作.

数据结构

内核结构

socket 的基本结构在 sys/socketvar.h 中, 包括 struct socket 以及描述 socket 缓冲区的结构 struct sockbuf. 上文所说的 socket 应有的机构都可以得到确认.

在 sys/protosw.h 中, 我们可以看到由 socket 结构 so_proto 域指向的 protosw 结构. 这就是 socket 与底层具体协议实现的接口. 我们需要大概记忆接口函数.

sys/socketvar.h 的 145 行是 socket 的状态, 需牢记.

用户接口数据结构

XXX.

mbuf

在 sockbuf 结构中, 我们可以看到, 一个 socket 的缓冲是一个 mbuf 链 (sb_mb 域). mbuf 是 socket 及以下的协议实现的基本数据封装, 传输和控制单位. 其结构定义在 sys/mbuf.h. 其中 m_hdr 是各种 mbuf 共同的头部信息, 最为重要.

我们首先来看一个注释, 弄明白一些重要的 size 问题. 我们使用 i386 的标准 . 即 MSIZE = 256, MCLBYTES = 2048.

/*
* Mbufs are of a single size, MSIZE (machine/param.h), which
* includes overhead. An mbuf may add a single "mbuf cluster" of size
* MCLBYTES (also in machine/param.h), which has no additional overhead
* and is used instead of the internal data area; this is done when
* at least MINCLSIZE of data must be stored.
*/

也就是说, 一个 mbuf 有 256 字节大, 如果它使用扩展空间, 可以用到 2048 个字节. 又, mbuf 携带的数据分两种: 正常数据和报文头部. 那么, 如果不使用扩展空间 (m_ext), mbuf 在携带正常数据的时候应可以使用 256 - sizeof(m_hdr) 的空间, 而携带报文头部时这个大小应该是 256 - sizeof(m_hdr) - sizeof(pkthdr).

定义 MBUF 结构在 269 行, 真正的结构描述在 225 行. 可以看到, 我们最终得出的是, 在不使用扩展空间时. 一个 mbuf 能携带 256 - 30 = 226bytes 的普通数据 和 256 - 30 - 20 = 206 bytes 的协议头.

我们要对 m_hdr 结构很熟悉. 也应该看看 kern/uipc_mbuf.c 的函数接口.

连接建立

socket(2)

sys_socket() 在 uipc_syscalls.c 中. 它要完成两个工作: 建立文件结构和相应的接口; 调用 socreate 完成真正的 socket 建立工作. 其中第一项工作是我们熟悉的, 注意 89 行起三行填写参数的代码, 还要注意 socketops 的内容, 这是我们对 socket 调用 read(2) 等调用时将要进入的地方. 我们现在来看 socreate 是怎么完成第二项工作的.

socreate 在 uipc_socket.c 中. 在这里, 我们首先要利用 pffindproto() /pffindtype() 根据参数找到相应的 protosw 结构, 即到底层协议实现的接口 . 然后申请 socket 结构的内存空间, 填写参数. 上层机构建立完毕后, 我们要通知协议实现加入这个 socket, 并真正创建协议相关的通讯机构. 我们使用其 pr_usrreq 的 PRU_ATTACH 操作完成这一点.

至此, 从顶层的文件接口, 到底层的协议实现机构, 整个 socket 创建完成.

时间: 2024-11-03 06:43:43

BSD socket的相关文章

BSD Socket简易入门手册

介绍 当你进入UNIX的神秘世界后,立刻会发现越来越多的东西难以理解.对于大多数人来说,BSD socket 的概念就是其中一个.这是一个很短的教程来解释他们是什么.他们如何工作并给出一些简单的代码来解释如何使用他们. 类比(什么是socket ?) socket是进行程序间通讯(IPC)的BSD方法.这意味着socket用来让一个进程和其他的进程互通信息,就象我们用电话来和其他的人交流一样. 用电话来比喻是很恰当的,我们在后面将一直用电话这个概念来描叙socket. 装上你的新电话(怎样侦听?

Linux内核协议栈-从BSD socket接口层到传输层1

本文接上一篇Linux内核协议栈-初始化流程分析,在上一篇中主要分析了了Linux内核协议栈涉及到的关键初始化函数,在这一篇文章中将分析协议栈的BSD socket和到传输层的流程.采取的方式是分析socket相关的主要系统调用.针对不同的系统调用,其到达的协议层深度可能不同,有的基本只到sock层就够了,但是有些可能需要会涉及到比如tcp的具体细节和更底层的细节.本文基本追溯到传输层的开始,再深入的细节后续文章分析. 1.准备 协议的基本分层: (A代表socket的某个系统调用) BSD s

【C/S通信交互之SOCKET篇】COCOS2DX(CLIENT)使用BSD SOCKET与MINA(SERVER)手机网游通信框架!

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/844.html 其实对于此篇算是对于这段时间网络研究的一个总结. 对于手游网络通信的交互,一般情况下,Socket长连接直接使用Mina框架即可,对于Http短连接使用Servlet 入口即可(那么对于后期将陆续更新Servlet博文) 那么本篇主要介绍Socket长连接,当然与此配对的跨平台通信则选择了BSD

socket编程与线程模型二

Winsock是windows系统上的一个网络通信API编程接口.TCP/IP协议栈只是 winsock通信的一个子集,winsock还可以支持除了tcp/ip之外的其它协议栈. BSD socket是unix上tcp/ip协议栈的编程接口,所以winsock和BSD套接字包含的 协议栈不一样.所以winsock编程中对于需要榜定的地址必须说明协议族和地址 类型等.因为它可以支持很多通信协议. winsock说明 图中紫色的长方形代表数据缓冲区,网卡和协议栈都有缓冲区.数据到达以 后,首先在网卡

iOS网络编程入门:iOS中的Socket编程

使用Socket进行C/S结构编程,连接过程 服 务器端监听某个端口是否有连接请求.服务器端程序处于堵塞状态,直到客户端向服务器端发出连接请求,服务器端接受请求程序才能向下运行.一旦连接建立起 来,通过Socket可以获得输入输出流对象.借助于输入输出流对象就可以实现与客户端的通讯,最后不要忘记关闭Socket和释放一些资源(包括:关闭 输入输出流). 客户端流程是先指定要通讯的服务器IP地址.端口和采用的传输协议(TCP或UDP),向服务器发出连接请求,服务器有应答请求之后,就会建立连接.之后

iOS的socket开发基础

iOS的socket开发基础 首先让我们通过一张图知道socket在哪里? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口. TCP和UDP的区别 TCP:面向连接.传输可靠(保证数据正确性.保证数据顺序).用于传输大量数据(流模式).速度慢,建立连接需要开销较多(时间,系统资源). UDP:面向非连接.传输不可靠.用于传输少量数据(数据包模式).速度快. 关于TCP是一种流模式的协议,UDP是一种数据报模式的协议,这里要说明一下,TCP是面向连接的,也就是说,在连接

深入浅出--iOS的TCP/IP协议族剖析&&Socket

简介 该篇文章主要回顾--TCP/IP协议族中的TCP/UDP.HTTP:还有Socket.(--该文很干,酝酿了许久!你能耐心看完吗?) 我在这个文章中,列举了常见的TCP/IP族中的协议,今天主角是--传输层协议. 传输层(Transport Layer)是OSI(七层模型)中最重要.最关键的一层,它负责总体的数据传输和数据控制的一层,传输层提供端到端(应用会在网卡注册一个端口号)的交换数据的机制,检查分组编号与次序.传输层对其上三层如会话层等,提供可靠的传输服务,对网络层提供可靠的目的地站

java-Java Socket网络通信问题,向百度发送数据(学习socket中~)

问题描述 Java Socket网络通信问题,向百度发送数据(学习socket中~) 我在本地客户端向百度某个端口(如:80)发送一个数据(例如字符a),百度会返回什么信息吗? 测了一下,并没有什么回应.那么我在本地客户端怎么做,百度才会返回一些信息 (例如:时间.网页新闻之类的消息) 解决方案 http://blog.csdn.net/b_h_l/article/details/8712282 解决方案二: 基于Java的socket网络通信Java网络通信Socket[Cocos2d-x]使

iOS开发之即时通讯之Socket(AsyncSocket)

1.AsyncSocket介绍 如果需要在项目中像QQ微信一样做到即时通讯,必须使用socket通讯. iOS中Socket编程的方式: BSD Socket: BSD Socket 是UNIX系统中通用的网络接口,它不仅支持各种不同的网络类型,而且也是一种内部进程之间的通信机制.而iOS系统其实本质就是UNIX,所以可以用,但是比较复杂. CFSocket: CFSocket是苹果提供给我们的使用Socket的方式,但是用起来还是会不太顺手.当然想使用的话,可以细细研究一下. AsyncSoc