mac socket

###

套接字接口的起源

套接字接口是加州大学伯克利分校的研究员在20世纪80年代早期提出来的。因为这个原因,它也常被叫做伯克利套接字。伯克利的研究者使得套接字接口适用于任何底层的协议。第一个实现的就是针对TCP/IP协议的,他们把它包括在Unix 4.2BSD的内核里,并且分发给许多学校和实验室。这在因特网的历史上是一个重大事件。几乎一夜之间,成千上万的人们接触到了TCP/IP和它的源代码。它引起了巨大的轰动,并激发了新的网络和网络互联研究的浪潮

节选自 《深入理解计算机系统》第三版

伯克利 Berkeley

Core Foundation通过CFNetwork提供了封装套接字的CFSocket和CFStream,此外还进一步提供了一些协议的封装,例如CFFTP、CFHTTP等

BSD套接字是XNU中所有网络组件的核心

socket 函数

客户端和服务器使用socket函数来创建一个套接字描述符

在<sys/socket.h>中定义int socket(int, int, int);

在bsd>kern>syscalls.master 中97 AUE_SOCKET ALL { int socket(int domain, int type, int protocol); }

若成功则为非负描述符,若出错则为-1

1
2
3
4
5
6
7
8
9
10
/*
* domain 套接字域(地址/协议族)
通常指的是 AF(Address Family)或者PF(Protocol Family)
表示第2层或第3层地址对应的套接字地址模式。常见的IP协议,即PF_INET或AF_INET
传统上使用的是AF_*常量,PF_*常量只不过是通过AF_*常量#define得到的
* type
* protocol 所在文件bsd > netinet > in.h
Xcode里面也能看见注释
*/
int socket(int domain, int type, int protocol)
1
2
3
4
5
6
7
8
9
10
11
// socket.h 114~123
/*
* Types
*/
#define SOCK_STREAM 1 /* stream socket */
#define SOCK_DGRAM 2 /* datagram socket */
#define SOCK_RAW 3 /* raw-protocol interface */
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
#define SOCK_RDM 4 /* reliably-delivered message */
#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
#define SOCK_SEQPACKET 5 /* sequenced packet stream */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// socket.h 528~586
/*
* Address families.
*/
#define AF_UNSPEC 0 /* unspecified */
#define AF_UNIX 1 /* local to host (pipes) */
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
#define AF_LOCAL AF_UNIX /* backward compatibility */
#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
#define AF_INET 2 /* internetwork: UDP, TCP, etc. */

...

#define AF_INET6 30 /* IPv6 */
...
1
2
3
4
5
6
7
8
9
10
11
// socket.h 632~680
/*
* Protocol families, same as address families for now.
*/
#define PF_UNSPEC AF_UNSPEC
#define PF_LOCAL AF_LOCAL
#define PF_UNIX PF_LOCAL /* backward compatibility */
#define PF_INET AF_INET
...
#define PF_INET6 AF_INET6
...