Java面试题 -网络

1. TCP建⽴连接的过程

三次握⼿:

  1. 第⼀次握⼿(客户端发送syn包到服务器端):客户端发送syn包到服务器端,进⼊syn_send状态,等待服务器端的确认;
  2. 第⼆次握⼿(服务器返回syn+ack包给客户端):服务器端收到客户端的syn包,发送syn+ack包给客户端,进⼊syn_recv状态;
  3. 第三次握⼿(客服端返回ack包给服务端):客户端收到服务器端的syn+ack包,发送个ack包到服务器端,⾄此,客户端与服务器端进⼊established状态;
  4. 握⼿过程中传送的包不包含任何数据,连接建⽴后才会开始传送数据,理想状态下,TCP连接⼀旦建⽴,在通信双⽅的任何⼀⽅主动关闭连接前,TCP连接都会⼀直保持下去。

2. TCP断开连接的过程

四次ഀ⼿:

  1. 第一次挥⼿:主动关闭⽅发送fin包到被动关闭⽅,告诉被动关闭⽅我不会再给你发送数据了;
  2. 第⼆次挥⼿:被动关闭⽅收到syn包,发送ack给对⽅,确认序号为收到序号+1;
  3. 第三次挥⼿:被动关闭⽅也也发送fin包给主动关闭⽅,告诉对⽅我也不会给你发送数据了;
  4. 第四次挥⼿:主动关闭⽅收到syn包,发送ack给对⽅,⾄此,完成四次挥⼿;

3. 浏览器发⽣302跳转背后的逻辑?

浏览器在原请求地址的响应的Location域找到要跳转的URI执⾏跳转。

浏览器输⼊URL后发⽣了什么:

  1. DNS域名解析;
  2. 建⽴TCP连接;
  3. 发送HTTP请求;
  4. 服务器处理请求;
  5. 返回响应结果;
  6. 关闭TCP连接;
  7. 浏览器解析HTML;
  8. 浏览器布局渲染;

4. HTTP协议的交互流程。 HTTP和HTTPS的差异, SSL的交互流程?

Http协议:

  1. 建⽴TCP连接;
  2. 发送HTTP请求;
  3. 服务器处理请求;
  4. 返回响应结果;
  5. 关闭TCP连接;

http三次握⼿:
Java面试题 -网络
第⼀次握⼿:客户端发送syn包(syn=j)到服务器,并进⼊SYN_SEND状态,等待服务器确认;

第⼆次握⼿:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时⾃⼰也发送⼀个SYN包(syn=k),即SYN+ACK包,此时服务器进⼊SYN_RECV状态;

第三次握⼿:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进⼊ESTABLISHED状态,完成三次握⼿。

HTTPS协议:

  • HTTPS协议就是基于SSL的HTTP协议
  • HTTPS使⽤与HTTP不同的端⼝(HTTPS80 , HTTPSS443)提供了身份验证与加密通信⽅法,被⼴泛⽤于互联⽹上安全敏感的通信。

Java面试题 -网络
1.客户端请求SSL连接,并将⾃⼰⽀持的加密规则发给⽹站。

2.服务器端将⾃⼰的身份信息以证书形式发回给客户端。证书⾥⾯包含了⽹站地址,加密公钥,以及证书的颁发机构。

3.获得证书后,客户要做以下⼯作

  • 验证证书合法性
  • 如果证书受信任,客户端会⽣成⼀串随机数的密码,并⽤证书提供的公钥进⾏加密。
    将加密好的随机数发给服务器。

4.获得到客户端发的加密了的随机数之后,服务器⽤⾃⼰的私钥进⾏解密,得到这个随机数,把这个随机数作为对称加密的**。(利⽤⾮对称加密传输对称加密的**)

5.之后服务器与客户之间就可以⽤随机数对各⾃的信息进⾏加密,解密。

注意的是:证书是⼀个公钥,这个公钥是进⾏加密⽤的。⽽私钥是进⾏解密⽤的。公钥任何都知道,私钥只有⾃⼰知道。这是⾮对称加密。⽽对称加密就是钥匙只有⼀把,我们都知道。之所以⽤到对称加密,是因为对称加密的速度更快。⽽⾮对称加密的可靠性更⾼。

流程:客户端请求–服务端发送证书(公钥)–客户端验证证书,并⽣成随机数,通过公钥加密后发送给服务端–服务端⽤私钥解密出随机数–对称加密传输数据。

HTTP与HTTPS的区别:

  1. HTTPS协议需要申请证书。
  2. HTTP是明⽂传输;HTTPS使⽤的是具有安全性的SSL加密传输协议
  3. HTTP端⼝是80;HTTPS端⼝号是443
  4. HTTP连接简单⽆状态;HTTPS由SSL+HTTP协议构件的可进⾏加密传输、身份验证的⽹络协议。

5. Rest和Http什么关系?⼤家都说Rest很轻置,你对Rest⻛格如何理解?

Http是⼀种协议,Rest是⼀种软件架构⻛格。

URL定位资源,⽤HTTP动词(GET,POST,DELETE,DETC)描述操作。

GET表示查询、POST表示新建、PUT表示更新、DELETE表示删除等。

  • GET /api/v1/user 获取⽤户列表
  • GET /api/v1/user/1 获取ID为1的⽤户
  • POST /api/v1/user 新建⽤户
  • PUT /api/v1/user/1 更新ID为1的⽤户信息
  • DELETE /api/v1/user/1 删除ID为1的⽤户

1、概念:REST(英⽂:Representational State Transfer,简称REST,表现层状态转化),指的是⼀组架构约束条件和原则。满⾜这些约束条件和原则的应⽤程序或设计就是 RESTful。

2、⼀种软件架构⻛格,设计⻛格⽽不是标准,只是提供了⼀组设计原则和约束条件。它主要⽤于客户端和服务器交互类的软件。基于这个⻛格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

3、Restful架构:

  1. 每⼀个URI代表⼀种资源;
  2. 客户端和服务器之间,传递这种资源的某种表现层;
  3. 客户端通过四个HTTP动词(GET⽤来获取资源,POST⽤来新建资源(也可以⽤于更新资源),PUT⽤来更新资源,DELETE⽤来删除资源。),对服务器端资源进⾏操作,实现"表现层状态转化”。

6. TCP的滑动窗⼝协议有什么⽤?讲讲原理。

滑动窗⼝协议是传输层进⾏流控的⼀种措施,接收⽅通过通告发送⽅⾃⼰的窗⼝⼤⼩,从⽽控制发送⽅的发送速度,从⽽达到防⽌发送⽅发送速度过快⽽导致来不及接受。

7. HTTP协议都有哪些⽅法?

  1. GET 请求获取由Request-URI所标识的资源。
  2. POST 在Request-URI所标识的资源后附加新的数据。
  3. HEAD 请求获取由Request-URI所标识的资源的响应消息报头。
  4. OPTIONS 请求查询服务器的性能,或查询与资源相关的选项和需
    求。
  5. PUT 请求服务器存储⼀个资源,并⽤Request-URI作为其标识。
  6. DELETE 请求服务器删除由Request-URI所标识的资源。
  7. TRACE 请求服务器回送收到的请求信息,主要⽤语测试或诊断。

8. 交换机与路由器的区别?

1、⼯作层次不同

  • 最初的交换机⼯作在OSI模型中的数据链路层,⼯作原理简单路由器⼯作在OSI模型中的⽹络层,得更多协议信息,做更智能的转发决策

2、数据转发所依据的对象不同

  • 交换机是利⽤物理地址(MAC地址),确定转发的⽬的地址。(MAC固化硬件,⼀般不可更改)
  • 路由器是利⽤IP地址,确定转发的⽬的地址。(IP通常为⽹关或系统⾃动分配的)

3、是否可以分割⼴播域

  • 传统的交换机可以分割冲突域,不能分割⼴播域,⽽路由器可以分割⼴播域
  • 由交换机连接的⽹段仍然属于同⼀⼴播域,⼴播数据报会在交换机连接的所有⽹段上传播,某些情况导致通信拥೿和安全漏洞。连接到路由器上的⽹段被分配成不同的⼴播域,所以,⼴播数据不穿过路由器
  • 虽然三层交换机可以分割⼴播域,但是⼦⼴播域之间不能通信,还是需要路由器

4、路由器提供了防⽕墙的服务

  • 路由器仅仅转发特定地址的数据包,不传送不⽀持路由协议的数据包,不传送未知⽬标⽹络数据包,从⽽可以防⽌⼴播⻛暴。

5、表

  • ⼆层交换机上存在MAC表,三层交换机上存在路由表、MAC表、ARP表,路由器上存在路由表和ARP表。
  • 总之,交换机在具体的城域⽹中扮演着VLAN透传的⻆⾊,就是桥。路由器的每⼀个端⼝都是⼀个独⽴的⼴播域和冲突域,⽽交换机是只有⼀个⼴播域和端⼝数量的冲突域。

9. Socket⽹络通信、NIO流以及多线程处理技术,Netty、Mina?

1、socket⽹络通信:(NIO流以及多线程处理技术):

  • BIO:阻塞式,线程池初始时创建⼀定量线程,超过则等待;
  • NIO:⾮阻塞式,不同的线程⼲专业的事情,提⾼系统吞吐量;
  • NIO+异步处理:让少量的线程做⼤量的事情;

2、Mina
Apache Mina是⼀个能够帮助⽤户开发⾼性能和⾼伸缩性⽹络应⽤程序的框架。它通过Java nio技术基于TCP/IP和UDP/IP协议提供了抽象的、事件驱动的、异步的API。采⽤⾮阻塞⽅式的异步传输,⽀持批量传输数据。mina框架简单⾼效,完成了底层的线程管理,内置
编码器能够满⾜⼤多数⽤户的需求,省去了消息编码和解码的⼯作。

3、Netty
本质是JBoss开发的⼀个jar包,⽬的是开发⾼性能、⾼可靠性的⽹络服务和客户端服务;提供异步⾮阻塞的、事件驱动的⽹络应⽤程序的NIO框架和⼯具;处理socket;通过Future-Listener机制,⽤户可以⽅便的主动获取或者通过通知机制获得IO操作结果。

10. http协议(报⽂结构,断点续传,多线程下载,什么是⻓连接)

概念:

  • i. HTTP协议是Hyper Text Transfer Protocol(超⽂本传输协议)的缩写,是⽤于从万维⽹(WWW:World Wide Web )服务器传输超⽂本到本地浏览器的传送协议。
  • ii. HTTP是⼀个基于TCP/IP通信协议来传递数据(HTML ⽂件, 图⽚⽂件, 查询结果等)。
  • iii. HTTP是⼀个属于应⽤层的⾯向对象的协议,由于其简捷、快速的⽅式,适⽤于分布式超媒体信息系统。它于1990年提出,经过⼏年的使⽤与发展,得到不断地完善和扩展。⽬前在WWW中使⽤的是HTTP/1.0的第六版,HTTP/1.1的规范化⼯作正在进⾏之中,⽽且HTTP-NG(Next Generation of HTTP)的建议已经提出。
  • iv. HTTP协议⼯作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。

主要特点:

  1. 简单快速:客户向服务器请求服务时,只需传送请求⽅法和路径。请求⽅法常⽤的有GET、HEAD、POST。每种⽅法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模⼩,因⽽通信速度很快。
  2. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  3. ⽆连接:⽆连接的含义是限制每次连接只处理⼀个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采⽤这种⽅式可以节省传输时间。
  4. ⽆状态:HTTP协议是⽆状态协议。⽆状态是指协议对于事务处理没有记忆能⼒。缺少状态意味着如果后续处理需要前⾯的信息,则它必须重传,这样可能导致每次连接传送的数据量增⼤。另⼀⽅⾯,在服务器不需要先前信息时它的应答就较快。
  5. ⽀持B/S及C/S模式。

11. get与post区别

  1. 表单的method如果为get,那么所有的参数信息都会显示在浏览器的地址栏,当我们使⽤浏览器地址栏输⼊⽹址的⽅式来发送请求时,那么该请求⼀定是get⽅式
  2. 对于get⽅式,底层是将所有参数附加在请求资源的后⾯⼀起传递的,对于post⽅式,底层是将所有参数附加在请求参数的最后⼀⾏的下⼀⾏的下⼀⾏ Get请求的数据是被附在url之后(HTTP协议头中),POST请求数据则放置在HTTP包的包体head中;
  3. 对于get,post⽅式,servlet不同处理:doGet(),doPost();
  4. 浏览器处理:重复访问使⽤GET⽅法请求的⻚⾯,浏览器会使⽤缓存处理后续请求。使⽤POST⽅法的form提交时,浏览器基于POST将产⽣永久改变的假设,将让⽤户进⾏提交确认。

12. Nginx性能调优

  1. 增加同时打开⽂件数open files数量;
  2. 处理⼤量静态⽂件的磁盘I/O时(此时worker进程是单线程的),增加CPU核⼼数Worker Processes数量,提⾼计算能⼒;
  3. 如果⽹站流量很⾼,则可以提升worker进程连接数Worker Connections(默认1024);
  4. 控制keep alive在10s-20s之间,减少连接的时间开销;
  5. 合理设置open file cache时间提⾼处理效率;
  6. 提⾼⽹路带宽;
  7. 开启压缩传输数据gzip,设置压缩级别gzip_comp_level为1-2,再⾼效果不明显并且浪费CPU了;
  8. 扩展机器数量。

13. rpc和http的区别,使⽤场景:

<传输协议>

  • RPC,可以基于TCP协议,也可以基于HTTP协议
  • HTTP,基于HTTP协议

<传输效率>

  • RPC,使⽤⾃定义的TCP协议,可以让请求报⽂体积更⼩,或者使⽤HTTP2协议,也可以很好的减少报⽂的体积,提⾼传输效率
  • HTTP,如果是基于HTTP1.1的协议,请求中会包含很多⽆⽤的内容,如果是基HTTP2.0,那么简单的封装以下是可以作为⼀个RPC来使⽤的,这时标准RPC框架更多的是服务治理

<性能消耗,主要在于序列化和反序列化的耗时>

  • RPC,可以基于thrift实现⾼效的⼆进制传输
  • HTTP,⼤部分是通过json来实现的,字节⼤⼩和序列化耗时都⽐thrift要更消耗性能

<负载均衡>

  • RPC,基本都⾃带了负载均衡策略
  • HTTP,需要配置Nginx,HAProxy来实现

<服务治理(下游服务新增,重启,下线时如何不影响上游调⽤者)>

  • RPC,能做到⾃动通知,不影响上游
  • HTTP,需要事先通知,修改Nginx/HAProxy配置

总结:RPC主要⽤于公司内部的服务调⽤,性能消耗低,传输效率⾼,服务治理⽅便。HTTP主要⽤于对外的异构环境,浏览器接⼝调⽤,APP接⼝调⽤,第三⽅接⼝调⽤等。