Java计算机网络面试题及其答案
1.计算机网络的性能
我们所说的计算机网络的性能一般指的是它的七个重要的性能指标:
1) 速率:就是数据传输的速率,单位bit
2) 带宽:在计算机网络中,带宽用来表示某通道传输数据的能力,网络带宽表示在单位时间内网络中的某信道所能通过的“最高数据率”。
3) 吞吐量:它表示在单位时间内通过某个网络的实际的数据量。
4) 时延:指数据从网络的一端传送到另一端所需的时间。
总时延=发送时延+传播时延+处理时延+排队时延
其中发送时延是主机或路由器发送数据桢所需要的时延,传播时延是电磁波在信道中传播一定的距离需要花费的时间,处理时延是主机或路由器在收到分组时要花费一定的时间进行处理,排队时延是主机在经过网络传输时,要经过许多路由器,但分组在进入路由器后要先在输入队列中排队等待处理。
5) 时延带宽积:顾名思义就是 传播时延*带宽
6) 往返时间RTT
7) 利用率:它有信道利用率和网络利用率两种。 信道利用率指出信道有百分之几的时间是被利用的。 网络利用率则是全网络的信道利用率的加权平均值。
2.计算机网络体系结构
应用层:它的任务是通过应用进程间的交互来完成特定网络应用。 应用层协议定义的是应用进程间通信的和交互的规则。 对于不同的网络应用有不同的应用层协议,例如万维网的HTTP协议,电子邮件的SMTP协议等等。(注意,我们把应用层交互的数据单元称为报文(message))
运输层:它的任务就是负责两台主机中进程之间的通信提供通用的数据传输服务。它主要有两个协议:UDP和TCP协议。
网络层:负责为分组交换网上的不同主机提供通信服务,在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组(或包)。在TCP/IP体系中,由于网络层使用的是IP协议,因此分组也可以叫IP数据报(简称数据报)。网络层的另一个任务就是找到合适的路由,使源主机运输层所传下来的分组能够通过网络中的路由器找到目标主机。
3.>UDP / TCP 协议
答:这两个协议是TCP/IP体系结构中的运输层协议, 运输层的任务就是负责向两台主机中进程(程序)之间的通信提供通用的数据传输服务,应用程序利用该服务传送应用层的报文(应用层交互的数据单元)。
1) UDP中文名叫用户数据报协议。当使用它来传送数据之前主机间不需要先建立连接,远地主机的运输层在接收到UDP报文后也不需要给出任何确认。 简单来说就是不可靠传输。(优点:开销小,可广播)
2) TCP中文名叫传输控制协议。 它与UDP不同,它为主机间提供了可靠的传输,在使用它传送数据之前必须先建立连接,在数据传输结束后释放连接,这样的话它就能保证实现点对点通信。(缺点:开销大)
在实际的应用中我们可以根据场景来选择那种协议,例如:
4.三次握手
答:我们都知道TCP是面向连接的协议,TCP运输连接有三个阶段:建立连接,数据传送,释放连接。
1) TCP建立连接的过程叫做握手,而握手需要在客户端和服务器之间交换三个报文段,所以有了三次握手的叫法。具体的过程是这样的:我们假定主机A运行的是客户程序,B运行的是服务器程序,开始A,B的TCP进程都处于关闭状态。
一开始,B的TCP服务器进程先创建传输控制块TCB,然后进入监听准备接受客户进程的连接请求。 (其中TCB存储了每一个连接中的一些重要的信息,如:TCP联结表,指向发送和接受缓存的指针,指向重传队列的指针,当前发送和接受序号等等).
同样A的TCP客户进程也是首先创建TCB,然后在打算建立TCP连接时向B发出连接请求报文段,报文段的首部中的同步位SYN=1,同时选择一个初始序号seq=x.(因为TCP规定SYN=1的报文段不能携带数据,但要消耗掉一个序号),这时TCP客户进程进入同步已发送状态。
然后B收到连接请求报文段后,如果同意建立连接,它会向A发送确认报文(确认报文中的SYN和ACK位都置为1,确认号为ack=x+1,同时也为自己选择一个初始序号seq=y,同样,它不能携带数据且要消耗掉一个序号),发送后TCP服务器进程进入同步收到状态。
然后TCP客户进程收到B的确认后,还要向B给出确认。确认报文段的ACK置为1,确认号ack=y+1,而自己的序号seq=x+1(TCP的标准规定,ACK报文段可以携带数据。但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq=x+1.)这时,TCP的连接已经建立,A进入已建立连接状态。
当B收到A的确认后,也进入已建立连接状态。
上面的建立连接过程就叫三次握手。用图形象的表示就是:
注意:在上图中的B发送给A的报文段,也可拆成两个报文段。可以先发送一个确认报文段(ACK=1,ack=x+1),然后再发送一个同步报文段(SYN=1,seq=y)这样的过程就变成了 四次握手,但效果一样。
5.Socket
在计算机网路中:
每一条TCP连接有两个端点,而这个端点就叫套接字(socket),根据RFC 793的定义:端口号拼接到IP地址即构成了套接字。例如:若IP地址是192.3.4.5而端口号是80,那么得到的套接字就是(192.3.4.5:80) 故 套接字socket = (IP地址:端口号)
每一条TCP连接唯一地被通信两端地两个端点所确定,即是:
TCP连接::={socket1,socket2}
但随着互联网地不断发展和技术进步,socket被赋予了额外很多意思,例如
1) 允许应用程序访问联网协议地应用程序接口API
2) 在socketAPI中有一个函数名也叫socket
3) 调用socket函数时,其返回值称为socket描述符,可简称为socket
4) 在操作系统内核中联网协议地Berkeley实现,也称为socket实现
注意:RFC是互联网标准文档。
6. tcp time wait,tcp还有哪些状态(主机名称参照前面三次握手题目)
答:TCP 的TIME-WAIT状态是出现在TCP的连接释放过程中的,具体是这样的:
当数据传输结束后,通信的双方在未释放连接时还是处于已建立连接状态,现在我们需要释放连接,释放过程如下:
A的应用程序先向其TCP连接发出连接释放报文段并停止发送数据,主动关闭TCP连接。 A把连接释放报文段首部的终止控制位FIN置1,其序号seq=u(它等于前面已传送过的数据的最后一个字节的序号加1),这时A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。
然后B收到连接释放报文段后立即发出确认,确认号是ack=u+1,而这个报文段的序号是seq=v(等于B前面已传送过的数据的最后一个字节的序号加1).然后B进入CLOSEWAIT(关闭等待)状态。B的TCP服务器进程这时应通知应用程序,因而从A到B这个方向的连接就释放了,这时的TCP连接处于半关闭状态(就是A已经没有数据要发送了,但B如果发送数据,A仍然要接受,换句话说,B到A的连接未关闭)
其次A收到来自B的确认后,A就进入FIN-WAIT-2(等待终止2)状态,等待B发出连接释放报文段。
如果B没有要向A发送的数据,其应用程序就会通知TCP释放连接,这时B发出的连接释放报文段必须让FIN=1。现在假定B的序号为w,B还必须重复上次已发送过的确认号ack=u+1.这时B进入LAST-ACK(最后确认)状态,等待A的确认。
然后A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1,确认号ack=w+1,而自己的序号是seq=u+1,然后进入TIME-WAIT(时间等待)状态。 这时TCP连接还没被释放掉,必须经过时间等待计时器设置的时间2MSL(最长报文段寿命,RFC 793建立2分钟)后,A才进入到CLOSED状态 。
用图形象的表示为:
7.HTTP状态码
状态码都是三位数字,分为5类,这5类的状态码都是以不同的数字开头的:
1XX表示通知消息,如请求收到了或者正在进行处理
2XX表示成功
3XX表示重定向,如要完成请求还必须采取进一步的行动
4XX表示客户的差错,如请求中有错误的语法或者不能完成
5XX表示服务器的差错,如服务器失效无法完成请求
(具体的请自行百度学习)
8.HTTP协议
HTTP是一个应用层协议,它使用TCP连接进行可靠的传送。它定义了浏览器怎样向万维网服务器请求万维网文档以及服务器怎样把文档传送给浏览器,从层次的角度看,HTTP是面向事务的应用层协议,它是万维网上能够可靠地交换文件的重要基础。(注意HTTP不仅传送完成超文本跳转所必须的信息,而且也传送任何可以从互联网上得到的信息,如文本,超文本,声音和图像等)。
万维网的大致工作过程如图:
那么它是如何通过TCP进行通信的呢?
每个万维网网点都有一个服务器进程,它不断地监听TCP的端口80,以便发现是否有浏览器向它发出连接建立请求,一旦监听到连接建立请求并通过TCP建立连接后,浏览器就可以向万维网服务器发出浏览某个页面的请求,服务器接着就返回所请求的页面作为响应。 最后TCP连接就被释放了。
HTTP无状态含义:HTTP协议本身是无连接的,虽然HTTP使用了TCP连接,但是通信双方在交换HTTP报文之前不需要建立HTTP连接。也就是说,同一个客户第二次访问同一个服务器上的页面时,服务器的响应和第一次访问是一样的(因为服务器并不记得曾经访问过的这个客户,也不记得该客户曾经服务过多少次),正是因为这个原因,往往会造成很多不必要的开销。
我们先来粗略的估计一下一次请求完成需要的时间:用户在点击鼠标链接到某个万维网文档时,HTTP协议首先和服务器建立TCP连接(这需要三次握手 ,需要花费时间),然后进行传输HTTP报文:
从图中可以看出请求一个万维网文档所需的时间是该文档的传输时间加两倍的往返时间RTT(这就是不必要的开销)
好在在HTTP/1.1中较好的解决了这个问题,它使用了持续连接,就是万维网服务器可以继续在发送响应后仍然在一段时间内保持这条TCP连接,使同一个客户和该服务器可以继续在这条连接上传送后续的数据传输。 其中持续连接有两种工作方式:非流水线方式和流水线方式,非流水方式的特点是客户在收到前一个响应后才能发出下一个请求。 流水方式的特点是客户在收到HTTP的响应报文之前就可以接着发送新的请求报文。