java网络原理

今天是新年第一篇文章,先祝各位读者新年快乐,虎虎生威!

 

从今年开始我会陆续讲解服务器开发各部分的知识和技巧(只是个人见解与相关资料的整合,如有错误还希望各位网友指出)。首先来讲下Java网络,网络技术是Java语言中很重要的一部内容,因为Java的语言产生的核心思想:网络与安全。

而且目前的很多的软件的开发也与网络紧密的联系在一起,Java为了使开发者更简单使用网络技术,基本上已经将很多层都封装起来了。提供给开发者可以看到是运输层代码的使用。在了解之前,介绍下网络分层,如表所示:

 

 

应用层

 

应用层

表示层

会话层

运输层

运输层

网络层

网络层

链路层

链路层

物理层

物理层

 

表格的左边是因特网协议栈,表格右边是ISO/OSI参考模型。

 

所谓协议分层(这是一个软件设计的体系部分),分层的原则要求是下层为其相邻的上层提供服务,而上层不能直接调用与其不相邻层的服务,或者下层去调用相邻上层的服务(但是在有些特殊场景下,是可以打破这个原则的)。为什么需要分层呢?这是因为对于大而复杂且需要不断更新的系统,改变服务的实现而不影响该系统其他部分的能力是分层的优点之一。

另外各层对分组的命名都是不同的,如:

应用层对应用分组称为报文。

运输层对运输分组称为报文段。

网络层对网络分组称为数据报。

链路层对链路分组称为帧。

 

在网络传输过程中会有时延、丢包和吞吐量等因素的考虑。

网络时延分为节点处理时延、排队时延、传输时延和传播时延,这些时延总体累加起来就是节点总时延。

节点处理时延包括检查分组首部、决定分组导向何处、检查比特差错等处理的时间。

排队时延主要是分组在链路等待传输这个时间。

传输时延主要是将所有分组的比特推向链路所需要的时间。

传播时延主要是从该链路的起点到终点传播所需要的时间。

这里需要注意下的是传输时延与传播时延是有区别的,前者与分组长度有关,后者与两个节点的距离有关。

丢包是因为路由器的排队容量有限,当流量强度接近于1时到达分组将发现一个满队列。由于没有地方可以存储这个分组,路由器将丢弃该分组,即该分组将会丢失。

关于吞吐量是一个网络性能测试必不可少。简单的说就是如果该文件由F比特组成,而主机接收到所有F比特用了T秒,那么文件传输的平均吞吐量为F/Tbps(比特/秒)。

 

我将从应用层到物理层进行相关描述。

应用层应该是我们Java程序员接触最多的,因为这里涉及到了大量的应用层协议如:HTTP协议、FTP、邮件协议(SMTP、POP3)、DNS等。目前 在网络应用程序体系架构有两种主流体系:客户机/服务器体系结构和对等(P2P)体系结构,而我们可以方便在应用层上进行实现。

那么如何使用5层协议栈而互相进行通信呢?在操作系统术语中,进行通信的实际上是进程而不是程序(进程可以被认为是运行在端系统中的程序)。不同的端系统上的进程通过跨越计算机网络交换报文而相互通信。我们给每对进程之间的通信中,发送通信请求的进程称为客户机,在等待请求的进程称为服务器。

因为从一个进程向另一个进程发送报文必须通过网络。进程是如何发送报文给网络的呢?就是我们常说的套接字(Socket)作为进程与计算机网络之间的接口。当报文交给网络接口后,那么运输层就将提供相关服务方式:可靠数据传输、吞吐量、定时、安全性。再具体点说就是TCP服务和UDP服务。

最后是一个进程如何使用这些服务来指示它要与那个进程进行通信呢?需要定义两种信息:第一是主机名称或地址,第二指定主机接收进程的标识。具体来说就是主机用IP地址进行标识,接收进程用端口号标识。

在应用层里,我们可以研发自己的应用层协议(特别是进行服务器开发而言,是需要研发自己的协议定义的)。不过对一些已有的协议,也是需要掌握的,协议如下:

HTTP、FTP、邮件协议(SMTP、POP3)、DNS等。掌握这些协议,个人给出以下学习方式,了解各协议原理(包括协议本身的格式等),优点和缺点,应用场景(因为每种协议的产生都是为了解决某种需求,而不是研究者吃饱了没事干瞎想出来的),最后是实际操作加深感受。

 

从运输层开始,Java都进行相关的封装,对于开发者而言有些是透明的。不过我们不能停留在“知其然”这个层面,而是要到达“知其所以然”这个层面。

解决三个主要问题:

第一:运输层与网络层的关系。

第二:如何进行可靠通信。

第三:如何避免网络拥塞。

 

关于运输层与网络层的关系,区别很明显。运输层为运行在不同主机上的进程提供逻辑通信,网络层则提供了主机之间的逻辑通信。

运输层有个多路复用和多路分解两个概念,其实很简单。前者是将报文段传给网络层的工作,后者是将运输层报文段中的数据交付给正确的套接字的工作。而运输层最重要的两个服务模型是:TCP和UDP(另外还有一个是RTP)。另外前者是面向连接的,后者是无连接的。

先来说下UDP,因为有很多应用更适合UDP,这主要有以下原因:

应用层能更好地控制要发送的数据和发送时间。因为采用UDP时,应用进程将数据传递给UDP,UDP就会将此数据打包成UDP报文段并立即传递给忘了层

无需连接建立。因为TCP在数据传输前要经过三次握手

无连接状态。因为TCP需要在端系统中维护连接状态(包括接收和发送缓存、拥塞控制参数、序号与确认号参数等)

分组首部开销小。因为TCP报文段有20个字节的开销,而UDP仅有8个字节的开销

 

UDP报文段结构

源端口号

目的端口号

长度

校验和

应用数据(报文)

UDP首部有4个字段,每个字段由两个字节组成。这里主要是对校验和字段需要了解(用google搜下,嘿嘿)

为什么UDP提供了校验和字段呢?原因是不能保证源和目的之间的所有链路都提供差错检测,即其中也许有一条链路使用了没有差错检测的协议。(另外从系统设计角度来说就是端到端原则)

 

TCP报文段结构

源端口号

目的端口号

序号

确认号

首部长度

保留未用

URG

ACK

PSH

RST

SYN

FIN

接收窗口

互联网校验和

紧急数据指针

选项

数据

简单地介绍下个字段:

两个端口号字段与UDP一样,分别由2个字节组成,用于多路复用/多路分解。

序号字段和确认号字段分别由4个字节(32比特位)组成,用于实现可靠数据传输服务。

接收窗口字段由2个字节(16比特位)组成,用于流量控制处理。

首部长度由4比特位组成,由于选项字段的原因,TCP首部长度是可变的(通常选项字段为空,所以TCP首部长度就是20字节)

标志字段由6比特位组成,ACK比特用于指示确认字段中的值是否有效;RST、SYN和FIN比特用于连接建立和拆除;PSH比特用于指示接收方应立即将数据交给上层;URG比特用于指示报文段中存在被发送方的上层“紧急”数据。紧急数据的最后一个字节由16比特位的紧急数据指针字段指出。(但在实际中,PSH、URG和紧急数据指针并没有使用)

 

关于网络层,也是协议栈中最复杂的层次之一(因为这是网络的核心部分),但是对于开发者而言,我们需要知道的是网络层有两个重要的特性:转发和选路。

首先需要了解下网络服务模型,所谓网络服务模型定义网络的一侧边缘到另一侧边缘之间分组的端到端运输特性。能由网络层提供的特定服务包括:

确保交付

具有时延上界的确保交付

此外,下列服务能够为给定的源和目的之间提供分组的流:

有序分组交付

确保最小带宽

确保最大时延抖动

安全性服务

但是因特网的网络层提供了单一的服务,称为尽力而为服务(也可以认为是根本无服务),分组间定时得不到保证,分组接收的顺序也不能保证与发送的顺序一致,传送的分组也不能保证最终交付。

除了因特网尽力而为模型外,还存在其他模型,如:ATM网络体系结构中两个服务模型恒定比特率和可用比特率服务。

运输层能够为应用程序提供无连接服务或面向连接服务,类似的方式,网络层也提供连接服务或无连接服务(即虚电路网络和数据报网络)。但是这两个层所提供的服务还是有差异:

在网络层中,是网络层向运输层提供的主机到主机的服务。在运输层中,是运输层向应用层提供的进程到进程的服务。

在网络层中,提供连接服务的被称为虚电路网络,提供无连接服务的被称为数据报网络。

运输层面向连接服务是位于网络边缘的端系统中实现的;但是网络层除了在端系统中实现,也在位于网络核心的路由器中实现。

转发处理过程中,路由器是网络层中一个非常重要的系统设备,基本上由4部分组成:输入端口、交换结构、输出端口、选路处理器。另外转发中最常用的是一种最长前缀匹配规则的方式。

 

数据报格式(IPv4和IPv6)

IPV4格式

版本号

首部长度

服务类型

数据报长度(字节)

16比特标识

标志

13比特片偏移

寿命

上层协议

首部校验和

32比特源IP地址

32比特目的IP地址

选项

数据

简单说明下各字段:

版本号。4比特位组成,IP协议版本

首部长度。因为IPv4有一些可选项,导致长度可变(如果没有选项的话,IP有20字节的首部)

服务类型。用于不同类型的IP数据报,如:低时延、高吞吐量或可靠性的数据报进行区分,还有将实时数据报与非实时流量的区分

数据报长度。这是IP数据报的总长度(首部加上数据),理论最大65535字节,实际是一般不超过1500字节

标识、标志、片偏移。该三个字段与IP分片有关

寿命。即TTL,用来确保数据报不会永远在网络中循环

上层协议。用于指明IP数据报的数据部分应交给那个运输层协议(如TCP或者UDP等,6表示TCP,17表示UDP)

首部校验和。用法与UDP的校验方式类似

源和目的IP地址,这个就不用解释了吧

 

IPv6格式

版本号

流量类型

流标签

有效载荷长度

下一个首部

跳限制

128比特源IP地址

128比特目的IP地址

数据

IPv6的变化在于:

扩大地址容量。从32比特增加到128比特

简单高效的40个字节首部。

流标签与优先级

简单说明下个字段:

版本号。没什么再解释了

流量类型。同IPv4的服务类型类似

有效载荷长度。即跟在定长的40个字节首部后面的字节数量

下一个首部。同IPv4的上层协议类似

跳限制。同IPv4的寿命类似,当跳限制计数到达0时,该数据报将丢弃

后面的就省略了。

 

这里总结下IPv4与IPv6的区别:

分片/重新组装去掉(即标识、标志、片偏移)

首部校验和去掉,因为IPv6的设计者认为该项功能实属多余,也再次强调了快速处理IP分组时关注的重点

选项去掉,不在是标准IP首部的一部分

 

最后说下选路,就是网络层必须确定从发送方到接收方的分组所采用的路径。即一条好的路径,一条好的路径是指具有最低费用的路径。再说白了就是我们学习数据结构中的图论就是用于形式化选路。

不过对于选路算法分类一般按全局和分布式来分:全局选路算法(也叫链路LS状态算法)、分布式选路算法(如距离向量DV算法)

按静态与动态来分:静态路由变化非常缓慢,动态是按周期性变化,可能是流量负载或拓扑变化导致

按负载敏感来分:负载敏感算法、负载迟钝算法

在实际使用过程中的常用路由算法有:RIP(选路信息协议)、OSPF、BGP(边界网关协议)

另外就是广播与多播机制和区别

 

关于链路层,我们会考虑分组如何通过构成端到端通信路径的每段链路的,另外链路层有两种不同类型的信道。第一种类型由广播信道组成,常用于局域网、无线LAN、卫星网和HFC接入网。第二种类型是链路层信道是点对点通信链路。

在链路层,主机和路由器统称为节点,相邻节点的通信信道称为链路。而链路层协议定义了在链路两端的节点之间交互的分组格式,以及当发生和接收分组时这些节点采取的动作。再说白了网络层的任务是将运输层的报文段从源主机端到端地传送到目的主机,而链路层的任务是将网络层的数据报通过路径中的单段链路节点到节点地传送。

链路层提供服务包括:

成帧。对网络层的数据报进行一次封装。

链路接入。媒体访问控制(MAC)规定了帧在链路上传输的规则。

可靠交付。

流量控制。链路的每一端节点都具有有限容量的帧缓存能力。

差错检测。

差错纠正。

半双工和全双工。

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值