网络编程概念全面接触(一)
从最基本的概念层层入手,才能全面了解网络的本质性。
1.计算机网络
将地理位置不同、并具有独立功能的多个计算机系统通过通信设备和线路连接起来,以功能完善的网络软件实现网络中资源共享的系统,称为计算机网络。计算机网络是通信技术与计算机技术相结合的产物。
2.因特网(Internet)
因特网又称国际互联网,是一个由各种不同类型和规模的独立运行和管理的计算机网络组成的世界范围的计算机网络。是一个全球的、开放的信息资源网。因特网只是一个极为庞大而又复杂的计算机网络。
因特网有三个基本要素:TCP/IP(传输控制协议/网际协议),DN(域名)和IP地址,URL(统一资源定位器)。
3.网络协议
网络协议即网络中(包括互联网)传递、管理信息的一些规范。如同人与人之间相互交流是需要遵循一定的规矩一样,计算机之间的相互通信需要共同遵守一定的规则,这些规则就称为网络协议。是计算机通过网络彼此交流的一种“语言”。不同计算机之间必须使用相同的网络协议才能进行通信。网络上的计算机要互相通信,必须遵循一定的协议。常见的网络协议有TCP/IP,IPX/SPX和NETBEUI。目前使用最广泛的网络协议是Internet的TCP/IP协议。
4.IP地址
IP是Internet Protocol的缩写,即互联网协议。为了能在网络上准确地找到一台计算机,TCP/IP协议为每个连到Internet上的计算机分配了一个惟一的用32位二进制数字表示的地址的字,就是我们常说的IP地址。Internet上的每台主机(Host)都有一个唯一的IP地址,这是Internet能够运行的基础。
Internet依靠TCP/IP协议,在全球范围内实现不同硬件结构、不同操作系统、不同网络系统的互联。在Internet上,每一个节点都依靠唯一的IP地址互相区分和相互联系。
5.域名(DN)
域名的英文为Domain Name,便于记忆的IP地址别号,也相当于一个企业或机构在互联网上主机的一个代号。域名的形式是以若干个英文字母和数字组成,由“.”分隔成几份。如:www.sohu.com.cn
6.URL(统一资源定位器)
URL是Uniform Resource Locator的缩写,即统一资源定位系统,也就是我们通常所说的网址。URL是在Internet的WWW服务程序上用于指定信息位置的表示方法,它指定了如HTTP或FTP等Internet协议,是惟一能够识别Internet上具体的计算机、目录或文件位置的命名约定。
例如,某一论坛的网址,也就是URL为:http://www.test.com/bbs
7.网络编程
网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。
目前较为流行的网络编程模型是客户机/服务器(C/S)结构。即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。
在Internet上IP地址和主机名是一一对应的,通过域名解析可以由主机名得到机器的IP,由于机器名更接近自然语言,容易记忆,所以使用比IP地址广泛,但是对机器而言只有IP地址才是有效的标识符。
通常一台主机上总是有很多个进程需要网络资源进行网络通讯。网络通讯的对象准确的讲不是主机,而应该是主机中运行的进程。这时候光有主机名或IP地址来标识这么多个进程显然是不够的。端口号就是为了在一台主机上提供更多的网络资源而采取得一种手段,也是TCP层提供的一种机制。只有通过主机名或IP地址和端口号的组合才能唯一的确定网络通讯中的对象:进程。
8.套接字
所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
套接字可以根据通信性质分类,这种性质对于用户是可见的。应用程序一般仅在同一类的套接字间进行通信。不过只要底层的通信协议允许,不同类型的套接字间也照样可以通信。套接字有两种不同的类型:流套接字和数据报套接字。
套接字是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。可以将套接字看作不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。套接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。
9.套接字工作原理
要通过互联网进行通信,你至少需要一对套接字,其中一个运行于客户机端,我们称之为ClientSocket,另一个运行于服务器端,我们称之为ServerSocket。
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
所谓服务器监听,是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
所谓客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
网络编程概念全面接触(二)
网络编程通常被称为Socket编程,在《网络编程概念全面接触一》一文中已经做了比较详细的解释。这里就涉及的相关传输技术做实际的分析。
一、Socket的两种类型
套接字的两种类型:一种采用"Stream Sockets"(流格式),另一种为"Datagram Sockets"(数据报格式)。
数据报格式又称为无连接套接字,相反流格式肯定是有连接了。这是跟两种类型采用的传输协议有关。"Stream Sockets"(流格式)基于TCP协议,"Datagram Sockets"(数据报格式)基于UDP协议。
对比上UDP与TCP协议的区别,就可以明确Socket的两种类型的含义了。
二、TCP与UDP
TCP 传输控制协议 Transfer Control Protocal
UDP 用户数据报协议 User Datagram Protocol
TCP与UDP的区别:
TCP UDP
基于连接 基于无连接
系统资源的要求多 系统资源的要求少
数据包结构复杂 数据包结构简单
保证数据正确性 可能丢包
保证数据顺序 不保证
通信效率相对低 通信效率较高
可见TCP保证数据能可靠并且按顺序到达,是完全可靠的连接传输,然而资源要求也比较多,结构也比较复杂。TCP首先需要在传输方的两端建立一可靠的连接(通过信号的三次握手,详细可参考TCP相关资料),然后通过数据包的各项校验确保数据完全正确。UDP设计初衷就是尽可能快的将数据包发送出去。所以UDP协议显得非常精简。你只要建立一个包,构造一个有目标信息的IP头,然后发出去。无需连接。当然UDP也需要通过对方返回“命令正确应答”也叫“ACK”包,来避免数据包丢失。假使一定时间内,发送方没有收到接收方的应答,则重新发送
数据包,直到收到"ACK"确认包。
比如聊天室用TCP协议来传送文字、控制信息、画板和屏幕广播数据,用UDP协议来传送语音和视频流。
三、数据包在网络上的传输
著名的网络七层模型OSI/RM相信很多人都知道。
应用层 (Application)
表示层 (Presentation)
会话层 (Session)
传输层(Transport)
网络层(Network)
数据链路层(Data Link)
物理层(Physical)
TCP/IP四层模型
应用层(Application Layer) (TFTP,FTP,TELNET)
传输层(Host-to-Host Transport Layer) (TCP, UDP)
网络层(Internet Layer) (IP和路由)
网络接口层(Network Access Layer) (网络层,数据链路层和物理层)
模型的核心思想就是层层封装,工作独立化,即做应用层不必关于下面是如何工作的。发送数据包从顶层一步步封装,依次加入传输层的报头(TCP,UDP),再加入IP报头,只到物理层,接收方再依次从物理层开始相反方向解开数据包,直到分析出应用层数据。
例:TFTP的一个包,先是被第一个协议(在这里是TFTP)在它的报头(也许是报尾)包装(“封装”),然后,整个数据(包括TFTP头)被另外一个协议(在这里是UDP)封装,然后下一个(IP),一直重复下去,直到硬件(物理)层(这里是以太网)。
当另外一台机器接收到包,硬件先剥去以太网头,内核剥去IP和UDP 头,TFTP程序再剥去TFTP头,最后得到数据。