Java网络编程——网络模型

                                网络模型

计算机网络的概念  

      计算机网络是计算机+网络的集合。通过网络,把分布在不同地理位置的计算机用通信线路互连成一个具有强大功能的网络系统,每台计算机可以发送和接收其他计算机的网络数据。就如人与人交流需要语言一样,计算机之间的网线通信也需要特定的语言,如果语言不同还无法正常交流,计算机交流的语言被称能网络协议。再者,一台计算机如果想和另一台计算机进行通信的话,就必须知道另一台计算机在哪里,计算机在网络中都有唯一的网络地址,它是一段用于标识主机的字节序列,很显然,这个字节序列越长就可以表示的地址数量就越多。通过,现代的主机网络地址是使用的ip协议来标识网络地址的,相同范围内的网络地址的前部相同,就如手机号码一样,前两位可以表示这个手机号码是哪个省市的。


OSI七层网络模型

      由于计算机网络比较复杂,因为必须把网络分成多层,每层具有不同的功能,这样便于开发与管理。最经典的计算机网络模型便是开放系统互连(Open System Interconnection,简称OSI)模型,OSI模型把网络分为七层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层以及应用层,每一层都有具体的功能,为下一层服务并为上一层提供服务。
     其中的物理层是一些物理设备,比如网线电缆接线口之类的电气。在这一层,网络协议规定了电流电压等一些机械电气属性,数据在这一层是原始的比特流,在物理设备中以电流或电磁场的形式存在。在物理层的典型设备是集线器。
     物理层之上是数据链路层,数据链路层的数据形式是帧,第一帧包括一定数据的数据和一些必要的控制信息,数据链路层要传输数据就必须建立、维持、释放数据链路的连接,如果数据中有差错,就会通过发送方重新发送这一帧。在数据链路层最典型的设备是交换机。
     再向上是网络层。计算机网络在进行通信时会经过很多数据链路,网络层就是在网间选择合适的交换节点保证数据可以及时送达到目的主机。其中最典型的设备便是路由器。在网络层,每个网络设备都是一个网络节点,网络层就是在这些节点之间传输数据,从一个节点到另一个节点的路径就是一条链路,一整个路径被称为路由。网络层会把从数据链路层的数据封装成数据包,前添加生意人包头,在包头中就包含了源主机和目标主机的网络地址,这样网络层就可以根据源主机和目标主机的网络地址选择最优的路径,以此来缩短数据传输的距离,回忆数据传输效率。
      传输层就是为数据的传输提供服务,在这一层,数据包被封装成数据报,数据报可以选择可靠或者不可靠的方式进行传输,最经典的就是TCP和UDP。
     会话层的数据形式被称为报文,在会话层会话管理进程会建立、管理、终止进程之间的会话,所谓和主机之间网络通信其实是进程之间的通信。并且会话层会在数据中插入一些校验点来实现数据的同步,避免数据混乱导致应用逻辑错误。
     表示层主机的功能是对数据的一些处理,比如对数据的加密 、解密以及压缩和解压。
     最上层就是应用层。应用层是OSI七层模型中最丰富的一层,在这一层,计算机网络提供了很多面向使用用户的服务,最经典的比如有http服务、FTP文件传输服务等待。在应用开发过程中,我们主要是面向应用层编程的,计算机网络也提供了很多应用层的编程接口,那当然有时候我们需要特殊的处理也需要其他层的API。


TCP/IP模型

       ISO模型把网络分成了七层,我们对其中很多内容其实都没必要去管理,因此TCP/IP模型把网络分成四层更加便于理解。
在TCP/IP模型把OSI模型的物理层和数据链路层合并成主机-网络层,网络层被称为网络互连层,传输层还是传输层,把会话层、表示层和应用层合并成应用层。在Java网络编程时,主要还是参考TCP/IP模型,当然,Java也有UDP编程接口的。
      在TCP/IP模型中,最著名的就是三次握手和四次挥手了。TCP是一种可靠的网络传输连接,在数据传输前,必须先建立连接,而连接是通过三次握手来初始化的,而在断开连接时就是使用四次挥手。三次握手主要是同步连接双方的序列号和确认号,并交换TCP窗口大小信息。
      在进行三次握手时,第一次握手时客户端发送连接请求,将SYN标志位设置为1,将Sequence Number设置成经,客户端进入SYN_SEND状态,等待服务器的连接确认。第一次握手时,服务器收到 SYN报文,服务器首先对这个SYN报文进行分析确认,并将Acknowledgment设置成Sequence Number+1(即x+1),将 SYN设置成1,将Sequence Number设置为y,服务器将这些设置信息发送给客户端,此时服务器进入SYN_RECV状态。最后在第三次握手时,客户端接收到服务器发来的确认报文,然后将Acknowledgment Number设置为Sequence Number+1(即y+1),并向服务器发送ACK报文,并进入到ESTABLISHEN状态,这样三次握手完成,服务器与客户端网络连接建立完成 ,客户端与服务器就可以开始传输数据了。
     三次握手是用于保证数据传输安全的,如果没有经过三次握手,可以连接已经不可用了,但是客户端和服务器端都不知道连接已经不可用了,如果发送了数据,就会产生了些不可预见的错误。比如这样一个场景,客户端发送了一个连接请求,但是由于网络延迟,这个连接请求到达服务器时连接已经释放了,由于没有使用三次握手,服务器会以为这是一个新的连接请求,就会创建连接向客户端发送确认报文,但客户端并没有发出建立连接的请求,因为已经失效了,客户端就不会发送数据给服务器端,而服务器以为连接已经正常建立了,所以会一直等待客户端的数据,就一直浪费着资源。
     四次挥手是用来保证连接断开安全的(在计网课上老师讲过三次握手,不知为什么没讲四次挥手,难道是不重要?)。断连时肯定是一方先发起的,可以是客户端也可以是服务器端。首先断开连方设置Sequence Number和Acknowledement,并向被断开的一方发送FIN报文段,此时断边方进入FIN_WAIT_1状态,表示断连方已经没有数据要发送给被断方了。第二次挥手时被断方接收到断连方发来的FIN报文,并向断连方发送ACK报文,将Acknowledgment Number设置为Sequence Number+1,进入FIN_WAIT_2状态,表示被断方也已经没有数据要发送给断连方了。第三次挥手时,被断方发送FIN报文给断连方,请求关闭连接,这时被断方进入CLOSE_WAIT状态。第四次挥手时,断连方接收到被断连方发送的FIN报文,并向被断连方发送ACK报文,进入TIME_WAIT状态,被断方接到断连方ACK报文,这时被断方关闭连接,这时是真正地断开 了连接,断连方等待2MSL后如果没有收到来自被断连方的信息,则表示被断连方已经正常关闭了连接了,自己也可以关闭连接了。这样经过四次挥手后服务器端和客户端就安全地关闭了连接。
       由于TCP是可靠的面向连接的,可以双工通信,双工是指连接双方可以互相发送和接收数据。因此,关闭连接前必须保证双方已经都没有数据将要发送给对方了。

你可能感兴趣的:(学习,读书笔记)