抽象的操作系统(六) --- 网络

来源:互联网 发布:excel 2013数据有效性 编辑:程序博客网 时间:2024/05/29 14:59
        网络模块在所有的操作系统上,提供的接口高度相似,因为它们都是传承于ISO/OSI层次模型。在大学的年代,学计算机网络课程最经常被提起的是它的分层模型,物、数、网、传、对、表、应七层。
        在操作系统这个话题中,俺只讲TCP/IP协议部分,因为对应用开发来讲,接触的也就是这部分接口API。至于更低层的如果感兴趣可以去网上查资料,更高一些层次的比如HTTP/RTSP这样的,则会在别的话题中讲解。因为在目前这个话题中,初衷是让大家都操作系统有个基本的认识,不能越界。
        1). IP地址和端口。一个IP地址明确代表了一台主机(有时候是好几台服务器,想知道原因请百度LVS);端口则明确了跟主机上的哪个服务来交互。因此大家使用SOCKET进行联网的时候,一定是要两个参数,IP和PORT。所以基于IP协议的上层协议,都要提供IP和端口来作为参数。
        2). TCP。TCP是基于IP的有连接的可靠的控制协议,在一把建立SOCKET的时候,传递的SOCK_STREAM就是它了。TCP有自己的错误控制以及重传机制,从而提供了一个稳定的双向的数据流通道。为了可靠则会导致它采用了握手协议,也就是说接收方需要向发送方应答。进行连接的时候,是三次握手这个大家都是熟知的;传输数据的时候,也是要握手的,如果想知道可以百度‘滑动窗口协议’来了解。
        3). UDP。用户数据报协议,建立SOCKET的时候,SOCK_DGRAM指的就是它。数据报协议是不可靠的,它只是发送了就不管了,可能接收方根本没有收到,也可能收到的一些数据包颠倒了。实物都有两面性,缺少了控制机制,它的传输效率就高了。很多局域网传输软件,比如飞鸽传书,用的就是UDP协议,快啊。
        前面提了那么多次SOCKET,它是什么意思?其实SOCKET包装了更底层的协议交互, 让应用可以更简单地跟外部其他的计算机通讯。建立一个SOCKET内核资源,其实就是有了使用网络模块功能的权限,可以跟网络上的其他的计算机进行收发数据了。套接字接口提供了对TCP/UDP的封装,而大多数情况下开发也就用到了这两个协议。下面把经常遇到的SOCKET的接口,列举一下。
       1). 创建。需要指明想创建TCP的还是UDP的SOCKET。
       2). 连接。TCP的SOCKET需要连接到主机,要有IP地址和端口作为参数。
       3). 发送。TCP直接调用Send函数;UDP的则要调用SendTo,并要传递IP和POART。
       4). 接收。TCP直接接收;UDP用RecvFrom,网络模块会在接收数据的同时将数据来源传递出来。
       5). 关闭。用完SOCKET,一定要记得关闭,否则后果相当的严重,尤其SOCKET资源比较紧缺的平台上。
       6). 域名与解析。有时候用IP地址定死了一个主机,如果想可以灵活的配置主机,则用域名。域名则代表了一台或几台主机,使用域名解析函数可以根据域名解析出对应的IP地址。
       在使用SOCKET的时候,有一个比较重要的话题,这里要抛出来,就是阻塞与非阻塞。默认情况下,SOCKET是阻塞式的,就是接受或者发送的时候一直等。这样程序就暂停了,在嵌入式应用上来说,这个不是好现象。为什么?因为很多情况下,程序运行在单线程的环境里。因此要使用非阻塞的,也就是异步的。异步机制,首先要将SOCKET设置成非阻塞的,这样如果没有数据到来或者发送繁忙的时候,就会立即返回WOULDBLOLCK。而应用就可以继续去处理其他的逻辑。如何继续接收或者发送呢,一般有两种方法可以使用。
      1). 轮询。就是启动一个TIMER,过段时间就来再次调用一下读取或者接收,直到出错或者完成。
      2). 使用SELECT。SELECT是让系统在有数据或者可以发送的时候,内部发出通知给应用。关于SELECT的用法,可以去百度,很多资料写的非常详细。
原创粉丝点击