java网络通信最常见的面试题总结 - Go语言中文社区

java网络通信最常见的面试题总结






1.在浏览器输入一个URL至页面呈现,网络上都发生了什么?

  浏览器查找URL是否存在缓存,并比较缓存是否过期

  DNS域名解析:通过域名解析获取到IP地址

  TCP连接:通过IP地址找到对应的服务器,浏览器和服务器之间建立TCP连接.

  HTTP请求:服务器接受到HTTP请求包后才开始处理请求包

  HTTP响应:服务器接收到请求后,调用自身的服务,返回HTTP Response包,主要包括状态码,响应头,响应报文三个部分

  浏览器页面渲染:客户端接收到来自服务器的响应后开始渲染这个Response包的主体(body)

  关闭TCP连接:等收到全部内容随后断开与服务器之间的TCP连接
  
  
  




2.传输控制协议TCP和用户数据报协议UDP的区别?

  连接性:UDP面向非连接,TCP面向连接

  可靠性:UDP不提供可靠交付,TCP提供可靠性交付,通过TCP传输的数据:无差错,不丢失,不重复,且按序到达
  连接对象个数:UDP支持一对一,一对多,多对一和多对多交互通信,TCP只能是一对一通信
  传输方式:UDP面向报文,TCP面向字节流

  实时性:UDP具有较好的实时性,工作效率比TCP高

  首部开销UDP首部开销小,仅8字节,TCP首部最小20字节,最大60字节

  应用场景:

  UDP:对数据传输的实时性要求较高,但不对传输质量有要求.比如视频传输,实时通信. 日常生活中,常见使用UDP协议的应用:QQ语音,QQ视频,TFTP
  TCP:对数据的传输质量要求较高,但对实时性要求不高的情况,因为传输中需要对数据确认、重发、排序等操作,相比之下效率没有UDP高。比如:文件传输(准确高要求高、但是速度可以相对慢)、接受邮件、远程登录。比如HTTP,HTTPS,FTP等传输文件的协议以及POP,STMP等传邮件传输的协议,




扩展:

运行在TCP上的协议

  HTTP(Hypertext Transfer Protocol,超文本传输协议),主要用于普通浏览。
  HTTPS(HTTP over SSL,安全超文本传输协议),HTTP协议的安全版本。
  FTP(File Transfer Protocol,文件传输协议),用于文件传输。
  POP3(Post Office Protocol, version 3,邮局协议),收邮件用。
  SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),用来发送电子邮件。
  TELNET(Teletype over the Network,网络电传),通过一个终端(terminal)登陆到网络。
  SSH(Secure Shell,用于替代安全性差的TELNET),用于加密安全登陆用。



运行在UDP上的协议

  BOOTP(Boot Protocol,启动协议),应用于无盘设备。
  NTP(Network Time Protocol,网络时间协议),用于网络同步。
  DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),动态配置IP地址

  
  
  
运行在TCP和UDP协议上:

  DNS(Domain Name Service,域名服务),用于完成地址查找,邮件转发等工作。
  
  
  
  
  

3.TCP如何保证可靠?




  (1)连接管理机制:三次握手,四次挥手

  (2)确认应答机制:发送方接收到已发送数据的确认报文(ACK=1),则继续传输下一个数据

  (3)序列号:保证数据按序到达,去除可重复数据,提高效率,可实现多次发送一次确认

  (4)流量控制:TCP通过滑动窗口进行流量控制

  (5)超时重传:当报文发送了一段时间内未接收到接受方的确认,发送方就会进行重传

  (6)拥塞控制:引入慢启动机制,先发出少量数据,先摸清当前的网络拥堵状态后,再决定按照多大的速度传送数据.引入拥塞窗口

  (7)校验和
  
  
  




4.TCP的三次握手,四次挥手

参考链接:https://blog.csdn.net/ThinkWon/article/details/104903925


  TCP可以看成是一种字节流,它会处理IP层或以下的层的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在TCP头部。

  一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。一个TCP连接通常分为三个阶段:连接、数据传输、退出(关闭)。通过三次握手建立一个链接,通过四次挥手来关闭一个连接。

了解三次握手四次挥手前需要知道这几个字段:
(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。

(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。

(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
  ACK:确认序号有效。
  FIN:释放一个连接。
  PSH:接收方应该尽快将这个报文交给应用层。
  RST:重置连接。
  SYN:发起一个新连接。
  URG:紧急指针(urgent pointer)有效


三次握手:

  第一次握手 :客户端向服务器发送带有标志位SYN=1序列号seq=x的数据包,客户端进入SYN_SED状态,服务器接收到SYN包(服务器确认客户端具有发送功能,自己具有接收功能)

  第二次握手:服务端收到客户端发过来的报文后,发现SYN=1,知道这是一个连接请求,于是将客户端的起始序列号x存起来,并且随机生成一个服务端的起始序列号y然后给客户端回复一段报文,回复报文包含SYN和ACK标志(也就是SYN=1,ACK=1)、序列号seq=y、确认号ack=x+1(客户端发过来的序列号+1)。服务器进入SYN_RECV状态,称为半连接状态(客户端确认服务器具有接收和发送功能,自己具有发送和接收功能)

  第三次握手:客户端收到服务端的回复后发现ACK=1并且ack=x+1,于是知道服务端已经收到了序列号为x的那段报文;同时发现SYN=1,知道了服务端同意了这次连接,于是就将服务端的序列号y给存下来。然后客户端再回复一段报文给服务端,报文包含ACK标志位(ACK=1)、ack=y+1(服务端序列号+1)、seq=x+1,当服务端收到报文后发现ACK=1并且ack=y+1,就知道客户端收到序列号为y的报文了,就这样客户端和服务端通过TCP建立了连接。最后双方都进入ESTAB-LISHED状态,(服务器确定客户端具有接收功能,自己具有发送功能)

注意:三次握手的本质是确认通信双方收发数据的能力。



四次挥手:

  比如客户端初始化的序列号ISA=x,服务端初始化的序列号ISA=y。TCP连接成功后客户端总共发送了1000个字节的数据,服务端在客户端发FIN报文前总共回复了2000个字节的数据。



  第一次挥手:当客户端的数据都传输完成后,客户端向服务端发出连接释放报文(当然数据没发完时也可以发送连接释放报文并停止发送数据),释放连接报文包含FIN标志位(FIN=1)、序列号seq=x+1+1000(其中的1是建立连接时占的一个序列号)。需要注意的是客户端发出FIN报文段后只是不能发数据了,但是还可以正常收数据;另外FIN报文段即使不携带数据也要占据一个序列号。客户端进入FIN_WAIT_1状态

  第二次挥手:服务端收到客户端发的FIN报文后给客户端回复确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=seq+1(客户端FIN报文序列号seq+1)、序列号seq=y+2000。此时服务端处于CLOSE_WAIT关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。

  第三次挥手::服务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文,报文包含FIN和ACK标志位(FIN=1,ACK=1)、确认号和第二次挥手一样ack=seq+1、序列号seq=y+2000+50,服务器进入LAST_ACK状态

  第四次挥手:客户端收到服务端发的FIN报文后,向服务端发出确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=y+2000+50+1、序列号seq=x+1+1000+1。客户端进入TIME_WAIT状态,注意客户端发出确认报文后不是立马释放TCP连接,而是要经过2MSL(最长报文段寿命的2倍时长)后才释放TCP连接。而服务端一旦收到客户端发出的确认报文就会立马释放TCP连接,所以服务端结束TCP连接的时间要比客户端早一些。最后客户端和服务器都进入CLOSED状态.

  
注意:为什么连接是三次而断开连接要四次挥手?

因为只有在客户端和服务端都没有数据要发送的时候才能断开TCP。
而客户端发出FIN报文时只能保证客户端没有数据发了,服务端还有没有数据发客户端是不知道的。
而服务端收到客户端的FIN报文后只能先回复客户端一个确认报文来告诉客户端我服务端已经收到
你的FIN报文了,但我服务端还有一些数据没发完,等这些数据发完了服务端才能给客户端发FIN报
文(所以不能一次性将确认报文和FIN报文发给客户端,就是这里多出来了一次)。

为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接?

这里同样是要考虑丢包的问题,如果第四次挥手的报文丢失,服务端没收到确认ack报文就会重发第三次挥手的报文,这样报文一去一回最长时间就是2MSL,所以需要等这么长时间来确认服务端确实已经收到了。





5.常见的状态码有哪些?

  1xx:指示信息,表示请求已接受,继续处理
  2xx:成功(这系列表明请求被正常处理了)
  3xx:重定向(表明浏览器要执行特殊处理)
  4xx:客户端错误
  5xx:服务器端错误





常见状态码:


  200: 请求成功,请求所希望的响应头或数据体将随此返回

  202: 服务器已接受请求,但尚未处理

  204: 请求处理成功,但没有任何资源可以返回给客户端,一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。

  206: 服务器已经成功处理了部分 GET 请求。大概就是浏览器先不下载要下载的文件,而是弹窗告诉用户,该文件是什么,有多大。由用户自行决定是否下载。
   



  
  301: 请求的URL已经移走。Response中应该包含一个Location URL,说明资源现在所处的位置

  302 Found资源的URI已临时定位到其他位置了,临时性重定向。和301相似,但302代表的资源不是永久性移动,只是临时性性质的。

  303 See Other:该状态码表示由于请求对应的资源存在着另一个URL,应使用GET方法定向获取请求的资源。303状态码和302状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源

  当301,302,303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送。

  304 Not Modified:资源已找到,但未符合条件请求。该状态码表示客户端发送附带条件的请求时服务端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回304.。

  307 Temporary Redirect:临时重定向。与302有相同的含义。但是期望客户端保持请求方法不变向新的地址发出请求

  
  



  400 Bad Request服务器端无法理解客户端发送的请求,请求报文中可能存在语法错误。

  401 Unauthorized:该状态码表示发送的请求需要有通过HTTP认证(BASIC认证,DIGEST认证)的认证信息。

  403 Forbidden不允许访问那个资源。该状态码表明对请求资源的访问被服务器拒绝了。(权限,未授权IP等)

  404 Not Found请求资源不存在,输入了错误的URL






  500 Internal Server Error貌似内部资源出故障了。该状态码表明服务器端在执行请求时发生了错误。也有可能是web应用存在bug或某些临时故障。

  503 Service Unavailable:抱歉,我现在正在忙着。该状态码表明服务器暂时处于超负载或正在停机维护,现在无法处理请求。

HTTP状态码详解
参考链接:https://blog.csdn.net/qq_35689573/article/details/82120851
  
  
  

6.get和post区别是什么?
  
  Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE,URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。

GET:从服务器上获取数据,也就是所谓的查,仅仅是获取服务器资源,不进行修改。
POST:向服务器提交数据,这就涉及到了数据的更新,也就是更改服务器的数据。

参考:https://www.jianshu.com/p/af76537d098d
  
  
post和get的区别如下:
  
  传送目的: GET一般用于获取/查询资源信息,而POST一般用于更新资源信息

  传送方式GET通过地址栏传输,POST通过报文传输。

  传送长度GET参数有长度限制(受限于url长度),而POST无限制

  安全性: POST的安全性要比GET的安全性高。
  比如:通过GET提交数据,GET请求的用户名和密码会暴露在地址栏中,因为
     (1)登录页面有可能被浏览器缓存
     (2)其他人查看浏览器的历史纪录,那么别人就可以拿到账号和密码,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击
    
    
    
   GET产生一个TCP数据包;POST产生两个TCP数据包
     对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

     而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

    
    
    
补充:
  GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

  GET产生的URL地址可以被Bookmark(书签),而POST不可以。

  GET在浏览器回退时是无害的,而POST会再次提交请求。

  GET请求只能进行url编码,而POST支持多种编码方式。

    
    
    

7.滑动窗口

滑动窗口机制是TCP的一种流量控制方法,该机制允许发送方在停止并等待确认前连续发送多个分组
而不必每发送一个分组就停下来等待确认,从而增加数据传输的速率提高应用的吞吐量。

问题引入:

    
    
     之前,我们通过发送方发送包1,接收方确认包1,接受方发送包2,发送方接受包2。一直下去。直到数据发送完为止,来保证发送方与接收方之间,每个包都能被收到。并且是按次序。但问题是吞吐量很低。

解决:

    
    
     每次多发几个包,收到第一个确认包后就把第三个包发过去,而不是等第二个包确认后才去发第三个包。----->引出滑动窗口
    
    
滑动窗口的实现:
    
    
在这里插入图片描述
     在图中可以看出,1、2、3号包已发送完毕,且都已接收到ACK,这些包就成为过去式,4、5、6、7号包是黄色的,表示已经发送了,但是没有收到ACK,所以也不知道接受方有没有收到。8、9、10是接下来要准备发送的包,可以看出窗口刚好是7格,10后面的还没有读进内存。要等4-10号包接下来有动作后我们的包才会继续往下发送。
    
    
    
    
    
在这里插入图片描述

     可以看到4号包已ACK,所以变为灰色,窗口向前滑动一格,这里只要保证窗口的大小是7格的,则11号被读进缓存,进入了待发送的状态,8号包变成了黄色表示已经被发送出去了,接下来的操作就是一样的了,确认包后,窗口往后移继续将未发送的包读进缓存,把“待发送”状态的包变为“已发送”
    
    
    
    

在这里插入图片描述
丢包情况:
     有可能我们的包发过去,中途丢了,有可能对方发的ACK丢了从发送方的角度看我们就是没有收到ACK。

发生的情况:
     一直等ACK如果一直等不到的话,我们也会把读进缓存的待发送的包也一起发送过去,但是这个时候我们的窗口已经发满了。所以并不能把12号包读进来,而是始终在等待5号包的Ack。
    
    
    
    
    
    
如果我们这个Ack始终不来怎么办呢?------超时重发

     这里有一点要说明:这个Ack是要按顺序的。必须要等到5的Ack收到,才会把6-11的Ack发送过去。这样就保证了滑动窗口的一个顺序。-------解决了乱序问题
    
    
    

在这里插入图片描述
     这时候可以看出5、6、7、8号包已经发送过去且已Ack。窗口便继续向后移动。
    
    
    
    
    
    

总结:
     为了增加网络的吞吐量,想将数据包一起发送过去,这时候便产生了“滑动窗口”这种协议。有了“滑动窗口”这个概念,我们又解决了其中出现的一些问题。

丢包:通过重发的机制解决。
乱序
  发送窗口收到接收端对于本段窗口内字节的 ACK 确认才会移动发送窗口的左边界。
  接收窗口只有在前面所有的包都确认的情况下才会移动左边界,当前面还有包未接收但收到后面包的情况下(乱序)窗口是不会移动的,并不对后续包确认, 确保这段数据重传。
参考链接:https://www.cnblogs.com/coder-programming/p/10627746.html
    
    
    
    
8.拥塞控制
   流量控制解决了两台主机之间因传送速率而可能引起的丢包问题,在一方面保证了TCP数据传送的可靠性。然而如果网络非常拥堵,此时再发送数据就会加重网络负担,那么发送的数据段很可能超过了最大生存时间也没有到达接收方,就会产生丢包问题。

   为此TCP引入慢启动机制,先发出少量数据,就像探路一样,先摸清当前的网络拥堵状态后,再决定按照多大的速度传送数据。

此处引入一个拥塞窗口:
   发送开始时定义拥塞窗口大小为1;每次收到一个ACK应答,拥塞窗口加1;而在每次发送数据时,发送窗口取拥塞窗口与接送段接收窗口最小者。
慢启动:在启动初期以指数增长方式增长;设置一个慢启动的阈值,当以指数增长达到阈值时就停止指数增长,按照线性增长方式增加;线性增长达到网络拥塞时立即“乘法减小”,拥塞窗口置回1,进行新一轮的“慢启动”,同时新一轮的阈值变为原来的一半。

后期再更新拥塞窗口
    
    
    
    
9.http与https区别?

  Http协议运行在TCP之上,用来在 Internet 上传送超文本的传送协议,它可以使浏览器更加高效,使网络传输减少。但 HTTP 协议采用明文传输信息,客户端与服务器端都无法验证对方的身份,存在信息窃听、信息篡改和信息劫持的风险。
  Https是身披SSL(Secure Socket Layer)外壳的Http,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP。二者之间存在如下不同:
    
    
协议:HTTP运行在 TCP 之上,明文传输,客户端与服务器端都无法验证对方的身份,HTTPS身披 SSL外壳的 HTTP,运行于 SSL 上,SSL 运行于 TCP 之上, 是添加了加密和认证机制的 HTTP。

端口不同:用的端口不一样,前者是80,后者是443

资源消耗:和Http通信相比,Https通信会由于加减密处理消耗更多的CPU和内存资源

开销:Https通信需要到CA机构申请SSL证书,而证书一般需要向认证机构购买

安全性:Http无状态传输,HTTPS协议是共享密钥加密和公开密钥加密并用的混合加密机制,要比Http协议安全

传输方式:Http明文传输,Https是密文传输
连接方式:Http与Https使用不同的连接方式,https连接过程需细看
    
    
    
    
10.什么是对称加密和非对称加密?



对称密钥加密

  是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;



非对称加密

  是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。

  由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,非常的慢

参考链接:https://blog.csdn.net/ThinkWon/article/details/104903925
    
    
    
    
11.HTTP中重定向和转发的区别
  
本质区别:转发是服务器行为,重定向是客户端行为

  重定向:两次请求,浏览器地址发生变化,可访问自身web之外的资源,传输的数据会丢失
  请求转发:一次请求,地址不变,访问自身web资源,传输的数据不会丢失
    
    
    
    
12.TCP/IP协议中每个层都有哪些协议?

  TCP/IP是一个四层的体系结构,主要包括:应用层、运输层、网际层和网络接口层。不过从实质上讲,TCP/IP 只有最上面的三层,因为最下面的网络接口层并没有什么具体内容。

    
应用层:应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则

   FTP(21)文件传输协议:一般上传下载用FTP服务
   Telnet(23)远程登陆协议:使用明码传送,保密性差、简单方便。
   SMTP(25)电子邮件协议:用来控制信件的发送、中转
   DNS(53):域名解析服务:提供域名到IP地址之间的转换
   HTTP(80):超文本传输协议:用于实现互联网中的WWW服务
   SNMP(161)简单网络管理协议:主要实现网络监控
   NFS网络文件服务协议:用于网络中不同主机间的文件共享。
   HTTPS(443)安全超文本传输协议

    
    
传输层:运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务

   UDP:传输控制协议,提供的是面向连接、可靠的基于字节流的传输层通信协议
   TCP:用户数据报协议,是一个简单的面向数据报的运输层协议,不提供可靠性
    
    
网络层:网络层的任务就是选择合适的网间路由和交换结点,确保计算机通信的数据及时传送

   IP:是网络层的核心,通过路由选择将下一条IP封装后交给接口层。IP数据报是无连接服务
   ICMP:控制报文协议,
   IGMP:Internet组管理协议
   ARP协议:地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议。
   RARP协议:反向地址转换协议

参考链接https://www.cnblogs.com/zoe233/p/11823882.html
    
    
    
    
    
    
    
    
13.什么是HTTP2

HTTP2 提高了网页的性能

  在 HTTP1 中浏览器限制了同一个域名下的请求数量(Chrome 下一般是六个),当在请求很多资源的时候,由于队头阻塞当浏览器达到最大请求数量时,剩余的资源需等待当前的六个请求完成后才能发起请求。

  HTTP2 中引入了多路复用的技术,这个技术可以只通过一个 TCP 连接就可以传输所有的请求数据。多路复用可以绕过浏览器限制同一个域名下的请求数量的问题,进而提高了网页的性能。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_44268113/article/details/109155870
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2023-01-03 16:51:12
  • 阅读 ( 311 )
  • 分类:面试题

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢