网络编程之一:网络编程的大门

来源:互联网 发布:空调结构设计知乎 编辑:程序博客网 时间:2024/05/01 02:26
本博文简要阐述当今网络世界的OSI参考模型以及网络编程的大门socket

ISO/OSI参考模型
    ISO(国际标准化组织)在1985年研究的网络互联模型,该体系结构标准定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层和应用层)。它定义了一种层次结构,层次之间的互相关系以及各层所提供的服务,并不涉及具体的实现。请参考ISO/OSI参考模型

    应用层(5、6、7):我们每个人都是这个世界的老板,我们的每一次google searching,internet surfing,social network communication and emails handlering,都扮演了“经理”的角色。有一套很完善而又繁琐的服务在为我们工作,HTTP帮助我们在浏览器surfing,SMTP和POP3协助我们处理邮件,FTP支持文件传输等,这些应用层协议告诉我们远方传过来的是什么类型数据。就譬如当今的物流,你打了一个电话给物流要寄一个包裹,在未来的某一天你的朋友收到了这个包裹,过程你无须理会,你和你的朋友都能获得惊喜。显然,网络世界要快得多。
    传输层(4):这里就是实现基础网络编程的一个入口(如socketAPI),这里提供端到端(进程到进程)的传输定义。端就是端口的意思,因为进程是通过相应的端口和传输实体进行交互。在linux下你就可以通过netstat-anp可以看到本机器的哪些端口与其他机器哪些端口进行了何种连接。TCP和UDP都是本层中重要的协议,不了解可以google
    网络层(3):在这一层实现了数据在网络世界中的透明传送,路由选择、逻辑选址、连接建立、保持和终止,对于网络编程的人并不需要多少了解,但是IP协议是非常重要的。 
    数据链路层和物理层(1、2):物理层提供比特流的服务,而数据链路层提供在不可靠的物理介质上提供可靠的传输,有兴趣可以google

网络编程的大门
   刚接触网络编程都知道套接字(socket)编程,套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单位。它是网络通信过程中端点的抽象表示,包含进行网络通信的必须的五种信息:连接使用的协议,本机主机IP地址,本地进程的协议端口,远方主机的IP地址,远方进程的协议端口。Berkeley套接字是第一个socket,其他都与之类似。主要方法有:
    1. socket() 创建一个新的确定类型的套接字,类型用一个整型数值标识(文件描述符),并为它分配系统资源。 
    2. bind() 一般用于服务器端,将一个套接字与一个套接字地址结构相关联,比如,一个指定的本地端口和IP地址。 
    3. listen() 用于服务器端,使一个绑定的TCP套接字进入监听状态。
    4. connect() 用于客户端,为一个套接字分配一个自由的本地端口号。如果是TCP套接字的话,它会试图获得一个新的TCP连接。
    5. accept() 用于服务器端。它接受一个从远端客户端发出的创建一个新的TCP连接的接入请求,创建一个新的套接字,与该连接相应的套接字地址相关联。
    6. send()和recv(),或者write()和read(),或者recvfrom()和sendto(),用于往/从远程套接字发送和接受数据。
    7. close() 用于系统释放分配给一个套接字的资源。如果是TCP,连接会被中断。
    
    看到这些接口,你是否也发现它已经能够完成一个完整的网络连接和传输了呢?它是不是很强大?
    NO!它其实只是进行了端口和协议的定义,对服务的监听,数据的传送准备。真正的任务都是由伟大的操作系统的协议层来完成。 
    准确来说,socket只是调用操作系统通信服务的一种机制。首先,它不涉及任何数据包传送的过程,它只是一个活在本地内存中的对象,而真正的数据包却来自网络层I/O操作,而接受数据是网卡的工作,属于数据链路层,因为“能动”的操作都是在网络层以下。其次,通信能力的提供者是操作系统,操作系统提供了所有的协议服务,只是这种服务通过socket暴露给应用程序的开发者,形成API供其使用。因此,socketAPI只是应用程序之间与操作系统的协议层之间的一座桥梁。也就是应用层与传输层网络层之间的桥梁。譬如http协议通过调用socket来使用tcp/ip协议。 
    因此,有了这一座桥梁,我们就可以让应用程序调用操作系统的网络协议来完成我们的工作。这就是网络编程的入门基础!
    
    由于博主知识有限,如有误,请指正点评,欢迎交流。



0 0