Java面试——网络篇
Posted Johnny*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java面试——网络篇相关的知识,希望对你有一定的参考价值。
DNS
域名解析的过程
在浏览器输入某个网址对应的解析过程:
- 浏览器首先会搜索自身的DNS缓存是否有对应刁牧且没有过期,如果有且没有过期则解析到此为止。
- 否则,浏览器会尝试读取HOST文件,看看是否有该域名对应的IP地址,如果有则解析成功。
- 否则,浏览器会发起一个DNS的系统调用。向本地配置的首选DNS服务器(本地域名服务器)发起域名解析请求。本地域名服务器会首先查找自身缓存,找到对应条目且没有过期的则解析成功。
- 否则会通过递归或者迭代两种方式解析。
迭代:
① 本地域名服务器向根域名服务器发送请求
② 返回给本地域名服务器要向哪个顶级域名服务器查找
③ 顶级域名服务器向权限域名服务器发请求。
④返回给本地域名服务器IP地址
⑤ 返回给WIndows系统内核,最后返回给浏览器
递归:
① 本地服务器向根域名服务器发请求
② 根域名服务器向顶级域名服务器发琴秋
③ 顶级域名服务器返回给根域名服务器
④ 根域名服务器返回给本地域名服务器
⑤ 返回给windows内核,最后返回给浏览器
从输入网址到获取页面的整个过程
- 在地址输入网址。浏览器查询DNS,获取域名对应的IP地址:具体包括浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地HOST文件和向本地DNS服务器进行查询等。对于向本地DNS 服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户端,完成域名解析(此解析具有权威性);如果要查询的域名不包含在本地配置区域资源中,但该服务器已经缓存此网址映射关系,则调用这个IP地址映射,完成域名解析(此解析不具权威性)。如果本地域名服务器并未缓存该网址映射关系,那么根据其设置发起递归查询或者迭代查询。
- 浏览器获得域名对应的IP地址之后就发起三次握手,与目标服务器建立连接。
- TCP/IP连接建立起来之后,浏览器向服务器发送HTTP请求
- 服务器接收到这个请求之后,就根据刘静参数映射到特定的请求处理器进行处理,并将处理结果及相应视图返回给浏览器。
- 浏览器解析并渲染视图,若遇到js文件、css文件及图片等静态资源的引用则重复上述步骤并向服务器请求这些资源。
- 浏览器根据请求到的资源、数据渲染页面,最终向用户呈现一个 完整的页面。
TCP 和UDP
TCP和UDP有什么区别?
TCP(Transfer Control Protocol)
UDP(User Datagram Protocol)
- 连接: TCP是一种面向连接的传输控制层协议,UDP是一种无连接的传输层控制协议。
注:TCP的这个连接不是物理意义上的连接,而是逻辑意义上的连接。即在传输数据前要发起三次握手先建立起逻辑连接,然后在传输数据,在传输结束想要断开连接时要发起四次挥手。TCP提供端到端、全双工通讯。采用字节流方式,如果字节流太长,将其分段。 - 在可靠性上: TCP 是可靠传输,不丢包,丢包有重传机制。UDP是不可靠传输,其尽最大努力交付,可能丢包。
- 在传输速率上:由于TCP要保证可靠传输,所以速率会比较慢。UDP反之,只尽最大努力交付,丢包了也不管,因此速率较快。
- 首部占用空间: TCP 由于要保证可靠传输,加入了确认好、ACK、SYN、FIN 等字段,首部占用空间大(固定20字节)。而UDP 首部占用空间较小(8字节)。
- 应用场景: 基于TCP可靠传输的特点,TCP适用于浏览器、文件传输、邮件发送等。HTTP都是使用TCP,因为要求传输内容可靠,不出现丢失的情况。而UDP适用于音视频通话、直播 等对实时性要求比较高的场景。
- 系统资源占用上: TCP占用系统资源较多。UDP占用系统资源较少、
- TCP是面向字节流的,UDP是面型报文的。面向字节流是指发送数据时以字节为单位,一个数据包可以拆分为若干组进行发送,而UDP一个报文只能一次发完。
TCP就好比是打电话,要先拨打拨号震铃等待对方摘机说“喂”,然后才开始说话。支持点对点通讯。
UDP就好比是广播,不需要连接,发送方不管接收方有没有准备好,直接发送信息。即使对方没有接受到,也不会重发。UDP支持一对一、一对多、多对一、多对多。
详细描述TCP三次握手连接的过程
三次握手的过程:
- 客户端向服务端发送连接请求数据包。其中包括客户端初始序列号seq(client) = x,表明传输数据给服务端的第一个数据字节的序号是x。数据包中同步标志位SYN =1,ACK=0,表示这是一个连接请求数据报文。发送报文后,客户端有CLOSED状态进入SYN-SENT状态。
- 服务端在接受了客户端的连接请求报文之后,由LISTEN 进入SYN-RCVD状态。并向客户端发送连接确认数据包。其中包括服务器端序列号seq(server)=y,表明传输给客户端的第一个数据字节的序号是y。数据包中还包括标识位SYN=1,ACK=1.表明这是一个TCP响应数据报文,以及对客户端报文初始序列号的确认号,ack(server)=seq(client)+1=x+1,表明下一次希望收到客户端的序号是从x+1开始。
- 客户端在接收到服务端的连接确认报文之后,由SYN-SENT状态进入ESTABLISHED状态。并向服务端发送确认数据包。表明客户端接收到了服务端的连接确认。该数据包,ACK=1,seq(client)=x+1,ack(client)=seq(server)+1=y+1。
- 服务端在接受到客户端的确认数据包之后,进入ESTABLISHED 状态。连接正式建立,双方可以互发消息了。
为什么要建立三次连接,两次不行吗?
不行。
假设client第一次发起的连接请求因为网络延时,在client释放连接之后才到达server。本来这是一个失效的连接请求,但server在收到此失效请求时,误认为这是client发起的一个新的连接请求。于是向client
发出确认请求报文,同意建立连接。如果采用两次握手,那么只要server发出确认,连接就建立了。而对于client来说,并没有想连接服务端的医院,因此不会理睬server的确认也不会向server发送数据。但是server 却认为新的连接已经建立,一直等待client发送数据过来。这样server的很多资源就被拜拜浪费了。而采用“三次”握手可以防止 上述现象的发生。例如,server由于收不到确认,就知道client并没没有要求建立连接。
第三次握手失败了 怎么处理
server:此时server处于SYN-RCVD状态,若等不到client的ACK,server会重新发送SYN+ACK包.一般是每个3秒重发之前的SYN+ACK。默认重发5次,如果重发5次SYN+ACK都等不到client的ACK,就会发送RST包,强制关闭连接。
client端,会出现两种情况:
- 在server进行超时重发的过程中,如果client向server发送数据,数据头部是ACK为1的,所以服务器收到数据之后会读取ACK number,进入ESTABLISHED状态
- 在server进入closed状态之后,如果client向服务器发送数据,服务器会以RST包应答。
如果已经建立连接,但客户端出现故障怎么办?
服务器每收到一次客户端的请求后都会重新复位一个计时器,时间通常是设置为2小时,若两小时还没收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍没有反应,服务器就认为客户端出现了故障,紧接着就关闭连接了、
详细描述TCP释放连接的过程
TCP释放连接,是四次挥手的过程:
- client向server发起断开连接请求FIN数据包,该数据包中终止标志位FIN=1,用来关闭客户到服务器的数据传输。序列号seq=u,ack=v。然后由ESTABLISHED状态进入FIN-WAIT-1状态
- server接收到client的FIN数据包后,向client发送ACK确认包。ACK=1,序列号seq=v,ack=u+1。然后由ESTABLISHED状态进入CLOSE-WAIT状态。client接收到server的ACK包后由FIN-WAIT-1进入FIN-WAIT-2状态。
- server向client发送断开连接请求FIN数据包,该数据包中终止标志位FIN=1,用来关闭服务器到客户端的数据和传输。序列号seq=w,ack=u+1。然后由CLOSE-WAIT进入LAST-ACK状态。
- client接收到server的FIN数据包之后,向server发送ACK确认包。ACK=1,序列号seq=u+1,ack=w+1。然后由FIN-WAIT-2进入TIME-WAIT状态,等待2ML时间后关闭连接。
- server在接受到client的ACK确认包之后,由LAST-ACK进入CLOSE状态。
为什么不能把服务器发送ACK和FIN合并起来变成三次(CLOSE-WAIT的意义是什么?)
TCP是全双工通讯。client向server发送FIN请求,只能说明client没有数据要发送给server了。可是server可能还有数据要发送给client。因此需要等待server将该发给client的数据都发送完了,没有数据要发送了,才能发送FIN请求。所以最恰当的做法是,先回复ACK,表示server已经收到了client的断开连接请求。
如果第二次挥手时,服务端的ACK没有送达客户端,会怎么样?
客户端没有收到ACK请求,客户端会重新发起第一次挥手的FIN请求。
客户端TIME-WAIT状态的意义是什么?
第四次挥手时,客户端发送而给服务端的ACK可能丢失,TIMW-WAIT状态就是 用来重发可能丢失的ACK的。如果server没有收到ACK,就会重发FIN,如果client在2*MSL的时间内收到了FIN,就会重新发送ACK并再次等待2MSL,防止server没有收到ACK而不断重发(如果没有TIME-WAIT而是直接进入CLOSED的话,client已经关闭而server还一直发送FIN,造成资源浪费)。MSL是指一个片段在网络中的最大存活时间,2MSL就是一个发送和一个回复所需额最大时间。如果知道2MSL,client都没有再次受到FIN,那么client推断ACK已经被server成功接收,则关闭连接。
HTTP
请求报文包括哪些内容
请求行
请求头
请求体(POST请求才有)
Get请求没有请求体
POST 请求
响应报文包括哪些内容?
状态行、响应首部字段、响应体
一次完整的HTTP请求经历那几个 步骤
- 三次握手建立TCP连接
- web浏览器向服务器发送请求行
一旦建立TCP连接,web浏览器就会向浏览器发送请求命令。如 GET /hello/ HTTP/1.1 - web浏览器发送请求头
浏览器发送其请求命令之后,还要以头信息形式向Web服务器发送一些别的信息,之后浏览器发送一空白行来通知服务器,它已经结束了该头信息的发送 - 服务器响回送状态行
浏览器向服务器发出请求后,服务器会向客户端回送应答,HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码 - 服务器回送响应头
服务器向用户 发送关于自己的数据的文档 - 服务器向浏览器发送数据
服务器向浏览器发送头信息后,会 发送一个空白行来表示头信息的发送到此为止。诘责以contentType字段所描述的格式发送用户所请求的实际数据。 - 关闭TCP连接
Socket和HTTP的区别和应用场景
- socket连接是所谓的长连接,理论上客户端和服务器一旦建立连接将不会主动断掉。而HTTP就是所谓的短连接,即客户端向服务器发送一次请求,服务器响应后连接可会断开等待下次连接。
- HTTP适用场景:网站、互联网服务。 socket适用场景:网络游戏、直播、在线视频。
请描述HTTPS和HTTP的区别
HTTPS 就是在HTTP基础上加上加密处理(一般是SSL安全通信线路)+认证+完整性保护。
- 端口不一样: HTTP是80端口,HTTPS是443端口。
- HTTP是超文本传输协议,信息是明文传输,HTTPS是安全性的SSL加密传输协议
- HTTPS需要申请CA 证书,而证书是需要收费。HTTP无需证书,是免费的。
- HTTPS和HTTP使用的是完全不同的连接方式,HTTP连接很简单是无状态的;HTTPS协议是SSL+HTTP协议构建的可进行传输加密、身份认证的网络协议,比HTTP协议安全。
HTTPS的缺点:
5. HTTPS的建立连接的过程比较费时,因为还牵扯到证书加密和认证。所以会影响服务的响应速度以及吞吐量。
6. HTTPS也并不是完全安全的,它的证书 体系起始并不是完全安全的(存在 伪造的可能)并且HTTPS在面对 DDOS这样的攻击时,几乎起不到任何作用,反而会增加服务开销。
HTTP版本的对比
HTTP1.版本特性:
- 早先的1.0HTP版本,是一种无状态,无连接的应用层协议
- HTTP1.0规定浏览器和服务器保持短暂的连接,浏览器每次请求都需要与服务器建立一次TCP连接,服务器处理完成后立即断开TCP(无连接),服务器不跟踪每个客户过去的请求(无状态)。
HTTP1.1版本特性:
- 默认持久连接,节省通信量。只要客户端、服务端任意一端没有明确提出断开TCP连接,就一直保持连接,可以发送多次HTTP请求。但是同一 时间一个连接只能对应一个请求。针对同一个域名,大多数浏览器允许同时最多6个并发请求链接。
HTTP2.0版本特性:
- 二进制分帧。 HTTP2.0采用二进制格式传输数据,而非HTTP1.0的文本格式。二进制格式在协议的解析和优化上带来更多的优势和可能。
- 多路复用。客户端和服务器可以将HTTP消息分解为互不依赖的帧,然后交错发送,最后再在一端将他们重新组装起来。
- 首部压缩。 HTTO2.0使用HPACK压缩 请求头和响应头。可以极大减少头部开销,进而提高性能。
- 优先级。
- 服务器推送。 服务器可以对一个客户端请求发送多个响应。 除了最初的响应之外,服务器还可以向客户端推送额外资源而无需客户端额外明确地请求。
暂时就写这么多了,后面再一边刷题一边总结吧。
以上是关于Java面试——网络篇的主要内容,如果未能解决你的问题,请参考以下文章