计算机网络总结

51 篇文章 1 订阅

1计算机网络协议分层体系结构

 

网络层次

当然比较常用的是TCP/IP五层协议。

 

2封装

封装

上图显示了这样一条物理路径:数据从发送端系统的协议栈向下,经过链路层交换机和路由器的协议栈,进而向上到达接收端系统的协议栈。

我们需要知道的是,路由器和链路层交换机都是分组交换机,它们不实现协议栈中的所有层次,链路层交换机实现了第一层和第二层;路由器实现了第一层到第三层。这意味着,路由器能够实现IP协议(即第三层协议),而链路层交换机则不能,于是链路层交换机不能识别IP地址,但是能够识别第二层地址,比如MAC地址。

但是,因特网中的所有主机都实现了所有5个层次的协议。


上图的过程也说明了一个重要的概念:封装

在发送主机端,一个应用层报文被传送给传输层。传输层收到报文之后,在报文上附上附加信息,即所谓的传输层首部信息,该首部信息将被接收端的传输层使用。应用层报文和传输层首部信息一起构成了传输层报文段,传输层报文段因此封装了应用层报文。

传输层则向网络层传递该报文段,网络层增加了网络层首部信息,比如源和目的端系统的地址等,由此产生了网络层数据报

该数据报接下来被传递给链路层,链路层增加它自己的链路层首部信息,创建了链路层帧

所以,我们看到在每一层,一个分组都具有两种类型的字段:首部字段和有效载荷字段。而有效载荷即来自于上一层的分组。

其实说白了,发送端就是对应用层数据一层一层加头的过程,到接收端后,接收端再一层一层去掉头部信息,然后交给对应的应用程序

 

3 协议层从底层至顶层的模型图:

4 协议分层体系结构的发展

(1) 起初在ARPANET设计时即提出了分层的方法。“分层”可将庞大而复杂的问题,转化为若干较小的局部问题,而这些较小的局部问题就比较易于研究和处理。

(2) 1974年,IBM公司宣布了它研制的SNA (System Network Architecture)。这个著名的网络标准就是按照分层的方法制定的。不久后,其他一些公司也相继推出本公司的一套体系结构,并都采用不同的名称。

(3) 国际标准化组织ISO于1977年成立了专门机构研究该问题。不久,他们就提出一个试图使各种计算机在世界范围内互连成网的标准框架,即著名的开放系统互连基本参考模型OSI/RM (Open Systems Interconnection Reference Model),简称为OSI。在1983年形成了开放系统互联基本参考模型的正式文件,即著名的ISO 7498国际标准。

(4) 20世纪90年代初期,虽然整套的OSI国际标准都已经制定出来了,但由于因特网已抢先在全世界覆盖了相当大的范围,而与此同时却几乎找不到有什么厂家生产出符合OSI标准的商用产品。现今规模最大的、覆盖全世界的计算机网络因特网并未使用OSI标准,而是非国际标准TCP/IP。这样,TCP/IP就是事实上的国际标准。

5 协议分层体系结构的总结

1、为什么对协议体系结构进行分层

主要是对复杂的计算机网络进行分开管理,各层实现相应的功能,相当于模块式设计,便于添加和增减。
分层的理由:1)通过将网络的通信过程划分为小一些、简单的部件,有助于各个部件的开发、设计和故障排除;2)通过网络组件的标准化,允许多个供应商进行开发;3)通过定义在模型的每一层实现什么功能,鼓励产业的标准化;4)允许各种类型的网络硬件和软件互相通信;5)防止对某一层所做的改动影响到其他的层,这样就有利于开发。

2、协议体系结构的具体分层

本节主要来对OSI分层体系进行分析:

1)物理层


简介:在OSI参考模型中,物理层是参考模型的最低层,也是OSI模型的第一层。
物理层的主要功能是:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。
物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异完成串行数据的转换,即逐个比特按时间顺序传输,使其上面的数据链路层不必考虑网络的具体传输介质是什么“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。

设备: 1调制调解器(ADSL ,猫)

调制调解器(ADSL ,猫)属于这层,完成数据信号和模拟信号之间的转换。ADSL调制解调器,为ADSL(非对称用户数字环路)提供调制数据和解调数据的机器。

设备: 2 集线器:

集线器的英文称为“Hub”。“Hub”是“中心”的意思,集线器的主要功能是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。它工作于OSI(开放系统互联参考模型)参考模型第一层,即“物理层集线器与网卡网线等传输介质一样,属于局域网中的基础设备,采用CSMA/CD(即带冲突检测的载波监听多路访问技术)介质访问控制机制。集线器每个接口简单的收发比特,收到1就转发1,收到0就转发0,不进行碰撞检测。

集线器(hub)属于纯硬件网络底层设备,基本上不具有类似于交换机的"智能记忆"能力和"学习"能力。它也不具备交换机所具有的MAC地址表,所以它发送数据时都是没有针对性的,而是采用广播方式发送。也就是说当它要向某节点发送数据时,不是直接把数据发送到目的节点,而是把数据包发送到与集线器相连的所有节点,如图所示,简单明了。 [1] 

HUB是一个多端口转发器,当以HUB为中心设备时,网络中某条线路产生了故障,并不影响其它线路的工作。所以HUB在局域网中得到了广泛的应用。大多数的时候它用在星型与树型网络拓扑结构中,以RJ45接口与各主机相连(也有BNC接口),HUB按照不同的说法有很多种类。

 以太网采用心形拓扑,在心型中增加了一种可靠性非常高的设备,叫做集线器,使用集线器的以太网逻辑上仍是一个总线网,各站中的适配器执行SCMA/CD协议,集线器工作在物理层,他的每次接口仅仅转发比特,收到1就发1,0就发0,一般有少量的容错能力,和网络管理能力。

局域网中,硬件地址,又成为物理地址,MAC地址,在局域网中规定了一种固化在适配器中的48位全球地址,是局域网中每一台固化在适配器中的ROM中的地址

2)数据链路层

简介:数据链路层(Data Link Layer)是OSI模型的第二层,负责建立和管理节点间的链路。该层的主要功能是:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。
在计算机网络中由于各种干扰的存在,物理链路是不可靠的。因此,这一层的主要功能是在物理层提供的比特流的基础上,通过差错控制、流量控制方法,使有差错的物理线路变为无差错的数据链路,即提供可靠的通过物理介质传输数据的方法。
该层通常又被分为介质访问控制(MAC)逻辑链路控制(LLC)两个子层。
MAC子层的主要任务是解决共享型网络中多用户对信道竞争的问题,完成网络介质的访问控制;
LLC子层的主要任务是建立和维护网络连接,执行差错校验、流量控制和链路控制。
数据链路层的具体工作是接收来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层;并且,还负责处理接收端发回的确认帧的信息,以便提供可靠的数据传输。 链路是指,从一个几点到另一个节点的物理线路,把实现协议(点对点PPP协议)的硬件和软件放到链路上,构成了数据链路,

该层设备: 1 网路适配器来(网卡)

通过网路适配器来(网卡)实现这些协议,一般适配器都包括链路层和物理层

网络适配器又称网卡网络接口卡(NIC),英文名NetworkInterfaceCard。网络适配器的内核是链路层控制器,该控制器通常是实现了许多链路层服务的单个特定目的的芯片,这些服务包括成帧,链路接入,流量控制,差错检测等。网络适配器是使计算机联网的设备,平常所说的网卡就是将PC机和LAN连接的网络适配器。网卡(NIC)插在计算机主板插槽中,负责将用户要传递的数据转换为网络上其它设备能够识别的格式,通过网络介质传输。它的主要技术参数为带宽、总线方式、电气接口方式等。以太网--是一种基带总线的局域网,适配器和局域网之间的通讯,是通过电缆,或双绞线,以串行方式进行的,而适配器和计算机通讯则是通过计算机上的IO总线以并行方式进行的。适配器一个重要功能就是要进行串行数据和并行数据的转化,由于网络上的数据率和计算机上的数据率并不相同,因此适配器必须装有对数据进行缓存的存储芯片,在主板上插入适配器时,必须把管理该适配器的设备驱动程序,安装在计算机的操作系统上,这个驱动就会告诉适配器,应当在什么位置上把多长的数据块发送的局域网,或者因当在什么位置把局域网的数据存储下来。网卡还要满足局域网协议,CSMA.//CD协议(载波监听多点接入碰撞检测)。

设备:3交换机:

以太网交换机工作于OSI网络参考模型的第二层(即数据链路层)是一种基于MAC(Media Access Control,介质访问控制)地址识别、完成以太网数据帧转发的网络设备。以太网交换机,实质上是一个多接口的网桥,通常又十几个接口,和工作在物理层的转发器,集线器又很大差别,交换机,的每个接口都单独与一台主机相连接,且一般工作方式位全双功,同时联通多个接口,使多主机能同时通讯,无碰撞传输数据,同时还有存储器,能在输出端口将来到的帧数据进行缓存,采用储存转发的方式进行转发,交换机器的性能远超普通集线器,且价格不贵,使工作在物理层的集线器推出市场。

交换机上用于链接计算机或其他设备的插口称作端口。计算机借助网卡通过网线连接到交换机的端口上网卡、交换机和路由器的每个端口都具有一个MAC地址,由设备生产厂商固化在设备的EPROM中。MAC由IEEE负责分配,每个MAC地址都是全球唯一的。MAC地址是长度为48位的二进制,前24位由设备生产厂商标识符,后24位由生产厂商自行分配的序列号。

交换机在端口上接受计算机发送过来的数据帧,根据帧头的目的MAC地址查找MAC地址表然后将该数据帧从对应端口上转发出去,从而实现数据交换。

3)网络层

简介:网络层(Network Layer)是OSI模型的第三层,它是OSI参考模型中最复杂的一层,也是通信子网的最高一层。它在下两层的基础上向资源子网提供服务。其主要任务是:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。该层控制数据链路层与传输层之间的信息转发,建立、维持和终止网络的连接。具体地说,数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。
一般地,数据链路层是解决同一网络内节点之间的通信,而网络层主要解决不同子网间的通信。例如在广域网之间通信时,必然会遇到路由(即两节点间可能有多条路径)选择问题。
在实现网络层功能时,需要解决的主要问题如下:
寻址:数据链路层中使用的物理地址(如MAC地址)仅解决网络内部的寻址问题。在不同子网之间通信时,为了识别和找到网络中的设备,每一子网中的设备都会被分配一个唯一的地址。由于各子网使用的物理技术可能不同,因此这个地址应当是逻辑地址(如IP地址)。
交换:规定不同的信息交换方式。常见的交换技术有:线路交换技术和存储转发技术,后者又包括报文交换技术和分组交换技术。
路由算法:当源节点和目的节点之间存在多条路径时,本层可以根据路由算法,通过网络为数据分组选择最佳路径,并将信息从最合适的路径由发送端传送到接收端。
连接服务:与数据链路层流量控制不同的是,前者控制的是网络相邻节点间的流量,后者控制的是从源节点到目的节点间的流量。其目的在于防止阻塞,并进行差错检测。

设备:路由器

路由器(Router),是连接因特网中各局域网广域网的设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号路由器是互联网络的枢纽,"交通警察"。目前路由器已经广泛应用于各行各业,各种不同档次的产品已成为实现各种骨干网内部连接、骨干网间互联和骨干网与互联网互联互通业务的主力军。路由和交换机之间的主要区别就是交换机发生在OSI参考模型第二层(数据链路层),而路由发生在第三层,即网络层这一区别决定了路由和交换机在移动信息的过程中需使用不同的控制信息,所以说两者实现各自功能的方式是不同的。

路由器(Router)又称网关设备(Gateway)是用于连接多个逻辑上分开的网络,所谓逻辑网络是代表一个单独的网络或者一个子网。当数据从一个子网传输到另一个子网时,可通过路由器的路由功能来完成。因此,路由器具有判断网络地址和选择IP路径的功能,它能在多网络互联环境中,建立灵活的连接,可用完全不同的数据分组和介质访问方法连接各种子网,路由器只接受源站或其他路由器的信息,属网络层的一种互联设备。路由器是实现分组交换(packet switching)的关键构件,其任务是转发收到的分组,这是网络核心部分最重要的功能。分组交换是用存储转发技术实现的。通常我们把要发送的整块数据称为一个报文(message),发送报文之前,先把较长的报文划分为一个个更小的等长数据段,在每一个数据段前面加上一些必要的控制信息组成的首部(header)后,就构成了一个分组(packet),分组又称为,而分组的首部也成为包头。包是在因特网中传送的数据单元

 

因特网的核心部分是由许多网络和把它们互连起来的路由器组成,而主机处在因特网的边缘部分。主机和路由器都是计算机,但它们的作用很不一样。主机是为用户进行信息处理的,并且可以和其它主机通过网络交换信息。路由器则是用来转发分组的,即进行分组交换的

路由器收到一个分组,先暂时存储下来,再检查其首部,查找转发表,按照首部中的目的地址,找到合适的接口转发出去,把分组交给下一个路由器。这样一步一步地以存储转发的方式,把分组交付到最终的目的主机。

上图中,假如主机H1向主机H5发送数据,主机H1先将分组逐个地发往与它直接相连的路由器A,路由器A把主机H1发送的分组放入缓存,假定从路由器A的转发表中查出应把分组转发到链路A-C,于是分组就传送到路由器C,路由器继续按照上述方式查找转发表,假定查出应转发到路由器E,当分组到达路由器E后,路由器E就把分组直接交给主机H5。

假定在某一个分组的传送过程中,链路A-C的通信量太大,那么路由器A可以把分组沿另一个路由转发到路由器B,再转发到路由器E,最后把分组送到主机H5。

需要注意的是,路由器暂时存储的是一个个短分组,而不是整个的长报文,短分组是暂存在路由器的内存中而不是硬盘中,这就保证了较高的交换速率。

因特网采用了专门的措施,保证了数据的传送具有非常高的可靠性,当网络中的某些站点或链路突然发生故障时,在各路由器中运行的路由选择协议能够自动找到其他路径转发分组。

从上述可知,采用存储转发的分组交换,实质上是采用了在数据通信的过程中断续分配传输带宽的策略,这对于传送突发式的计算机数据非常合适,使得通信线路的利用率大大提高了。

 

上图中有四个A类网络通过三个路由器连接在一起。每一个网络上都可能有成千上万个主机。可以想象,若按目的主机号来制作路由表,则所得出的路由表就会过于庞大(如果每个网络有一万台主机,路由表就有4万个记录)。但若按照主机所在的网络地址来制作路由表,那么每一个路由器中的路由表只包含4条记录就够了,每一条记录对应一个网络。

以路由器R2为例,由于R2同时连接在网络2和网络3上,因此只要目的站在这两个网络上,都可通过接口0或1有路由器R2直接交付。若目的主机在网络1中,则下一跳路由器应为R1,若目的主机在网络4中,则下一跳路由器应为R3。

再次重申,路由器是按照IP地址的网络号来转发分组的,就是说按照目的主机所在的网络转发分组但是大多情况下都允许有这样的特例:对特定的目的主机指明一个路由,这种路由叫做特定主机路由

采用特定主机路由可使网络管理人员能更方便地控制网络和测试网络,同时也可在需要考虑某种安全问题时采用这种特定主机路由。

分组转发算法如下:

(1)  从数据报的首部提取目的主机的 IP 地址 D, 得出目的网络地址为 N。

(2)  若网络 N 与此路由器直接相连,则把数据报直接交付目的主机 D;否则是间接交付,执行(3)。

(3)  若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行(4)。

(4)  若路由表中有到达网络 N 的路由,则把数据报传送给路由表指明的下一跳路由器;否则,执行(5)。

(5) 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行(6)。

(6)  报告转发分组出错。

4 传输层(Transport Layer)

OSI下3层的主要任务是数据通信,上3层的任务是数据处理。而传输层(Transport Layer)是OSI模型的第4层。因此该层是通信子网和资源子网的接口和桥梁,起到承上启下的作用。
该层的主要任务是:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。传输层的作用是向高层屏蔽下层数据通信的细节,即向用户透明地传送报文该层常见的协议:TCP/IP中的TCP协议、Novell网络中的SPX协议和微软的NetBIOS/NetBEUI协议。
传输层提供会话层和网络层之间的传输服务,这种服务从会话层获得数据,并在必要时,对数据进行分割。然后,传输层将数据传递到网络层,并确保数据能正确无误地传送到网络层。因此,传输层负责提供两节点之间数据的可靠传送,当两节点的联系确定之后,传输层则负责监督工作。综上,传输层的主要功能如下:
传输连接管理:提供建立、维护和拆除传输连接的功能。传输层在网络层的基础上为高层提供“面向连接”和“面向无接连”的两种服务。
处理传输差错:提供可靠的“面向连接”和不太可靠的“面向无连接”的数据传输服务、差错控制和流量控制。在提供“面向连接”服务时,通过这一层传输的数据将由目标设备确认,如果在指定的时间内未收到确认信息,数据将被重发。
监控服务质量。

协议:TCP/IP  ,UDP协议,端口 :

Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。

IP

IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是否按顺序发送的或者有没有被破坏,IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。

高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好像是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。

TCP

TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。

TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。

如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。

TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。

面向连接的服务(例如TelnetFTPrloginX WindowsSMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。

C#建立TCP/IP连接

在C/S模式下做网络信号传输,使用TCP/IP协议是首选。 
其传输机制: 
首先服务端与客户端建立套接字(socket)连接,建立完套接字后,服务端与客户端通过套接字进行数据传输。通常服务端和客户端需要各开启一个线程进行数据的接收。

1.构建连接

首先服务端开启套接字监听服务,然后客户端根据服务器的IP、端口进行连接。

1.1服务端开启套接字

Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(ip, myProt));  //绑定IP地址:端口  
serverSocket.Listen(10);//设定最多10个排队连接请求  
  • 注意在绑定IP时serverSocket.Bind(new IPEndPoint(ip, myProt));如果使用127.0.0.1时,客户端连接服务端的IP也必须是127.0.0.1,即要求服务端、客户端都在本地才可以通联。因此,需要将服务器套接字绑定的IP改为对外的IP,如192.168.0.1; 
    获取对外IP的方法为
/// <summary>
   /// 获取本地IP
   /// </summary>
   /// <returns></returns>
   private string GetAddressIP()
   {
    string AddressIP = string.Empty;
    foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
    {
        if (_IPAddress.AddressFamily.ToString() == "InterNetwork")
        {
            AddressIP = _IPAddress.ToString();
        }
    }
    return AddressIP;
   }

1.2开启监听客户端连接的线程

new Thread(ListenClientConnect).Start(this);
/// <summary>  
/// 监听客户端连接  
/// </summary>  
private static void ListenClientConnect(object server)
{
    Server myServer = (Server)server;
    myServer.clientSocket = serverSocket.Accept();//线程在此等待,直到有客户端连接后方继续执行
    myServer.clientSocket.Send(Encoding.UTF8.GetBytes("连接成功"));
    Thread receiveThread = new Thread(ReceiveMessage);//启动接收信息线程
    receiveThread.Start(server);
}

当serverSocket.Accept()执行后就完成了套接字的建立,就可以发送消息了。

1.3客户端建立与服务端的连接

客户端也定义一个套接字 clientSocket,再调用其connect方法与服务端连接。

    public bool createConn()
    {     
        try
        {
            IPAddress ip = IPAddress.Parse(textBox_serverIp.Text);
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            int connPort = Int16.Parse(textBox_serverPort.Text);
            clientSocket.Connect(new IPEndPoint(ip, connPort)); //配置服务器IP与端口  
            writeLog("连接服务器成功");
            button_createConn.Text = "断开连接";
            //开启监听线程
            receiveThread = new Thread(receiveMsg);
            receiveThread.Start(this);
        }
            catch (Exception e)
        {
            writeLog("连接服务器失败" + e.ToString());
            return false;
        }
        return true;
    }

2.数据传输

2.1数据发送

服务端与客户端数据发送均是调用Socket进行传输。注意传输的数据需要进行编码Encoding.UTF8.GetBytes()

    /// <summary>
    /// 发送消息
    /// </summary>
    /// <param name="signal"></param>
    /// <returns></returns>
    private bool sendSignal(string signal)
    {
        if (clientSocket == null)
        {
            writeLog("发送失败,未连接客户端");
            return false;
        }
        try
        {
            clientSocket.Send(Encoding.UTF8.GetBytes(signal + "。"));
            return true;
        }
        catch (Exception e)
        {
            writeLog("发送失败" + e.ToString());
            clientSocket = null;
        }
        return false;
    }

2.2数据接收

数据的接收建议开启一个新的线程进行接收,接收是通过调用socket的Receive方法实现的。

 new Thread(receiveMsg).Start(this);
    /// <summary>
    /// 接受消息处理线程
    /// </summary>
    /// <param name="clientForm"></param>
    public static void receiveMsg(object clientForm)
    {
        Client myClient = (Client)clientForm;
        byte[] result = new byte[1024];
        while (true)
        {
            try
            {
                //通过clientSocket接收数据  
                int receiveLength = myClient.clientSocket.Receive(result);
                string resultStr = Encoding.UTF8.GetString(result, 0, receiveLength);
                myClient.writeLog(string.Format("接收服务器消息:{0}", resultStr));     
            }
            catch (Exception e)
            {
                myClient.writeLog("读取数据失败,服务器可能已经断开" + e.ToString());
                Thread.Sleep(300);
                myClient.closeConn();       
            }   
        }   
    }

UDP

UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。

UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。

UDPTCP位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网络时间协议)和DNS(DNS也使用TCP)。

欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。

接下来我们通过一个简单的程序看一下UDP通信的过程。 
服务端程序:



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Net.Sockets;

using System.Net;

using System.Threading;

namespace UDP_Server

{

class Program

{

static Socket server;

static void Main(string[] args)

{

server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

server.Bind(new IPEndPoint(IPAddress.Parse("169.254.202.67"), 6001));//绑定端口号和IP

Console.WriteLine("服务端已经开启");

Thread t = new Thread(ReciveMsg);//开启接收消息线程

t.Start();

Thread t2 = new Thread(sendMsg);//开启发送消息线程

t2.Start();





}

/// <summary>

/// 向特定ip的主机的端口发送数据报

/// </summary>

static void sendMsg()

{

EndPoint point = new IPEndPoint(IPAddress.Parse("169.254.202.67"), 6000);

while (true)

{

string msg = Console.ReadLine();

server.SendTo(Encoding.UTF8.GetBytes(msg), point);

}





}

/// <summary>

/// 接收发送给本机ip对应端口号的数据报

/// </summary>

static void ReciveMsg()

{

while (true)

{

EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号

byte[] buffer = new byte[1024];

int length = server.ReceiveFrom(buffer, ref point);//接收数据报

string message = Encoding.UTF8.GetString(buffer,0,length);

Console.WriteLine(point.ToString()+ message);



}

}





}

}



 客户端程序:



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Net;

using System.Net.Sockets;

using System.Threading;

namespace UDP_client

{

class Program

{

static Socket client;

static void Main(string[] args)

{

client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

client.Bind(new IPEndPoint(IPAddress.Parse("169.254.202.67"), 6000));

Thread t = new Thread(sendMsg);

t.Start();

Thread t2 = new Thread(ReciveMsg);

t2.Start();

Console.WriteLine("客户端已经开启");

}

/// <summary>

/// 向特定ip的主机的端口发送数据报

/// </summary>

static void sendMsg()

{

EndPoint point = new IPEndPoint(IPAddress.Parse("169.254.202.67"), 6001);

while(true){

string msg = Console.ReadLine();

client.SendTo(Encoding.UTF8.GetBytes(msg), point);

}





}



/// <summary>

/// 接收发送给本机ip对应端口号的数据报

/// </summary>

static void ReciveMsg()

{

while (true)

{

EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号

byte[] buffer = new byte[1024];

int length = client.ReceiveFrom(buffer, ref point);//接收数据报

string message = Encoding.UTF8.GetString(buffer, 0, length);

Console.WriteLine(point.ToString() + message);

}

}

}

}

ICMPI:

CMP与IP位于同一层,它被用来传送IP的控制信息。它主要是用来提供有关通向目的地址的路径信息。ICMP的‘Redirect’信息通知主机通向其他系统的更准确的路径,而‘Unreachable’信息则指出路径有问题。另外,如果路径不可用了,ICMP可以使TCP连接‘体面地’终止。PING是最常用的基于ICMP的服务。

端口:

TCP和UDP服务通常有一个客户/服务器的关系,例如,一个Telnet服务进程开始在系统上处于空闲状态,等待着连接。用户使用Telnet客户程序与服务进程建立一个连接。客户程序向服务进程写入信息,服务进程读出信息并发出响应,客户程序读出响应并向用户报告。因而,这个连接是双工的,可以用来进行读写。端口指向一个操作系统上的一个应用软件

TCP与UDP段结构中端口地址都是16比特,可以有在0---65535范围内的端口号。对于这65536个端口号有以下的使用规定:

(1)端口号小于256的定义为常用端口,服务器一般都是通过常用端口号来识别的。任何TCP/IP实现所提供的服务都用1---1023之间的端口号,是由ICANN来管理的;

(2)客户端只需保证该端口号在本机上是惟一的就可以了。客户端口号因存在时间很短暂又称临时端口号;

(3)大多数TCP/IP实现给临时端口号分配1024---5000之间的端口号。大于5000的端口号是为其他服务器预留的。

网络技术中,端口(Port)包括逻辑端口和物理端口两种类型。物理端口指的是物理存在的端口,如ADSL Modem、集线器交换机路由器上用 于连接其他网络设备的接口,如RJ-45端口、SC端口等等。逻辑端口是指逻辑意义上用于区分服务的端口,如TCP/IP协议中的服务端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等。由于物理端口和逻辑端口数量较多,为了对端口进行区分,将每个端口进行了编号,这就是端口号。

iP

IP地址具有唯一性,根据用户性质的不同,可以分为5类。另外,IP还有进入防护,知识产权,指针寄存器等含义。

Internet的网络地址是指连入Internet网络的计算机的地址编号。所以,在Internet网络中,网络地址唯一地标识一台计算机。

我们都已经知道,Internet是由几千万台计算机互相连接而成的。而我们要确认网络上的每一台计算机,靠的就是能唯一标识该计算机的网络地址,这个地址就叫做IP(Internet Protocol的简写)地址,即用Internet协议语言表示的地址。

在Internet里,IP地址是一个32位的二进制地址(IPv4),为了便于记忆,将它们分为4组,每组8位,由小数点分开,用四个字节来表示,而且,用点分开的每个字节的数值范围是0~255,如202.116.0.1,这种书写方法叫做点数表示法。

用于识别该网络中的主机。

IP地址分为五类,A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验,各类可容纳的地址数目不同。

A、B、C三类IP地址的特征:当将IP地址写成二进制形式时,A类地址的第一位总是0,B类地址的前两位总是10,C类地址的前三位总是110。

A类地址

(1)A类地址第1字节为网络地址,其它3个字节为主机地址。它的第1个字节的第一位固定为0.

(2)A类地址网络号范围:1.0.0.0---126.0.0.0

(3)A类地址中的私有地址和保留地址:

① 10.X.X.X是私有地址(所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址)。

范围(10.0.0.0---10.255.255.255)

② 127.X.X.X是保留地址,用做循环测试用的。

B类地址

(1) B类地址第1字节和第2字节为网络地址,其它2个字节为主机地址。它的第1个字节的前两位固定为10.

(2) B类地址网络号范围:128.0.0.0---191.255.0.0。

(3) B类地址的私有地址和保留地址

① 172.16.0.0---172.31.255.255是私有地址

② 169.254.X.X是保留地址。如果你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务器。就会得到其中一个IP。

191.255.255.255是广播地址,不能分配。

C类地址

(1)C类地址第1字节、第2字节和第3个字节为网络地址,第4个字节为主机地址。另外第1个字节的前三位固定为110。

(2)C类地址网络号范围:192.0.0.0---223.255.255.0。

(3) C类地址中的私有地址:

192.168.X.X是私有地址。(192.168.0.0---192.168.255.255)

D类地址

(1) D类地址不分网络地址主机地址,它的第1个字节的前四位固定为1110。

(2) D类地址范围:224.0.0.0---239.255.255.255

E类地址

(1) E类地址不分网络地址和主机地址,它的第1个字节的前五位固定为11110。

(2) E类地址范围:240.0.0.0---255.255.255.254

IP地址如果只使用ABCDE类来划分,会造成大量的浪费:一个有500台主机的网络,无法使用C类地址。但如果使用一个B类地址,6万多个主机地址只有500个被使用,造成IP地址的大量浪费。因此,IP地址还支持VLSM技术,可以在ABC类网络的基础上,进一步划分子网

无类地址

除ABCDE以外的IP地址段划分方式,如:192.168.1.0 255.255.255.252等分成C段划分的地址

分片和重新组装

分片后的IP数据包,只有到达目的地才能重新组装。重新组装由目的地的IP层来完成,其目的是使分片和重新组装过程对传输层(TCPUDP)是透明的。已经分片过的数据包有可能会再次进行分片(不止一次)。

IP分片原因:链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值(所以才有了传输层代码需要--粘包和分包的)以太网的MTU是1500,你可以用 netstat -i 命令查看这个值。如果IP层有数据包要传,而且数据包的长度超过了MTU,那么IP层就要对数据包进行分片(fragmentation)操作,使每一片的长度都小于或等于MTU。我们假设要传输一个UDP数据包,以太网的MTU为1500字节,一般IP首部为20字节,UDP首部为8字节,数据的净荷(payload)部分预留是1500-20-8=1472字节。如果数据部分大于1472字节,就会出现分片现象。

数据包(粘包分包):

数据帧:帧头+IP数据包+帧尾 (帧头包括源和目标主机MAC初步地址及类型,帧尾是校验字)

IP数据包:IP头部+TCP数据信息(IP头包括源和目标主机IP地址、类型、生存期等)

TCP数据信息:TCP头部+实际数据 (TCP头包括源和目标主机端口号、顺序号、确认号、校验字等)

再代码进行数据传输时:通常数据在传输时会有粘包分包操作(发送前将数据长度放在首位,接受时按长度检测接受,将数据重新组装),差错检验(CRC16),数据加密(RXO异或加密),数据压缩,等。

子网掩码:

子网掩码(subnet mask)又叫网络掩码地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址主机地址两部分。子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。子网掩码——屏蔽一个IP地址的网络部分的“全1”比特模式。对于A类地址来说,默认的子网掩码是255.0.0.0;对于B类地址来说默认的子网掩码是255.255.0.0;对于C类地址来说默认的子网掩码是255.255.255.0。无论网络是否划分子网,把子网掩码,和iP地址按位置与,就得出网络地址,利用子网掩码可以把大的网络划分成子网,即VLSM(可变长子网掩码),也可以把小的网络归并成大的网络即超网使用子网是为了减少IP的浪费。因为随着互联网的发展,越来越多的网络产生,有的网络多则几百台,有的只有区区几台,这样就浪费了很多IP地址,所以要划分子网。使用子网可以提高网络应用的效率。通过IP 地址的二进制与子网掩码的二进制进行与运算,确定某个设备的网络地址主机号,也就是说通过子网掩码分辨一个网络的网络部分和主机部分。子网掩码一旦设置,网络地址主机地址就固定了。子网一个最显著的特征就是具有子网掩码。与IP地址相同,子网掩码的长度也是32位,也可以使用十进制的形式。例如,为二进制形式的子网掩码:1111 1111.1111 1111.1111 1111.0000 0000,采用十进制的形式为:255.255.255.0。

防火墙:

所谓防火墙指的是一个由软件硬件设备组合而成、在内部网外部网专用网与公共网之间的界面上构造的保护屏障.是一种获取安全性方法的形象说法,它是一种计算机硬件和软件的结合,使InternetIntranet之间建立起一个安全网关(Security Gateway),从而保护内部网免受非法用的侵入,防火墙主要由服务访问规则、验证工具、包过滤应用网关4个部分组成,防火墙就是一个位于计算机和它所连接的网络之间的软件硬件。该计算机流入流出的所有网络通信数据包均要经过此防火墙。在网络中,所谓“防火墙”,是指一种将内部网和公众访问网(如Internet)分开的方法,它实际上是一种隔离技术防火墙是在两个网络通讯时执行的一种访问控制尺度,它能允许你“同意”的人和数据进入你的网络,同时将你“不同意”的人和数据拒之门外,最大限度地阻止网络中的黑客来访问你的网络。换句话说,如果不通过防火墙,公司内部的人就无法访问Internet,Internet上的人也无法和公司内部的人进行通信。

     XP系统相比于以往的Windows系统新增了许多的网络功能(Windows 7的防火墙一样很强大,可以很方便地定义过滤掉数据包),例如Internet连接防火墙(ICF),它就是用一段"代码墙"把电脑和Internet分隔开,时刻检查出入防火墙的所有数据包,决定拦截或是放行那些数据包。防火墙可以是一种硬件、固件或者软件,例如专用防火墙设备就是硬件形式的防火墙,包过滤路由器是嵌有防火墙固件的路由器,而代理服务器等软件就是软件形式的防火墙。
  ICF被视为状态防火墙,状态防火墙可监视通过其路径的所有通讯,并且检查所处理的每个消息的源和目标地址。为了防止来自连接公用端的未经请求的通信进入专用端,ICF保留了所有源自ICF计算机的通讯表。在单独的计算机中,ICF将跟踪源自该计算机的通信。与ICS一起使用时,ICF将跟踪所有源自ICF/ICS计算机的通信和所有源自专用网络计算机的通信。所有Internet传入通信都会针对于该表中的各项进行比较。只有当表中有匹配项时(这说明通讯交换是从计算机或专用网络内部开始的),才允许将传入Internet通信传送给网络中的计算机。
  源自外部源ICF计算机的通讯(如Internet)将被防火墙阻止,除非在“服务”选项卡上设置允许该通讯通过。ICF不会向你发送活动通知,而是静态地阻止未经请求的通讯,防止像端口扫描这样的常见黑客袭击。

5)会话层

会话层(Session Layer)是OSI模型的第5层,是用户应用程序和网络之间的接口,主要任务是:向两个实体的表示层提供建立和使用连接的方法。将不同实体之间的表示层的连接称为会话。因此会话层的任务就是组织和协调两个会话进程之间的通信,并对数据交换进行管理。
用户可以按照半双工、单工和全双工的方式建立会话。当建立会话时,用户必须提供他们想要连接的远程地址。而这些地址与MAC(介质访问控制子层)地址或网络层的逻辑地址不同,它们是为用户专门设计的,更便于用户记忆。域名(DN)就是一种网络上使用的远程地址例如:www.3721.com就是一个域名。会话层的具体功能如下:
会话管理:允许用户在两个实体设备之间建立、维持和终止会话,并支持它们之间的数据交换。例如提供单方向会话或双向同时会话,并管理会话中的发送顺序,以及会话所占用时间的长短。
会话流量控制:提供会话流量控制和交叉会话功能。
寻址:使用远程地址建立会话连接。l
出错控制:从逻辑上讲会话层主要负责数据交换的建立、保持和终止,但实际的工作却是接收来自传输层的数据,并负责纠正错误。会话控制和远程过程调用均属于这一层的功能。但应注意,此层检查的错误不是通信介质的错误,而是磁盘空间、打印机缺纸等类型的高级错误。

6)表示层

表示层(Presentation Layer)是OSI模型的第六层,它对来自应用层的命令和数据进行解释,对各种语法赋予相应的含义,并按照一定的格式传送给会话层。其主要功能是“处理用户信息的表示问题,如编码、数据格式转换和加密解密”等。表示层的具体功能如下:
数据格式处理:协商和建立数据交换的格式,解决各应用程序之间在数据格式表示上的差异。
数据的编码:处理字符集和数字的转换。例如由于用户程序中的数据类型(整型或实型、有符号或无符号等)、用户标识等都可以有不同的表示方式,因此,在设备之间需要具有在不同字符集或格式之间转换的功能。
压缩和解压缩:为了减少数据的传输量,这一层还负责数据的压缩与恢复。
数据的加密和解密:可以提高网络的安全性。

7)应用层

应用层(Application Layer)是OSI参考模型的最高层,它是计算机用户,以及各种应用程序和网络之间的接口,其功能是直接向用户提供服务,完成用户希望在网络上完成的各种工作。它在其他6层工作的基础上,负责完成网络中应用程序与网络操作系统之间的联系,建立与结束使用者之间的联系,并完成网络用户提出的各种网络服务及应用所需的监督、管理和服务等各种协议。此外,该层还负责协调各个应用程序间的工作。
应用层为用户提供的服务和协议有:文件服务、目录服务、文件传输服务(FTP)远程登录服务(Telnet)、电子邮件服务(E-mail)、打印服务、安全服务、网络管理服务、数据库服务等。上述的各种网络服务由该层的不同应用协议和程序完成,不同的网络操作系统之间在功能、界面、实现技术、对硬件的支持、安全可靠性以及具有的各种应用程序接口等各个方面的差异是很大的。应用层的主要功能如下:
用户接口:应用层是用户与网络,以及应用程序与网络间的直接接口,使得用户能够与网络进行交互式联系。
实现各种服务:该层具有的各种应用程序可以完成和实现用户请求的各种服务。

8 小结

由于OSI是一个理想的模型,因此一般网络系统只涉及其中的几层,很少有系统能够具有所有的7层,并完全遵循它的规定。
在7层模型中,每一层都提供一个特殊的网络功能。从网络功能的角度观察:下面4层(物理层、数据链路层、网络层和传输层)主要提供数据传输和交换功能,即以节点到节点之间的通信为主;第4层作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;而上3层(会话层、表示层和应用层)则以提供用户与应用程序之间的信息和数据处理功能为主。简言之,下4层主要完成通信子网的功能,上3层主要完成资源子网的功能。

第一层是物理层,用于建立、维护和拆除物理链路连接。数据的单位是比特,主要设备有中继器、集线器、适配器。

第二层是数据链路层,在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路,通过差错控制提供数据帧在信道上无差错的传输,本层在不可靠的物理介质上提供可靠的传输,其作用有物理地址寻址、数据的成帧、流量控制、数据的检验、重发等,本层的单位为帧,主要设备是二层交换机、网桥。

第三层是网络层,其就是选择合适的网间路由和交换结点,确保数据及时传达。网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息(源站点和目的站点地址的网络地址)。IP是第三层的一部分,此外还有一些路由协议和地址解析协议,总之就是有关路由的一切事情都在第三层处理,地址解析和路由是第三层的重要目的,网络层还可以实现拥塞控制、忘记互联等功能,本层的单位是数据包,典型的协议包括IP,IPX,RIP,ARP,RARP,OSPF等。主要设备是路由器。

第四层是传输层,为上层提供端到端(最终用户到最终用户) 的透明的、可靠的数据传输服务,所谓的透明传输是指在通信过程横纵传输层对上层屏蔽了通信传输系统的具体细节,即屏蔽了传输层以下的通信过程。具体的协议包括有TCP,UDP,SPX.单位是数据段。

第五层是会话层,在会话层及以上的层次,数据传送单元统称为报文。它提供包括访问验证和会话管理在内的建立和维护应用之间的通信机制。如服务器验证用户登录便是在会话层完成的。

第六层是表示层,解决用户信息的语法表示问题。提供格式化的表示和转换数据服务。数据的压缩和解压缩,加密和解密等工作都是由表示层负责的。

第七层是应用层,为操作系统或网络应用程序提供访问网络服务的接口。这层的协议包括有Telnet,FTP,HTTP,SNMP等。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值