孙鑫VC++第14课:网络编程01——网络概念

1、计算机网络知识

1.1、网络通信必要条件

计算机网络是相互连接的独立自主的计算机的集合,最简单的网络形式由两台计算机组成。

计算机A通过“网络”与计算机进行通信。

要完成通信,对于A主机而言,需要知道通信对象标识。IP地址就是主机的标识。

要完成通信,需要双方约定并遵循一定的规则。协议就是通信规则。

使用端口号标识主机中运行的网络应用程序。

在发送消息时, 不仅需要指定通信的IP地址,还需要指定一个端口号。在指定IP地址的主机上,在该特定端口等待数据的网络应用程序接收数据。

网络通信与打电话类似,IP地址就像一个公司的总机号码,端口号是总机的分机号,在拨打电话时,拨通总机后,根据需要转到分机上。

 

1.2 网络关键词

1.2.1 IP地址

·IP网络中每台主机都必须有一个唯一的IP地址;

·IP地址是一个逻辑地址;

·因特网上的IP地址具有全球唯一性;

·32位,4个字节,常用点分十进制的格式表示,例如:192.168.0.16

 

1.2.2 协议

·为进行网络中的数据交换(通信)而建立的规则、标准或约定。(=语义+语法+规则)

·不同层具有各自不同的协议。

网络状况

·多种通信媒介——有线、无线……

·不同种类的设备——通用、专用……

·不同的操作系统——Unix、Windows……

·不同的应用环境——固定、移动……

·不同业务种类——分时、交互、实时……

·宝贵投资和积累——有形、无形……

·用户业务的延续性——不允许出现大的跌宕起伏。

它们互相交织,形成了非常复杂的系统应用环境。

 

网络异质问题的解决:

·网络体系结构就是使这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现互操作性,并满足各种业务需求的一种粘合剂,它营造了一种“生存空间”——任何厂商的任何产品、以及任何技术只要遵守这个空间的行为规则,就能够在其中生存并发展。

·网络体系结构解决异质性问题采用的是分层方法——把复杂的网络互联问题划分为若干个较小的、单一的问题,在不同层上予以解决。(就象在编程时把问题分解为很多小的模块来解决一样。)

 

1.2.3 ISO/OSI七层参考模型

OSI(Open System Interconnection)参考模型将网络的不同功能划分为7层。

应用层——处理网络应用(为用户的应用程序提供网络通信服务)

表示层——数据表示(处理被传输数据的表示问题,即信息的语法和语义。如有必要,使用一种通用的数据表示格式,在多种数据表示格式之间进行转换,如将本地日期、货币等数据格式与标准数据格式进行转换、数据的加解密、压缩与解压缩等)

会话层——主机间通信(在两个相互通信的应用进程之间,建立、组织和协调其相互之间的通信)

传输层——端到端的连接(为源端主机到目的端主机提供可靠的数据传输服务,隔离网络的上下层协议,使网络应用与下层协议无关)

网络层——寻址和最短路径(提供IP寻址和路由。在网络上,数据到达目标主机可能有多条线路,网络层负责找出最佳的传输线路)

数据链路层——介质访问(接入)(加强物理层的传输功能,建立一条无差错的传输线路)

物理层——二进制传输(确定在通信信道上如何传输比特流)

OSI七层模型并不是指物理实体上存在这七层,这只是一个功能的划分,是一个抽象的网络参考模型。在进行网络通信时,每层提供对应层的网络服务。

通信实体的对等层之间不允许直接通信。

各层之间是严格单向依赖的。

上层使用下层提供的服务——Service user;

下层向上层提供服务——Service provider。

中国教师需要使用翻译提供的翻译服务,翻译需要使用秘书提供的传真服务。

中国教师与德国教师之前存在一条虚拟的线路。中国教师主观认为他是与德国教师直接通信,实际通信是通过下层提供的服务来完成的。最终的通信是通过底层的物理通信线路来完成的。

对等层实体之间虚拟通信。下层向上层提供服务,实际通信在最底层完成。

1.2.4 OSI各层所使用的协议

·应用层:远程登录协议Telnet、文件传输协议FTP、超文本传输协议HTTP、域名服务DNS、简单邮件传输协议SMTP、邮局协议POP3等。

·传输层:传输控制协议TCP、用户数据报协议UDP

  TCP:面向连接的可靠的传输协议。(三步握手,建立连接,随后可收发数据。可保证数据到达目的地,类似电话。下载安装程序不能丢失数据,使用TCP实现)

  UDP:是无连接的,不可靠的传输协议。(直接向ip地址发送数据,不保证数据到达目的地,类似于寄信。无数据确认与重传机制,实时性较高。视频会议/视频点播可采用UDP协议进行实现)

·网络层:网际协议IP、Internet互联网控制报文协议ICMP、Internet组管理协议IGMP。

1.2.5 数据封装

一台计算机要发送数据到另一台计算机,数据首先必须打包,打包的过程称为“封装”。

封装就是在数据前面加上特定协议头部。

如:利用TCP协议传送数据,当数据到达传输层协议时,会加上一个TCP头;当数据到达网络层时,在数据前会再加上一个IP头。

·OSI参考模型中,对等层协议之间交换的信息单元统称为协议数据单元(PDU,Protocol Data Unit)

·OSI参考模型中每一层都要依靠下一层提供的服务

·为了提供服务,下层把上层的PDU作为本层的数据封装,然后加入本层的头部(和尾部)。头部中含有完成数据传输所需的控制信息。

·这样,数据自上而下递交的过程实际就是不断封装的过程。到达目的地后自下而上递交的过程就是不断拆封的过程。由此可知,在物理线路上传输的数据,其外面实际上被包封了多层“信封”

·但是,某一层只能识别由对等层封装的“信封”。而对于被封装在“信封”内部的数据仅仅是拆封后将其提交给上层,本层不做任何处理。

 

1.3 TCP/IP模型

·TCP/IP起源于美国国防部高级研究规划署(DARPA)的一项研究计划——实现若干台主机的相互通信。

·现在TCP/IP已成为Internet上的通信的工业标准。

·TCP/IP模型包括4个层次:

  应用层

  传输层

  网络层

  网络接口

 

1.3.1 TCP/IP与OSI参考模型的对应关系

物理层、数据链路层对应网络接口层;网络层对应网络层;传输层对应传输层;会话层、表示层和应用层对应应用层。

1.3.2 端口

·按照OSI七层模型的描述,传输层提供进程(应用程序)通信的能力。为了标识通信实体中进行通信的进程(应用程序),TCP/IP协议提出了协议端口(protocol port,简称端口)的概念。

·端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都通过该端口输出。

·端口用一个整数型标识符来表示,即端口号。端口号跟协议相关,TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立。

·端口使用一个16位的数字来表示,它的范围是0-65535,1024以下端口号保留给预定的服务。例如:http使用80端口。在编写网络应用程序时,为应用程序指定端口号时,应使用1024以上的符号

1.3.2 套接字(socket)的引入

·为了能够方便地开发网络应用软件,由美国伯克利大学在Unix上推出了一种应用程序访问通信协议的操作系统调用socket(套接字)。socket的出现,使程序员可以很方便地访问TCP/IP,从而开发各种网络应用的程序。

·随着Unix的应用推广,套接字在编写网络应用软件中得到了极大的普及。后来,套接字又被引进了Windows等操作系统,成为开发网络应用程序的非常有效快捷的工具。

·套接字存在于通信区域中。通信区域也叫地址族,它是一具抽象概念,主要用于将通过套接字的进程的共有特性综合在一起。套接字通常只有与同一区域的套接字交换数据(也有可能跨区域通信,但这只在执行了某种转换进程后才能实现)。Windows Sockets只支持一个通信区域:网际域(AF_INET),这个域被使用网际协议簇通信的进程使用。

1.3.3 网络字节顺序

不同的计算机存放多字节值的顺序不同,有的机器在起始地址放低位字节(低位先存),有的机器在起始地址存放高位字节(高位先存)。基于Intel的CPU,即我们常用的PC机采用的是低位先存。为保证数据的正确性,在网络协议中需要指定网络字节顺序。TCP/IP协议使用16位整数和32位整数的高位优先存格式。

1.3.4 客户机/服务器模式

·在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户机/服务器模式(client/server),即客户向服务器提出请求,服务器接收到请求后,提供相应的服务。

·客户机/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是基于客户机/服务器模式的TCP/IP。

·客户机/服务器模式在操作过程中采取的是主动请求的方式。

  首先服务器方先启动,并根据请求提供相应的服务:

  ①打开一个通信通道并告知本地主机,它愿意在某一地址和端口上接收客户请求。

  ②等客户请求到达该端口。

  ③接收到重复服务请求,处理该请求并发送应答信号。接收到并发服务请求,要激活一个新的进程(或线程)来处理这个客户请求。新进程(或线程)处理此客户请求,并不需要对其它请求作出应答,服务完成后,关闭此新进程与客户的通信链路,并终止。

  ④返回第二步,等待另一客户请求。

  ⑤关闭服务器。

客户方:

  ①打开一个通信通道,并连接到服务器所在的主机的特定端口。

  ②向服务器发服务请求报文,等待并接收应答;继续提出请求。

  ③请求结束后关闭通信通道并终止。

1.4 Sockets套接字

1.4.1 Windows Sockets的实现

·Windows Sockets是Microsoft Windows的网络程序设计接口,它是从Berkeley Sockets扩展而来的,以动态链接库的形式提供给我们使用。Windows Sockets在继承了Berkeley Sockets主要特征的基础上,又对它进行了重要扩充。这些扩充主要是提供了一些异步函数,并增加了符合Windows消息驱动特性的网络事件异步选择机制。

·Windows Sockets 1.1和Berkeley Sockets都是基于TCP/IP协议的;Windows Sockets 2从Windows Sockets 1.1发展而来与协议无关并向下兼容,可以使用任何底层传输协议提供的通信能力,来为上层应用程序完成网络数据通讯,而不关心底层网络链路的通讯情况,真正实现了底层网络通讯对应用程序的透明。

1.4.2 套接字的类型

·流式套接字(SOCK_STREAM)

  提供面向连接、可靠的数据传输服务,数据无差错、无重复的发送,且按发送顺序接收。基于TCP实现。

·数据报式套接字(SOCK_DGRAM)

  提供无连接服务。数据包以独立包形式发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。基于UDP实现。

·原始套接字(SOCK_RAW)。

 

1.4.3 基于TCP(面向连接)的Socket编程

注意到在客户端不需要调用bind函数,因为在服务器端需要接收客户端的请求,所以告知本地主机等待客户请求的IP地址和端口地址。对于客户端而言,其发起连接,在服务端接受连接时,已经保存了客户端的IP地址和端口信息。对于服务端而言,一旦连接建立,服务端便可获知客户端的信息。

 

1.4.4 基于UDP(面向无连接)的Socket编程

基于UDP的套接字编程,“服务端”与“客户端”的属性不是很明显。虽然基于UDP的套接字编程不需要建立连接,但接收端要完成通信需要先启动,以接收客户端发送的数据。需要告知客户端自己在何处(哪个IP和哪个端口)等数据。

套接字是通信的端点,利用套接字进行通信,类似于使用电话进行通信。套接字类似于电话机,IP地址类似于总机号码,端口号类似于分机号。

 

posted @ 2014-11-07 21:46  calkevin  阅读(303)  评论(0)    收藏  举报