Socket
Socket的历史
1.Soket发展史以及它和
tcp/ip
的关系
七十年代中,美国国防部高研署
(DARPA)
将
TCP/IP
的软件提供给加利福尼亚大学
Berkeley
分校后,
TCP/IP
很快被集成到
Unix
中,同时出现了许多成熟的
TCP/IP
应用程序接口
(API)
。这个
API
称为
Socket
接口。今天,
SOCKET
接口是
TCP/IP
网络最为
通用的
API
,也是在
INTERNET
上进行应用开发最为通用的
API
。
九十年代初,由
Microsoft
联合了其他几家公司共同制定了一套
WINDOWS
下的网络编程接口,即
Windows Sockets
规范。它是
Berkeley Sockets
的重要扩充,主要是增加了一些异步函数,并增加了符合
Windows
消息驱动特性的网络事件异步选择机制。
Windows Sockets
规范是一套开放的、支持多种协议的
Windows
下的网络编程接口。目前,在实际应用中的
Windows Sockets
规范主要有
1.1
版和
2.0
版。两者的最重要区别是
1.1
版只支持
TCP/IP
协议,而
2.0
版可以支持多协议,
2.0
版有良好的向后兼容
性,目前,
Windows
下的
Internet
软件都是基于
WinSock
开发的。
- 是一个编程接口
理解为和文件描述符一样用于标识一个通讯接口的对象。是在
TCP/IP
模型分层的应用层和传输层之间的一个编程接口。回想一下
TCP/IP
协议栈在计算机中实现的两条重要的分割线
–
P23的图
Socket我们称为套接字描述符。
- 是一种特殊的文件描述符 (everything in Unix is a file)
Socket的使用与
UNIX
文件或者设备非常类似,因而
socket
也遵循
UNIX
上文件的基本操作流程,包括打开
->
读
/
写
->
关闭。除了打开不同(
socket
采用
socket()
获得
socket
的文件描述符),其他的已经介绍过的传统的文件
IO
操作如读
(read)/
写
(write)/
关闭
(close)
都可以作用于
socket
(
lseek
不行),当然对
socket
还增加了一些其他的
API
,
-
参考后面的
socket API
部分。同时,为了可能对文件和
socket
都是用像读和写一样的原语,操作系统
Linux
从同一个整数集合中分配文件描述符合
socket
描述符,并确保如果某一个整数已经被分配为文件描述符,那么它就不能被分配为
socket
描述符。从
Linux
的实现上也可以看出
socket
描述符和一个文件描述符是绑定在一起的。参考:
http://blog.csdn.net/ce123_zhouwei/article/details/8459730
- 并不仅限于TCP/IP协议
是一种
通用
的进程间通讯编程接口,所谓的通用,是说不仅支持异地进程的通信,也支持本地进程的通信,不仅支持
TCP/IP
,也支持其他通讯协议(可以认为是一种独立于具体协议的通讯编程接口)。只是在历史上由于
socket
在
TCP/IP
网络互连上的广泛应用,他们几乎被等同起来了。后面主要讲解的也是在
TCP/IP
上的
socket
,但也会介绍一下
socket
用于本地进程间通信。
套接字分为以下三种类型:
字节流套接字
(Stream Socket)
是最常用的套接字类型,
TCP/IP
协议族中的
TCP
协议使用此类接口。字节流套接口提供面向连接的
(
建立虚电路
)
、无差错的、发送先后顺序一致的、无记录边界和非重复的网络信包传输。
数据报套接字
(Datagram Socket)
TCP/IP
协议族中的
UDP
协议使用此类接口,它是无连接的服务,它以独立的信包进行网络传输,信包最大长度为
32KB
,传输不保证顺
序性、可靠性和无重复性,它通常用于单个报文传输或可靠性不重要的场合。数据报套接口的一个重要特点是它保留了记录边界。对于这一特点。数据报套接口采用了与现在许多包交换网络
(
例如以太网
)
非常类似的模型。
原始数据报套接字
(Raw Socket)
提供对网络下层通讯协议
(
如
IP
协议
)
的直接访问,它一般不是提供给普通用户的,主要用于开发新的协议或用于提取协议较隐蔽的功能。