网络编程(一)

前言

什么是网络编程?

1、宏观上,比较笼统的定义:

百度百科:

网络编程从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用。

网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。

中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理,网页设计、开发工具、服务器架设、

代码、数据库这5部分你都要接触。

比较官方,难以理解。

涉及的方面:前端编程,后端代码开发、数据包(数据传输的方式,以约定好的协议进行打包、解压数据)、协议(TCP/IP协议);至于数据如何在网线等物理组件或无线网络中传播,就更不是我需要明白的了。所有的这一切都是为实现数据传输服务的。

以我的理解,之所以有网络编程,是互联网的产生,催生了网络编程。如果机器(一台主机)只是自己工作(就好比是单机游戏),不需要与外界的机器进行数据交互,网络编程自然也就不会出现。不同的机器需要进行数据交互,只有约定好数据传输的格式,双方才能听得懂。而作为一名程序开发人员,我需要知道的阶段就是应用层的信息交互如何实现。

2、微观上,来说下自己查阅资料及自己的理解:

网络编程的本质是实现两个设备之间的数据交换。

当然,在计算机网络中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据,难的是在庞杂的设备中,如何以一种大家都遵守的约定,来安全的传输数据(TCP/IP协议,当然这都不需要我们关心,已经有大佬约定好了,基本上程序员都只需要会用就可以)。

现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。

在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(Client),等待其他程序连接的程序被称作服务器(Server)。客户端程序可以在需要的时候启动,而服务器为了能够时刻相应连接,则需要一直启动。例如以打电话为例,首先拨号的人类似于客户端,接听电话的人必须保持电话畅通类似于服务器。连接一旦建立以后,就客户端和服务器端就可以进行数据传递了,而且两者的身份是等价的。

网络编程就是使用IP地址或域名,和端口连接到另一台计算机上对应的程序,按照规定的协议(数据格式)来交换数据,实际编程中建立连接、发送、接收数据在语言级已经实现,做的更多的工作是设计协议,以及编写生成和解析数据的代码罢了,然后把数据转换成逻辑的结构显示或控制逻辑即可。

上述只是说明了一件事:网络编程是用来进行数据交换的。

上述都是对门外汉解释,都能听懂的,下面进入java开发且切实用到的正题。

一、概念

1、涉及到网络上信息的传输,平常所写的项目中,都可以说是网络编程。

2、网络编程就是利用一门编程语言结合相应的网络接口(如在Windows或XP环境下, 利用C++语言,根据Microsoft提供的Winsock2网络编程接口,编写相关的网络程序), 进行编写关于网络方面(互联网上的数据交互)的程序,这个过程就叫做网络编程。

二、三要素

知道了什么是网路编程,那么怎么实现网络编程?这才是要掌握的重点。

三要素:IP,端口号,协议。

1、IP地址和域名

  在现实生活中,如果要打电话则需要知道对应人的电话号码,如果要寄信则需要知道收信人的地址。在网络中也是这样,需要知道一个设备的位置,则需要使用该设备的IP地址,具体的连接过程由硬件实现,程序员不需要过多的关心。

  IP地址是一个规定,现在使用的是IPv4,既由4个0-255之间的数字组成,在计算机内部存储时只需要4个字节即可。在计算机中,IP地址是分配给网卡的,每个网卡有一个唯一的IP地址,如果一个计算机有多个网卡,则该台计算机则拥有多个不同的IP地址,在同一个网络内部,IP地址不能相同。IP地址的概念类似于电话号码、身份证这样的概念。

  由于IP地址不方便记忆,所以有专门创造了域名(Domain Name)的概念,其实就是给IP取一个字符的名字,例如163.com、sina.com等。IP和域名之间存在一定的对应关系。如果把IP地址类比成身份证号的话,那么域名就是你的姓名。

  其实在网络中只能使用IP地址进行数据传输,所以在传输以前,需要把域名转换为IP,这个由称作DNS的服务器专门来完成。

  所以在网络编程中,可以使用IP或域名来标识网络上的一台设备。

2、端口的概念

  为了在一台设备上可以运行多个程序,人为的设计了端口(Port)的概念,类似的例子是公司内部的分机号码。

  规定一个设备有2的16次方个,也就是65536个端口,每个端口对应一个唯一的程序。每个网络程序,无论是客户端还是服务器端,都对应一个或多个特定的端口号。由于0-1024之间多被操作系统占用,所以实际编程时一般采用1024以后的端口号。

  使用端口号,可以找到一台设备上唯一的一个程序。

  所以如果需要和某台计算机建立连接的话,只需要知道IP地址或域名即可,但是如果想和该台计算机上的某个程序交换数据的话,还必须知道该程序使用的端口号。

3、协议的概念

  协议(Protocol)是网络编程中一个非常重要的概念,指的是传输数据的格式。因为大家在网络中需要传输各种各样的信息,在程序中获得到的都是一组数值,如何阅读这些数值呢,就需要提前规定好这组数据的格式,在客户端按照该格式生成发送数据,服务器端按照该格式阅读该数据,然后在按照一定的格式生成数据反馈给客户端,客户端再按照该格式阅读数据。现实中类似的例子就是电报编码,每个数字都是用特定的数据表达。

  一般程序的协议都分成客户端发送的数据格式,以及服务器端反馈的数据格式,客户端和服务器端都遵循该格式生成或处理数据,实现两者之间的复杂数据交换。

4、小结

理解了网络编程的概念及宏观的实现原理,需要掌握的是:

  • TCP/IP协议的简单工作原理
  • 在开发中怎么使用

下面对网络编程中的数据传输协议和java开发中如何使用做详细说明。

三、TCP/IP协议

TCP/IP模型是一系列网络协议的总称,这些协议的目的,就是使计算机之间可以进行信息交换。所谓“协议”可以理解成机器之间交谈的语言,每一种协议都有自己的目的。TCP/IP模型一共包括几百种协议,对互联网上交换信息的各个方面都做了规定。

这些协议可以大致分成四个层次,上一层的协议都以下一层的协议为基础,从上到下的四层,应用层(Application Layer)、传输层(Transport Layer)、网络层(Internet Layer)、网络接口层(Link Layer)。

可以这样理解它们的作用:

1)应用层负责传送各种最终形态的数据,是直接与用户打交道的层,典型协议是HTTP、FTP等;

2)传输层负责传送文本数据,主要协议是TCP协议;

3)网络层负责分配地址和传送二进制数据,主要协议是IP协议;

4)网络接口层负责建立电路连接,是整个网络的物理基础,典型的协议包括以太网、ADSL等等;

现在通用的就是CP/IP四层结构的协议。

1、TCP/IP模型:

【1】应用层:http协议

【2】传输层:TCP协议,UDP协议

【3】网络层:IP协议

【4】链路层:PPP协议

2、OSI模型:

【1】应用层

【2】表示层

【3】会话层

【4】传输层

【5】网络层

【6】数据链路层

【7】物理层

3、OSI七层模型和TCP/IP四层模型详解

OSI七层模型:

①物理层:

包括物理传输介质,任何网络都必须使用传输介质来发送和接收信号,这些信号构成了网络通信的物理表示。物理层的任务就是建立、维持和断开网络连接。发送方发起一个通过网络介质传输数据的连接,接收方响应建立连接的请求,接收或拒绝连接请求。物理层一个简单概貌就是,它关注网络硬件以及支持硬件访问某种网络介质的连接。

物理层管理网络介质到协议栈的通信,把计算机的出栈数据转换为网络所用的信号,对于入栈消息来说,把来自网络介质的信号转换为计算机网卡接受的比特位。

物理层的PDU成为比特位。

②数据链路层:

它的任务是,确保在发送方实现物理层数据的可靠传输,在接收方检验所收到数据的可靠性,数据链路层也管理跨网络介质的、从一台计算机到另一台计算机上、在单个逻辑或物理电缆段上的点对点传输。它通过唯一标识每一块网卡的专用地址,识别本地介质上的每个设备。由于数据链路层管理网卡之间的点对点通信,所以,它也处理这些网卡所插入的计算机之间的局域网连接。同时,它也处理从发送方到接收方的数据串行化,原因在于,比特位必须映射为相应的信号,一边从发送方传输到接收方,而在接收方执相反的过程。

数据链路层还能控制从发送方到接收方数据传输的节奏----这个过程称为介质流控制,当发生本地阻塞时进行响应,避免网络介质被数据流淹没,当出栈PDU可以传输时,数据链路层请求开始传输数据,并处理接收和构造入栈数据的入栈PDU。

数据链路层的PDU成为帧或数据帧。

eg: ATM  FDDI....

③网络层

处理网络位置标记的地方,也是处理PDU从发送方发往接收方所蕴含的复杂性的地方。所以,网络层处理网络上与每个机器相关的逻辑寻址问题。当数据流的源地址和目标地址不在网络上的同一个物理段时,网络层也使用寻址信息来确定如何把PDU从发送方传递到接收方。网络层的主要功能是对Internet上的每一台主机提供一个全球唯一的地址,并提供主机之间的通信路径。

网络层也具体化了不同IP地址之间多个并发连接的表示方法,因此,多个应用程序能够同时保持网络连接。网络层能够识别一个网络连接属于计算机上的哪一个进程或应用程序,不仅可以把数据流从发送方正确的传递到接收方,还可以把能够入栈的数据传递给接收方计算机上的特定进程或应用程序。

使用一个或多个路由,把单个PDU从发送方转发或中继给接收方的技术成为分组交换,这也正是网络层以每个PDU为基础进行转发和中继的原因。事实上,网络层对于与路由相关的延迟也是敏感的,在从发送方往接收方转发数据的同时,能够管理通过这些路由的数据流,这个过程称为阻塞控制,它用于当网络上发生大量活动时避免过载。

网络层的PDU成为数据包。

eg: IP  IPX.....

④传输层:

它的任务就是确保从发送方到接收方PUD可靠的端到端传输,所以,传输层通常包含了端到端的错误检测和错误恢复数据。这些数据通常作为传输层PDU尾部的一部分进行打包,在数据传输之前和传输之后计算一个成为校验和的特殊值,之后进行对比,如果发送的校验和与本地计算的校验和一致,那么可以认为成功传输,否则,当检测到错误时,传输层的某个协议将请求PDU重新传输。

从发送方到接收方可以发送的数据量在长度上不受限制,但是,从端到端能够传输数据的容器具有固定的最大长度(最大传输单元),因此,传输层也必须处理分段和重组操作。分段就是把很长的消息分为一连串的数据块,称为数据段,其中每一个数据块都表示为在发送方与接收方之间网络介质能够传送的最大数据载荷。重组就是将发送的数据块按照其原始顺序重新组织在一起,把传输的消息构成分段前的样子。

传输层具有在重组过程中请求重传所有出错PDU或丢失PDU的功能,实现可靠传递,传输层的PDU称为分段或数据段。

eg: TCP  UDP....

⑤会话层:

是在发送方和接收方之间进行通信时创建、维持、之后终止或断开连接的地方,所以,会话层允许发送方和接收方启动或停止请求回话,以及当双方之间发生拥塞时仍然能保持对话。会话层包含了一种称为检查点的机制来维持可靠会话。

检查点定义了一个最接近成功通信的点,并且定义了当发生内容丢失或损坏时需要回滚以便恢复丢失或损坏数据的点。同样,会话层还定义了当会话出现不同步时,需要重新同步化的机制。

会话层的主要任务是负责两个网络参与者之间进行的通信,这两者在通信过程中通常交换一些列的消息或PDU。会话层的PDU有各种类型,统称为会话PDU或SPDU。

eg: RPC  SQL....

⑥表示层:

管理在网络上(从其往下到协议栈)以及在特定机器或应用程序上(从其往上到协议栈)的数据的表示方式。这使得完全不同类型的计算机(它们可能是用不同的方式表示数值和字符)能够跨网络进行相互通信。

在表示层还有一种特殊的操作系统驱动程序,有的称为重定向器,有的称为网络外壳,不管是什么,它的作用就是把对网络资源的请求和对本地资源的请求区分开来,并把这样的请求重定向到恰当的本地子系统或远程子系统上。这样,计算机无需辨别要访问资源的类型,就能够使用单个子系统访问各种资源,不管这些资源是在本地计算机上还是在跨网络的远程计算机上。

表示层也能够为应用程序提供特殊的数据处理工能,包括协议转换、数据加密、解密、数据压缩或解压缩。对于这类型的服务,无论发送方的表示层做了什么,接收方的表示层都必须予以复原,从而使连接的双方在某个时刻分享相似的数据视图。表示层的PDU也有各种类型,统称为PDU。

eg: 加密  SACll.....

⑦应用层:

应用层定义的是应用程序用于请求网络服务的接口,而不是直接指向应用程序本身。因此,应用层主要定义了应用程序能够从网络上请求使用的几种类型的服务,并且规定了从应用程序接收消息或向应用程序发送消息时,数据所必须采用的格式。应用层的PDU也统称为PDU。

eg: HTTP FTP SNMP.....

TCP/IP四层模型

①网络接口层:

它负责监视数据在主机和网络之间的交换。事实上,TCP/IP本身并未定义该层的协议,而由参与互连的各网络使用自己的物理层和数据链路层协议,然后与TCP/IP的网络接入层进行连接。

网络接口层最重要的协议是PPP协议(点对点协议),PPP用于在两个网络设备之间创建一个直接的连接。PPP可以提供连接认证以识别双方的身份,应用加密技术进行传输以实现保密,应用压缩技术以减少传输的数据量(在接收端都必须进行解码和解压缩),PPP只提供检错而不纠错。

②互联网层:TCP/IP互联网层协议处理跨越多个网络的机器之间的路由问题,它也管理网络名称和地址,以利于解决路由问题。更具体地说,互联网层处理TCP/IP有以下三个基本任务:

(1)MTU分块:当路由将数据从一种类型的网络运送到另一种类型的网络时,网络能够承载的最大数据块(MTU)就可能发生变化,当数据从支持较大MTU的介质移动到支持较小MTU的介质时,这一数据就必须被缩小,以便匹配这个较小的MTU。这个任务仅仅需要一次单向转换,但它必须在数据传输的过程中完成。

(2)寻址:寻址定义了一种机制,即TCP/IP网络中的所有网卡都必须与标识没一个网卡的专用的、唯一的比特位模式相对应,这个比特位模式也标识了网卡所属的网络。

(3)路由:路由定义了将数据从发送方转发给接收方的机制,在从发送方到接收方的转发过程中,可能需要数个中间中继过程。这一功能不仅包含在成功传递的过程中,而且还提供了跟踪传递性能的方法,以及在发生传递失效时报告错误的方法,否则就会发生障碍

互联网层的协议:IP ICMP ARPRARP RIP OSPF BGP...

 IP协议是将多个包交换网络连接起来,它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。

IP不提供可靠的传输服务,它不提供端到端的或(路由)结点到(路由)结点的确认,对数据没有差错控制,它只使用报头的校验码,它不提供重发和流量控制。如果出错可以通过ICMP报告,ICMP在IP模块中实现。

③传输层:这一层提供了从一台主机到另一台主机的数据移动。传输层协议提供的基本功能包括从发送方到接收方数据的可靠传输,还提供传输前必要的出战消息分段,以及在把数据交付给应用层之前重组分段的功能。

传输层的协议:TCP  UDP

④应用层:对应于OSI参考模型的高层,为用户提供所需要的各种服务,例如:FTP、Telnet、DNS、SMTP等

模型比较:

相同点:

(1)OSI参考模型和TCP/IP参考模型都采用了层次结构的概念;(2)都能够提供面向连接和无连接两种通信服务机制;

不同点:

(1)前者是七层模型,后者是四层结构;

(2)对可靠性要求不同(后者更高);

(3) OSI模型是在协议开发前设计的, 具有通用性.TCP/IP是先有协议集然后建立模型, 不适用于非TCP/IP网络;

(4)实际市场应用不同(OSI模型只是理论上的模型,并没有成熟的产品,而TCP/IP已经成为“实际上的国际标准”)。

详见链接:https://www.cnblogs.com/vole/p/12118767.html

四、分层与分类

1、分类

传输层以下的编程技术,一般来说是用汇编、C语言这一类与底层结合很紧密的编程语言。比如,基本的路由器编程、网络层数据交换技术编程等。

传输层以上的编程技术,基本是在应用级别,几乎可以使用现代所有高级编程语言和高级编程脚本中涉及网络通信的部分来实现。

从机制上来说,可以分为socket编程、XML-RPC编程、REST编程等;

从架构上来说,可以分为BS(Browser/Server)编程、CS(Client/Server)编程等。

各种编程语言对这些分类几乎都是支持的。但是不同的编程语言在不同的方面有自己的优势,比如C语言在Socket编程上有最直接的实现;Java和.NET等对XML-RPC编程封装的很好;PHP、Python、Perl等高级脚本语言在实现REST编程上较为简便;HTML/CSS/Javascript的组合是Browser端编程最常用的方式等。

C/S模式和B/S各有其有点也各有其缺点,B/S模式在开发中需要考虑数据如何从客户端提交到服务器端,数据又如何返回到客户端,这些是B/S模式所特有的。

五、Socket

1、详细定义参看链接:

https://www.cnblogs.com/vole/p/12119718.html;从广义上介绍了Socket。本文只说TCP/IP协议中对socket应用。

实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、listen、connect、accept、send、read和write等等。

2、概念

      套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。就相当于电话机,是客户端与服务器建立连接用的。

      应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。(有IP与端口)

3、建立socket连接

 建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。

 套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

 服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

 客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

 连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户 端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。

六、BS编程与CS编程(与Socket相关)

C/S架构中,是需要安装客户端的,必要得到一对对客户与服务器端的socket连接。而B/S架构,基于浏览器访问,通过放松请求来访问服务器。遵从http协议,有页面,中间层和数据访问层。

C/S架构与B/S架构都是通过socket来建立客户端与服务器端的连接,但是,在C/S架构中,没有封装。通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势。是两层架构。客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据;另一种是Socket服务器端,服务器端的程序通过Socket与客户端的程序通信。

B/S架构中把socket对象封装了,通过请求来访问服务器,是三层架构。相对于二层体系结构(Client/Server构架)是由逻辑上相互分离的表示层、业务层和数据层构成。表示层向客户提供数据,业务层实施业务和数据规则,数据层定义数据访问标准。三层体系结构中的核心是组件对象模型。

在网络连接模式中,除对等网外,还有另一种形式的网络,即服务器/客户机网,Client/Server。在客户机/服务器网络中,服务器是网络的核心,而客户机是网络的基础,客户机依靠服务器获得所需要的网络资源,而服务器为客户机提供网络必须的资源。

B/S架构基于Http协议来进行数据的交互,而Http协议是无信任的短链接,建立连接,传输数据,断开连接,这种做法极大的提高了网络的服务效率,通常情况下,一次请求就完成了一次数据交互,对应一个业务逻辑,然后连接就断开了。这样,就能服务更多的用户,不至于请求响应等待太多时间。基于以上,互联网的架构就要满足支持海量用户的请求以及快速响应,所以互联网的架构很复杂。

B/S架构(b/s结构)即浏览器和服务器结构,是随着Internet技术的发展,对C/S结构进行改进的一种网络结构模式。WEB浏览器是客户端安装的应用软件,而服务器是安装了一些处理数据或具有某些功能的服务应用程序的计算机。B/S架构统一了客户端,将要处理数据的任务和功能集中到服务器端,简化了系统的开发、维护以及使用。我们只要在客户机上安装一个浏览器,就可以轻松的与服务器进行数据交互。B/S架构需要web服务器。通过浏览器解析等,与服务器建立连接。然后通过发送请求,与服务器进行数据的交互。

B/S架构(运行在web服务器上,学的是tomcat服务器),通过web服务器,将socket(即客户端与服务器的连接)封装了,客户端(浏览器)通过发送请求和后台(服务器)进行数据的交流,而浏览器作为客户端,遵循的是http协议。

B/S是不直接使用socket对象的,我们的servlet所跑的web服务器(servlet是运行在web服务器(容器)上的)对客户端与服务器端的连接进行了封装,在C/S的基础上,建立了统一的客户端--->浏览器,我们通过发送请求,来与服务器进行数据的交互,而大量的处理都是在服务器进行的,大大减少了对客户端的操作。

七、应用

进行数据的交互,正式用到了这一块的东西。有两种方式:

系统间:HttpClient与Scoket。

程序内部B/S。Http协议。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值