【Java】常见面试题:网络

努力经营当下 直至未来明朗!


1. 为什么需要网络协议的分层?

1)分层最大的好处,类似于面向接口编程:定义好两层间的接口规范,让双方遵循这个规范来对接。
2)在代码中,类似于定义好一个接口,一方为接口的实现类(提供方,提供服务),一方为接口的使用类(使用方,使用服务):
对于使用方来说,并不关心提供方是如何实现的,只需要使用接口即可
对于提供方来说,利用封装的特性,隐藏了实现的细节,只需要开放接口即可。
3)这样能更好的扩展和维护。
1

2. 【封装和分用】

  1. TCP/IP五元组:(下到上)物理层、数据链路层(帧)、网络层(IP、数据报)、传输层(TCP/UDP、段)、应用层
  2. 封装:从上到下进行封装,在各层加上需要的协议头和尾。传输层加上源端口和目的端口,网络层加上源IP和目的IP,数据链路层加上源MAC地址和目的MAC地址。
  3. 分用:从下到上逐层拿去协议的头尾。

3. Socket套接字主要针对传输层协议划分为如下三类(了解)

  1. 流套接字:使用传输层TCP协议
    ① TCP,即Transmission Control Protocol(传输控制协议),传输层协议。
    ② 以下为TCP的特点:

有连接
可靠传输
面向字节流
有接收缓冲区,也有发送缓冲区
大小不限

③ 对于字节流来说,可以简单的理解为,传输数据是基于IO流,流式数据的特征就是在IO流没有关闭的情况下,是无边界的数据,可以多次发送,也可以分开多次接收

  1. 数据报套接字:使用传输层UDP协议
    ① UDP,即User Datagram Protocol(用户数据报协议),传输层协议。
    ② 以下为UDP的特点:

无连接
不可靠传输
面向数据报
有接收缓冲区,无发送缓冲区
大小受限:一次最多传输64k

③ 对于数据报来说,可以简单的理解为,传输数据是一块一块的,发送一块数据假如100个字节,必须一次发送,接收也必须一次接收100个字节;而不能分100次,每次接收1个字节。

  1. 原始套接字
    原始套接字用于自定义传输层协议,用于读写内核没有处理的IP协议数据。

4. 简单说一下TCP和UDP的区别:

  1. TCP:
    有连接、可靠传输、面向字节流、全双工
  2. UDP:
    无连接、不可靠传输、面向数据报、全双工

① 有无连接:如打电话是有连接的,发微信是没连接的。即有连接是要先建立连接后才可以通信,无连接是可以直接进行发送。
② 可靠传输:不是说A给B发的数据100%能够让B收到,而是A可以知道B有没有收到。
③ 字节流:IO的章节有介绍,如InputStream、OutputStream,即TCP是基于流的。
④ 面向数据报:UDP是以“数据报”为基本单位的
⑤ 全双工相对的词是半双工。
全双工:一个通道,双向通信; 半双工:一个通道,单向通信。
网络通信一般都是全双工。

5. TCP中的长短连接

  1. TCP发送数据时,需要先建立连接,什么时候关闭连接就决定是短连接还是长连接:
    短连接:每次接收到数据并返回响应后都关闭连接,即是短连接。也就是说,短连接只能一次收发数据。
    长连接:不关闭连接,一直保持连接状态,双方不停的收发数据,即是长连接。也就是说,长连接可以多次收发数据。
  2. 对比以上长短连接,两者区别如下:
    建立连接、关闭连接的耗时:短连接每次请求、响应都需要建立连接,关闭连接;而长连接只需要第一次建立连接,之后的请求、响应都可以直接传输。相对来说建立连接、关闭连接也是要耗时的,长连接效率更高。
    主动发送请求不同:短连接一般是客户端主动向服务端发送请求;而长连接可以是客户端主动发送请求,也可以是服务端主动发。
    两者的使用场景有不同:短连接适用于客户端请求频率不高的场景,如浏览网页等。长连接适用于客户端与服务端通信频繁的场景,如聊天室,实时游戏等。

6. 应用层重点协议

  1. DNS:
    1)DNS,即Domain Name System,域名系统。DNS是一整套从域名映射到IP的系统。
    2)DNS协议是应用层协议,基于传输层UDP或TCP协议来实现。
  2. NAT、NAPT:
    1)NAT技术是当前解决IP地址不够用的主要手段,是路由器的一个重要功能。主要是一种将私有IP和全局IP相互转化的技术方法。
    2)全局IP要求唯一,但是私有IP不需要。
    3)故:NAPT使用IP+port来建立这个关联关系,来区分如路由器(全局IP)将内容转发给哪个私有IP。
  3. HTTP/HTTPS

7. TCP可靠传输机制(三次握手四次挥手)

【可靠传输:指的是数据传输过去之后,发送方能够知道自己是发送成功还是没成】

  1. 确认应答:
    1)【确认应答机制】就是TCP保证可靠性的最核心机制!
    2)网络通信会存在“后发先至”情况:网络上通信传输的路径是复杂的,两点之间两个报文可能会走不一样的路线。
    而“后发先至”是网络的基本结构导致的,是无法避免的,所以只能自己想办法让含义不被误会,故解决方案:针对请求和应答报文进行编号。也就是说:在确认应答机制中引入序号(32位)来保证不出现歧义。
    3)确认应答描述的是 数据包顺利到达对方且对方给出响应,但是在传输过程中可能会丢包,如果丢包又该如何呢?
    ① 【丢包的原因:网络环境非常复杂,且交换机的转发能力是有上限的,如果数据报庞大的情况导致交换机的转发达到上限,此时就无法快捷的完成转发了,就可能会导致一部分数据报超时。】
    ② 如果数据丢包了,此时就需要考虑通过“超时重传”来进行了。

22

  1. 超时重传
    1)在丢包的情况下, 如何进行【超时重传】呢?
    ① 如果是发送方数据丢了,就进行正常超时重传
    ② 如果是ACK应答报文丢了,则实际操作是发送方发的消息也需要再次发送,此时因为丢失ACK就会导致接收方收到重复信息,但是这明显不是最妥善的处理方式;所以TCP就会针对相同的消息进行去重(根据序号来去重就行),保证了应用层代码通过socket读取数据的时候读到的不是重复数据。
    2)那么超时时间如何确定?
    一般系统里会有一个配置项来描述超时时间的阈值,但是实际的超时时间是不确定的。

例如,第一次出现丢包时,发送方就会在达到超时时间阈值之后进行重传;如果重传的数据仍然无响应,那么还会继续进行超时重传,但是第二次超时时间一般要比第一次更长,也就是超时时间并不是均等的,而是逐渐变大的。

【超时时间逐渐变大的理由】:如果单个数据报丢包的概率较小,此时由概率论计算可知第二次传输大概率是可以顺利到达的;如果第二次传输也没有到达的话,一般就说明当前环境比较糟糕,此时单个数据报丢包的概率就非常大了,如此就算传输再频繁也是无济于事的,倒不如降低传输频率以节省主机开销。

3)这样的重传如果在重试几次之后依旧无法传输,就会尝试重置TCP连接(也就是:断开重连);此时如果还是连不上就直接释放连接(彻底放弃连接)。

  1. 连接管理(三次握手、四次挥手)【面试题!!】
    1)三次握手建立连接的过程
    333
    2)为啥要建立连接?建立连接的意义是啥?

① 投石问路:检查一下当前的网络状况是否畅通。(三次握手建立连接其实并不传输任何业务信息)
② 三次握手同时也是在检查通信双方的发送能力和接收能力(两次是不行的,测试不完整)
③ 三次握手过程中,也在协商一些重要的参数。如TCP序号并不是从1开始的,通常是在建立连接的时候协商的数字,如果连接断开又快速重连,接收方就可以区分当前收到的数据是上个连接还是当前连接。

3)【两个重点的TCP状态:(建立连接)】
① LISTEN:服务器启动且绑定端口之后(new ServerSccket完成),相当于手机开机、信号良好,别人可以进行打电话。
② ESTABLISHED:连接建立好之后的稳定状态,相当于拨通电话之后可以进行说话交流了。

4)断开连接:四次挥手
555
5)为什么“三次握手四次挥手”?
① 在“三次握手”中,主机B给主机A返回确认ACK以及申请连接SYN都是由内核触发的,时机完全相同,操作系统就会把两个包合并成一个
(为啥不能是“四次握手”:可以但没必要,白白浪费时间)
② 在“四次挥手”中,ACK和FIN的触发时机是不相同的,ACK是由操作系统内核收到主机A给B发送的FIN之后立即触发的,而主机B给A发送FIN是应用程序显式的调用socket的close方法触发的。

6)两个重要的TCP状态(断开连接):

① CLOSE_WAIT:等待代码中调用close操作。(如果服务器上出现大量的CLOSE_WAIT状态的连接,说明服务器代码bug,close没有被及时调用到)
② TIME_WAIT:返回ACK的一方会进入TIME_WAIT。
如:主机A在处理完上一个ACK之后不能立即释放连接,而是需要保持一定时间,这是为了万一最后的ACK丢了,还有机会进行重传。(也就是说:如果A给B发送确认ACK的时候ACK丢包了,那么此时B就需要给A重新发送FIN,此时A处的TIME_WAIT就是非常必要的,如果A在等了一段时间之后没有FIN重传过来就认为ACK顺利到达了)

8. TCP相关机制

  1. 滑动窗口
    提高TCP传输效率的有效机制,发送方是批量发送数据。
  2. 流量控制
    1)在滑动窗口基础上对发送速率作出限制的机制,其实就是在限制发送方的窗口不要太大,尽量保持在一个合适的大小。
    2)接收方使用内核的接收缓冲区的剩余空间大小来作为发送方发送速率(窗口大小)的参考数值!
    (此处补充:UDP是只有接收缓冲区,没有发送缓冲区的)
    3)流量控制:是通过接收方的处理能力来衡量发送方的速率的
  3. 拥塞控制:是根据中间节点来进行控制的。
    1)TCP实现拥塞控制的具体方式是啥?
    ① TCP引入慢启动机制,先发少量的数据(因为发送之初,网络情况未知)
    ② 如果不丢包,就需要放大拥塞窗口(拥塞控制下的那个窗口的大小),开始的时候先指数增长(翻倍),达到阈值之后线性增长。

【指数增长可以在短时间内摸清楚网络承载的底线,而为了防止翻倍太快一下超过上限就设置一个阈值,达到阈值之后就不再指数增长,转为线性增长】

当速率达到上限就会出现网络拥堵,从而出现丢包;此时窗口大小一下子会回到最初的值,重复刚才的指数增长+线性增长,并且要动态调整阈值,阈值调整为刚才丢包的窗口的一半。

66
7. 延迟应答
1)延迟应答 是基于流量控制来引入的提高效率的机制
2)延迟应答:返回ACK的时间稍微晚一点,不是立即返回,此时应用程序就会有时间来消费内核接收缓冲区中的数据,使得接下来ACK返回的窗口略大于立即返回的窗口。

  1. 捎带应答
    1)捎带应答是基于延迟应答的基础上引入的。
    2)TCP中,只要把数据传输过去,对方收到后就会立即由内核返回一个ACK确认报文;而响应数据则是由应用程序负责传输的。所以,返回ACK和响应这两个操作是不同的时机传输的,就不能够把两次传输合并起来;但是延迟应答就会让ACK延迟返回,会稍微等一会儿,而在等待之后业务如果刚好也要返回响应,此时就可以把ACK与响应两个报文合二为一了(是由内核处理的,应用程序处理的响应也要经过内核,即:应用程序是调用socket的write方法把数据交给内核,内核进行封装,然后发送)。

9. 面向字节流的粘包问题

  1. 要想解决粘包问题就在应用层协议这里进行区分:只要在定义应用层数据协议的时候,明确包和包之间的“边界”就可以了。
  2. 典型的办法有两种:
    ① 通过分隔符:比如约定使用;作为包的结束标记
    ② 通过指定包的长度:比如在数据报的开头位置声明长度

10. TCP的异常处理

TCP中的连接如果出现异常,怎么办?

1)程序崩溃
① 相当于进程的异常退出。而程序退出(正常or异常)之后操作系统就会回收进程的资源,包括释放文件描述符表,这样的释放操作就相当于调用了对应socket的close;执行close就会触发FIN报文,进一步开始四次挥手。
② 所以该情况与普通的四次挥手没啥区别。
2)正常关机(通过开始菜单这种方式来关闭主机)
关机的时候系统会先强制结束所有的用户进程,和上述的进程崩溃类似,系统内核会进行文件描述符表的释放操作,从而进一步进行四次挥手。
3)断电关机(主机掉电)
非常突然,猝不及防。
① 掉电的是接收方,发送方并不知道对面已经挂了,会继续发送数据。 但是此时发送的数据就没有ACK返回,发送方就会触发超时重传;重传了几次之后仍然没有应答,此时就会尝试重置连接(通过复位报文段),但是也会失败;此时就会直接放弃连接。
【复位报文段其实就是TCP报头中特殊标志位中的RST,为1就是有效的】 (补充:特殊标志位中:PSH:向对方所要数据,希望对方给个回应; URG:跟紧急指针相关)
② 掉电的是发送方,此时接收方就只能等着。 但是接收方也不是干等,等了一段时间之后就会发送一个“心跳包”,心跳包是周期性触发的,只是一个简单的不携带任何业务数据的包,存在的意义就是确认一下对方是否还在。 如果对方不返回心跳包,说明此时对方已经挂了。
4)网线断开
情况同主机掉电类似,只不过通信双方的主机都正常,这两端各自按照上述两种情况分别进行。

11. 如何使用UDP来实现可靠传输?

(主要考查的其实是TCP)
其实就是基于UDP在应用层来实现确认应答、超时重传、引入序列号、滑动窗口(会确认都收到才滑到下一个)、流量控制、拥塞控制等等。

12. 关于IP地址具体的规则:(IPV4)

IP地址分为两个部分:网络号和主机号
① 网络号:标识网段,保证相互连接的两个网段(网段:网络号,局域网的身份标识)具有不同的标识;(网段具有不同标识便是不同局域网,用网络号来表示局域网)
② 主机号:标识主机,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号;(表示不同主机)

【同一个局域网中,主机之间的网络号是相同的,但是主机号必须不同。】
在相邻的局域网中(同一个路由器(WAN口和LAN口有不同的网络号)连接的局域网),要求网络号是不同的

13. 如何划分网络号和端口号?

1)子网掩码可以划分从哪里到哪里是一个网络号
2)子网掩码有32位,左半边都是1,右半边都是0(不会0/1混合)
3)子网掩码左半边有多少个1就表示IP地址左侧有多少位的网络号
4)把子网掩码与IP地址按位与运算得到的结果就是网络号

14. 数据链路层

  1. 数据链路层中最关键的是以太网
  2. 目的IP是终点的IP地址,而目的MAC是相邻结点的MAC地址!!
  3. ARP一个介于数据链路层和网络层之间的协议,ARP协议建立了主机 IP地址 和 MAC地址 的映射关系。

15. [高频!]从浏览器输入一个URL到最终展示的页面,大概都会经历哪些事情?

(这其实是一个开放性问题,有很多角度)
站在后端开发的角度:【大纲,详细可以参考网上回答】
1)DNS域名解析
① 在浏览器输入一个网址URL后,首先要进行DNS域名解析
网络上的设备都是通过IP地址作为身份标识的,但是IP地址不好记/不好传播,此时就可以使用一串单词(域名,如http://www.baidu.com)来表示这个IP地址。
但是实质上网络的数据传输还是通过IP地址的,所以就需要把域名解析成IP地址
所以,DNS系统功能就是把域名自动转换成IP地址。

2)封装
② 转换完成后就得到一个IP地址,浏览器就可以构造出HTTP数据报
③ HTTP数据报被交给了传输层(也就是是TCP),TCP就根据刚才的地址先建立连接(三次握手),然后再发送刚才的HTTP请求
④ 请求被发送到网络层(也就是IP协议),IP协议将其封装成IP数据报再交给数据链路层。
⑤ 数据链路层收到IP数据报后将其封装成对应的数据帧,最终通过网卡传输出去
3)传输:中间会经历一些交换机和路由器
⑥ 交换机 会把数据分用到数据链路层(更上层的就不再解析了),再重新封装,继续转发。
⑦ 路由器 会把数据分用到网络层(更上层就不再进行解析了),重新封装,继续转发。
转发过程涉及到路由表的匹配过程:路由器根据数据报中的目的IP在路由表中匹配,找个合适的方向发出去。(注:每次转发TTL都减1)
4)到达服务器
⑧ 到达目标服务器之后,服务器进行层层分用,一直到HTTP这一层(HTTP具体解析过程后面再说)
⑨ 服务器就会找到你想访问的那个资源,把资源构造成HTTP响应(也就是根据请求计算响应)
5)服务器把响应数据进行重新封装(同以上2)
6)响应数据在中间进行转发,回到浏览器
7)浏览器(客户端)这里再针对数据进行解析【分用】
8)最终解析出一个网页并渲染到浏览器上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

'Dream是普通小孩耶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值