网络化的应用程序在开始任何通讯之前都必须要创建嵌套字。就像电话的插口一样,没有他就完全没办法通信。
“伯克利嵌套字” 或者 “BSD 套接字”
一开始套接字被设计用在同一台主机上多个应用程序之间通讯,这个被成为进程间通讯,或IPC。套接字有两种,分别是基于文件型和基于网络型的。
由于两个进程都运行在同一台机器上,而且这些嵌套字是基于文件的。所以,他们的底层结构是由文件系统来支持的。这样做相当有道理,因为在同一台电脑上文件系统的却是不同的进程都能访问的,
另一种嵌套字是基于网络的,他有自己的家族名字:AF_INET,或者叫“地址家族:Internet”。还有一种地址家族AF——INET6被用于协议6版(IPV6)寻址上,还有一些其他的地址家族,不过他们要么是只用在某个平台上,要么就是已经被废弃,或是很少被使用,或是根本就还没实现。所有地地址家族中,AF_INET是最广泛的一个,
面向链接:
无论你使用哪一种地址家族,嵌套字的类型只有两种。一种是面向连接的套接字,即:在通信之前一定要建立一条连接,就像跟朋友打电话时那样,这种通信方式也被成为“虚电路” 或 “流套字节”。面向连接的通信方式提供了顺序的、可靠的、不会重复的数据传输,而且也不会被加上数据边界。这也意味着,每一个要发送的信息,可能会被拆分成多份,每一份都会不多不少地正确到达目的地。然后被重新安顺序拼装起来,传给正在等待的应用程序。
实现这种连接的主要协议就是传输控制协议(TCP)。要创建TCP套接字就得在创建的时候指定套接字类型为SOCK_STREAM。TCP套接字采用SOCK_STREAM这个名字,表达了它作为流套接字的特点,由于这些套接字使用网际协议(IP)来查找网路中的主机,所以这样形成整个系统,一般会由这两个协议(TCP/IP)名的组合来描述。
无连接
与虚电路完全相反的是数据报型的无连接套接字,这意味着,无需建立连接就可以进行通讯。但这时,数据到达的顺序可靠性及不重复性就无法保证了,数据报会保留数据边界,这就表示,数据是整个发送的,不会像面向连接的协议那样被先拆分成小块。
及时数据报传输数据就想邮政服务一样,邮件和包裹不一定会按他们发送的顺序到达,事实上,他们还有肯恩个根本到达不了!而且,在网络中报文甚至会重复发送,这也增加了复杂性。
既然数据报有这么多的缺点,为什么还要使用他呢?
由于面向连接套字节要提供一些保证,以及要维持虚电路连接,这都是很重的额外负担。数据报没有这些负担,所以他更“便宜”。通常能提供更好的性能,更适合某些场合。
实现这种连接的只要协议就是用户数据报协议 UDP,UDP/IP