JAVA实习面试 —————— 计算机网络篇
1、OSI 七层结构、TCP/IP四层结构、五层协议结构
- OSI七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
- TCP/IP 四层:网络接口层、网际层、运输层、应用层
- 五层协议:物理层、数据链路层、网络层、运输层、应用层
注意:按照从下到上的顺序。
OSI七层参考模型,每一层的作用:
对应的层 |
作用 |
对应的网络协议/硬件 |
物理层 |
提供数据传输的硬件保证,网卡接口,传输介质 |
中继器、集线器、网关 |
数据链路层 |
进行数据交换,将要传输的数据转换为二进制形式 |
网卡、网桥、交换机 |
网络层 |
进行路由选择,网络互联 |
IP、ICMP |
传输层 |
用于端到端的可靠数据传输 |
TCP、UDP |
会话层 |
用于建立用户级的连接,选择适当的传输服务 |
SQL、RPC |
表示层 |
用于对数据的压缩、加密 |
JPEG、MPEG、ASII |
应用层 |
提供用户服务,具体功能由应用程序实现 |
SMTP、HTTP、DNS |
2、TCP 和 UDP的区别?基于TCP、UDP的协议有哪些?
TCP和UDP的区别?
- TCP提供面向连接的、可靠的数据流传输,而UDP提供的是无连接的、不可靠的数据流传输。
- TCP保证数据传输性,UDP可能丢包,TCP保证数据顺序,UDP不保证。
- TCP传输单位称为TCP报文段,UDP传输单位称为用户数据报。
- TCP注重数据安全性,UDP数据传输快,因为不需要连接等待,少了许多操作,但是其安全性却一般。
面向连接与非面向连接区别?
- 面向连接的服务,通信双方在进行通信之前,要在双方建立起一个完整的可以彼此沟通的通道,在通信过程中,整个连接的情况一直可以被实时的监控和管理。
- 非面向连接的服务,不需要预先建立一个联络两个通信节点的连接,需要通信的时候,发送节点就可以往网络上发送信息,让信息自主的再网络上去传,一般传输过程中不再加以监控。
基于TCP、UDP的协议有哪些?
基于TCP的协议:
- HTTP:Web服务器传输超文本到本地浏览器的传送协议。
- SMTP:邮件传送协议,用于发送邮件,服务器开放的是25号端口。
- FTP:定义了文件传输协议,使用21号端口。
基于UDP的协议:
- DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
TCP和UDP的适用场景:
TCP:当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,HTTP、HTTPS、FTP等传输文件的协议会使用到。
UDP:当强调传输性能而不是传输的完整性的时候,要求网络通讯速度呢个尽量的快,如:QQ语音,QQ视频等。
3、TCP如何保证可靠传输?
TCP通过以下几种措施来保证数据的可靠传输?
- 对应用数据进行分割:将应用数据分割成TCP认为最适合发送的数据块。
- 对数据包进行编号:TCP给要发送的每一个数据包进行编号,接收方按照编号对数据包进行排序,把有序数据传输给应用层。
- 校验和:这是一个端到端的校验,目的是检测数据在传输过程中的任何变化。如果接收端的校验有差错,说明数据在传输过程中出问题了,接收端将丢弃不再接收该数据。
- 流量控制:TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的效率,防止包丢失。TCP适用的流量控制协议是可变大小的滑动窗口协议。(TCP通过滑动窗口实现流量控制)
- 拥塞控制:当网络拥塞的时候,减少数据的发送。防止过多的数据注入到网络中,避免传输链路过载。
- ARQ协议:该协议也是为了实现可靠传输的,它的基本原理就算每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
- 超时重传:当TCP发出一个报文段后,它启动一个定时器,等待接收端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
滑动窗口和流量控制
TCP利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。
接收方发送的确认报文中的窗口字段可以用来控制发送窗口的大小,从而影响发送方的发送速率。将窗口字段设置为0,则发送方不能发送数据。
TCP如何实现拥塞控制?
为了进行拥塞控制,TCP发送方要维持一个**拥塞窗口(cwnd)**的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态进行变化。发送方让自己的发送窗口取为拥塞窗口和接受方的接收窗口中较小的一个。
TCP的拥塞控制采用了四种算法:即慢开始、拥塞避免、快重传和快恢复。
- 慢开始:慢开始算法的思路是当主机开始发送数据的时候,如果立即把大量的数据字节注入到网络中,那么可能会引起网络阻塞,因为现在还不知道网络的负荷情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd初始值为1,每经过一个传播轮次,cwnd加倍。
- 拥塞避免:拥塞避免算法的思路是让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT就把发送方的cwnd加1;
- 快重传和快恢复:在TCP/IP中,快速重传和恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包。没有FRR,如果数据包丢失了,TCP将会使用定时器来要求传输暂停。在这暂停的这段时间内,没有新的或者复制的数据包被发送。有了FRR,如果接受机接收到一个不按照顺序的数据段,它会立即给发送机发送一个重复确认,如果发送机接收到三个重复确认,它会认定确认件指出的数据段丢失了,并立即重传给接受方这些丢失的数据段。有了FRR,就不会因为重传时要求的暂停被耽误。当有单独的数据包丢失的时候,快速重传和恢复(FRR)能最有效的工作。当有多个数据信息包在某一段很短的时间内丢失的时候,它则不能很有效的工作。
4、什么是TCP粘包,它的产生原因以及解决方法?
- TCP粘包是指:发送方发送的若干个包数据到接收方接收的时候,粘成一个包数据。
- TCP是基于字节流的,虽然应用层和TCP传输层之间的数据交互是大小不等的数据块,但是TCP把这个数据块仅仅看成一连串无结构的字节流,没有边界,这就可能导致字节流合并(粘包)。
TCP粘包产生的原因:
发送方产生的粘包:
- 采用TCP协议传输数据的客户端与服务器是保持一个长连接的状态(一次连接发一次数据不存在粘包),双方在连接不断开的情况下,可以一直传输数据。但当发送的数据包过于的小时,那么TCP协议默认的会启用Nagle算法,将这些较小的数据包进行合并发送(缓冲区数据发送是一个堆压得过程);这个合并过程就是在发送缓冲区中进行得,也就是说数据发送出来它已经是粘包得状态了。
- 总结:要发送得数据小于发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。
接收方产生的粘包:
- 接收方采用TCP协议接收数据时的过程是这样的:数据到接收方,从网络模型的下方传递至传输层,传输层的TCP协议处理是将其放置接收缓冲区,然后由应用层来主动获取(例如C语言调用函数等);这时会出现一个问题,就是我们在程序中调用的读取数据函数不能及时地把缓冲区中地数据拿出来,而下一个数据又到来并有一部分放入在缓冲区末尾,等我们读取数据地时候就是一个粘包。(放数据地速度 > 应用层拿数据速度)。
- 总结:接收端地应用层没有及时读取缓冲区中地数据,导致缓冲区数据堆积,将发生粘包。
如何避免粘包?
避免粘包有以下两种方式:
- 在每个包的末尾加上特殊字符,用以区分连续的两个包。(例如用
/r/n
标记)
- 在报文首部添加包的长度。
5、TCP三次握手和四次挥手?
- 为了准确无误的把数据送达目标处,TCP协议采用了三次握手策略。
- 建立一个TCP需要三次握手。
5.1、三次握手图解
如下图所示,下面的两个机器人通过三次握手确定了对方能正确接收和发生消息:
上图流程为:
- 一次握手:客户端发送带有
SYN
标志的数据包给服务端
- 二次握手:服务端发送带有
SYN/ACK
标志的数据包给客户端
- 三次握手:客户端发送带有
ACK
标志的数据包给服务端。
5.2、为什么要三次握手:
三次握手的目的是建立可靠的通信信道,说到通信,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
- 第一次握手:是为了服务端确认对方(客户端)发送数据正常,自己接收数据正常。
- 第二次握手:是为了客户端确认自己发送,接收数据正常,同时客户端也知道对方(服务端)发送、接收数据都正常。
- 第三次握手:是为了让服务端确认自己发送、接收数据正常,同时服务器也知道了对方(客户端)发送、接收数据正常。
所以三次握手是为了让客户端和服务端双方,互相都知道自己和对方发送、接收功能都正常,缺一不可。
5.3、第二次握手服务端传回了ACK为什么还要传回SYN?
服务端传回发送端所发送的ACK是为了告诉客户端,我接收到信息确实就是你所发送的信号了,这表明从客户端到服务端的通信是正常的。而回传SYN则是为了建立从服务端到客户端的通信。
SYN同步序列编号(Synchronize Sequence Numbers)是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立正常的TCP网络连接的时候,客户机首先发出一个SYN消息,服务器使用SYN-ACK应答表示接收到了这个消息,最后客户机再以ACK(Acknowledgement)消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。
5.4、为什么要四次挥手?
如图所示:
断开一个TCP连接则需要四次挥手:
- 第一次挥手:客户端发送一个FIN数据包给服务器端,用来告诉服务端,我要关闭与你的TCP连接。(客户端主动关闭到服务器的数据传输,但此时客户端还能接收服务器端传来的数据)。
- 第二次挥手:服务端收到这个FIN数据包后,它返回一个ACK数据包给客户端,确认序号为收到的序号加1(和SYN一样,一个FIN将占用一个序号),目的是告诉客户端,我收到了你的关闭连接请求。
- 第三次挥手:服务端主动关闭到客户端的连接,并发送一个FIN数据包给客户端,告诉客户端我也关闭了和你的TCP连接。(服务端不会再给客户端发送数据了)
- 第四次挥手:客户端收到服务端返回的FIN数据包后,在发送一个ACK数据包给服务端确认,并将确认序号设置为收到序号加1。
- 注意,此时服务端接收到ACK数据包之后进入CLOSED状态,但是客户端还没有关闭,进入了TIME-WAIT状态。此时TCP连接还没有释放掉,必须经过时间等待计时器设置的时间(2MSL),客户端才进入CLOSED状态。
为什么客户端在TIME-WAIT状态必须等待2MSL的时间呢?
- 第一:为了保证客户端发送的最后一个ACK报文段能够到达服务器端。这个ACK报文段有可能会丢失,因而使得服务端收不到这个ACK确认报文,服务端会超时重传FIN+ACK报文段,而客户端就能在2MSL的时间内收到这个重传的FIN+ACK报文段,接着客户端重传一次确认报文,重新启动时间等待计时器。
- 第二:客户端在发送完最后一个ACK报文段后,在经过时间2MSL,就可以使得本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使得下一个新的连接中不会出现这种旧的连接请求报文段。
5.5、如果已经建立了连接,但是客户端突然出现故障了怎么办?
- TCP设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户请求后都会重新复位这个计时器,时间通常是设置为2个小时,若两个小时还没收到客户端的任何数据,服务器就会发送一个探测报文段,以后每75秒发送一次,若是一连发送10个探测报文仍然没有反应,服务器就认为客户端出现了故障,接着就关闭连接。
6、在浏览器中输入URL地址,回车后经历了哪些过程?
- 所经历的过程:DNS域名解析、TCP连接、发送HTTP请求、服务器处理请求并返回HTTP报文、浏览器渲染、结束。
下面来逐步分析一下:
DNS域名解析
当我们在浏览器中输入一个域名然后回车的时候,首先检查本机的C:\Windows\System32\drivers\etc\hosts
配置文件下有没有对应的映射,如下所示:
# 前台本机域名映射
127.0.0.1:80 web.csp1999.com
# 后端接口本机域名映射
127.0.0.1:8080 api.csp1999.com
如果有,则返回对应的IP地址。
如果没有,浏览器会发出一个DNS请求到本地DNS服务器找对应的IP地址,本地DNS服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动:
建立TCP连接:三次握手
- 解析出IP地址后,浏览器根据IP地址和默认端口443向网站的服务器发起请求,三次握手,建立TCP连接。
发送HTTP请求
- 建立好TCP连接后,浏览器(客户端)通过HTTP协议发送请求,请求从服务器端获取数据。
- 服务器处理客户端的HTTP请求后,就将请求的数据返回给浏览器。
关闭TCP连接:四次挥手
- 浏览器与服务器数据传送完毕后,四次握手,释放TCP连接。
浏览器回显
7、什么是HTTP协议?
HTTP的概念:
- HTTP协议是超文本传输协议,用于客户端和服务器端之间的通信,即在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。
HTTP的特性(优点):
- HTTP最凸出的优点是简单、灵活和易于扩展、应用广泛和跨平台。
HTTP的常见字段:
HOST 字段:
Host: www.A.com
有了HOST
字段,就可以将请求发往【同一台】服务器上的不同网站。
Content -Length 字段
- 服务器在返回数据的时候,会有
Content-Length
字段,表明本次响应的数据长度。
Content-Length: 1000
如上面则是告诉浏览器,本次服务器回应的数据长度是1000个字节,后面的字节就属于下一个回应了。
Connection 字段
connection
字段最常用于客户端要求服务器使用TCP持久连接,以便其他请求复用。
HTTP/1.1版本的默认连接都是持久连接,但为了兼容老版本的HTTP,需要指定Connection
首部字段的值为Keep-Alive
。
Connection: keep-alive
一个可复用的TCP连接的就建立了,直到客户端或者服务端主动关闭连接。但是,这不是标准字段。
Content-Type 字段
Content-Type
字段用于服务器回应时,告诉客户端,本次数据是什么格式。
Content-Type: text/html; charset=utf-8
上面的类型表明,发送的是网页,而且编码是UTF-8。
客户端请求的时候,可以使用Accept
字段声明自己可以接收哪些数据格式。
Accept: *
上面代码中,客户端声明自己可以接受任何格式的数据。
Content-Encoding 字段
Content-Encoding
字段说明数据的压缩方法,表示服务器返回的数据使用了什么压缩格式。
Content-Encoding: gzip
上面表示服务器返回的数据采用了gzip方式压缩,告知客户端需要用此方式解压。
客户端在请求的时候,用Accept-Encoding
字段说明自己可以接受哪些压缩方法。
Accept-Encoding: gzip, deflate
8、GET和POST的区别?
- URL参数可见性:GET参数可见(通过拼接URL进行传递参数),POST参数不可见。
- 是否可缓存:GET请求是可以缓存的,POST请求不可以缓存。
- 传输数据的大小:GET一般传输数据大小不超过
2k-4k
(根据浏览器不同,限制不一样,但是相差不大),POST请求传输数据的大小根据php.ini
配置文件设定,也可以无限大。
- 安全性:GET不安全,POST安全。
- 数据包个数:GET产生一个TCP数据包;POST产生两个TCP数据包。
9、HTTP的优缺点
- HTTP协议的特性:【无状态、明文传输】既是优点也是缺点,同时还有一大缺点【不安全】。
无状态协议的优缺点
- 无状态的优点:服务器不用去记忆HTTP的状态,不需要额外的资源来记录状态信息,这能减轻服务器的负担,能够把更多的CPU和内存资源用在对外提供服务上。
- 无状态的缺点:服务器没有记忆能力,它在完成有关联性的操作的时候会很麻烦。
- 例如:登录 -> 添加购物车 -> 下单 -> 结算 -> 支付,这系列操作都要知道用户的身份才行。但是服务器不知道这些请求是有关联的,每次都要确认一遍用户身份信息。
对于无状态的问题,解决方案有很多,其中比较简单的方式用Cookie技术。
Cookie
通过在请求和响应中写入Cookie信息来控制客户端的状态。相当于,在客户端第一次请求后,服务器会下发一个带有客户身份信息的[小贴纸],后续客户端请求服务器的时候,带上小贴纸,服务器就能识别了。
明文传输的优缺点:
- 明文意味着在传输过程中的信息,是可方便阅读的,通过浏览器的F12控制台或者Wireshark抓包都可以直接肉眼查看,为我们调试工作带来了极大的便利性。
- 但是这正是这样,HTTP的所有信息都暴漏在了光天化日之下,相当于信息裸奔。在传输的漫长的过程中,信息的内容都毫无隐私可言,很容易就能被窃取,如果里面有你的账户密码信息,那你号没了。
10、HTTP和HTTPS的区别是什么?
- 安全性区别:HTTP是超文本传输协议,信息是明文传输,存在安全风险问题。HTTPS可以保证信息传输安全,在TCP和HTTP网络层之间加入了SSL/TLS安全协议,使得报文能够加密传输。
- 建立连接流程区别:HTTP连接建立相对简单,TCP三次握手之后便可进行HTTP的报文传输。而HTTPS在TCP三次握手之后,还需要进行SSL/TLS的握手过程,才可进入加密报文传输。
- 端口区别:HTTP的端口号是80,HTTPS的端口号是443.
- 是否需要申请数字证书:HTTPS协议需要向CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。而HTTP协议不需要。
混合加密
HTTPS采用对称加密和非对称加密结合的【混合加密】方式,将服务器公钥放到数字证书中,来解决窃听风险。
- 在通信建立前采用非对称加密的方式交换【会话密钥】,后续就不再使用非对称加密。
- 在通信过程中全部使用对称加密的【会话密钥】的方式加密明文数据。
摘要算法
- HTTPS采用摘要算法来确保数据的完整性,解决了数据被篡改的风险。
- 摘要算法能够为数据生成独一无二的【标识】,用于校验数据的完整性,从而解决了被篡改的风险。
HTTPS在HTTP和TCP层之间加入了SSL/TLS
协议,如图:
11、Cookie的作用是什么?和Session有什么区别?
Cookie 和 Session的作用:
Cookie和Session都是用来跟踪浏览器用户身份的会话方式,但是两者有所区别:
- Cookie一般用来保存用户信息。比如我们在Cookie中保存已经登录过的用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给自动填补了。
- Session的主要作用就是通过服务端记录用户的状态。典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为HTTP协议是无状态的。服务端给特定用户创建特定的Session之后就可以标识这个用户并且跟踪这个用户了。
Cookie 和 Session 的区别如下:
- Cookie数据保存在客户端,Session数据保存在服务器端。
- Cookie存储在客户端中,而Session存储在服务器上,相对来说Session安全性更高。如果要在Cookie中存储一些敏感信息,不要直接写入Cookie中,最好能将Cookie信息加密然后使用到的时候再去服务器端解密。
- Cookie一般用来保存用户信息,Session的主要作用就是通过服务端记录用户的状态。
12、URI 和 URL的区别是什么?
- URI:是统一资源标识符,可以唯一标识一个资源。
- URL:是统一资源定位符,可以提供该资源的路径。URL是URI的一个子集,它不仅唯一标识资源,而且还提供了定位该资源的信息。
URI 的作用像身份证号一样,URL 的作用更像家庭住址一样。
13、HTTP1.0、HTTP1.1、HTTP2.0的主要区别是什么?
-
HTTP1.0:默认使用短连接,浏览器每次请求都需要与服务器建立一次TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务端不记录客户端的请求状态(无状态)。
-
HTTP 1.1:默认使用长连接,用以保持连接特性,使用长连接的HTTP协议,会在响应头中加入这行代码:
// Keep-Alive不会永久保持连接,它有一个持续时间,可以在不同的服务器软件中设定这个时间。
// 实现长连接需要客户端和服务端都支持长连接。
Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器端之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器的时候,会继续使用这一条已经建立的连接。
-
HTTP 2.0:引入二进制数据帧和流的概念,支持多路复用、服务器推送,支持使用二进制格式传输数据,而HTTP1.0依然使用文本格式传输。
14、简单介绍一下对称加密算法和非对称加密算法的区别?
- 对称加密算法:双方持有相同的密钥,进行加密速度快,典型对称加密算法:DES、AES。
- 非对称加密算法:密钥成对出现(私钥、公钥),私钥只有自己知道,不在网络中传输;而公钥可以公开。相比对称加密速度较慢,典型的非对称加密算法有:RSA、DSA。
15、HTTPS是如何建立连接的?期间交互了什么?
HTTPS是在HTTP与TCP之间加了一层SSL/TSL协议,所以建立连接流程如下:
- 首先建立TCP连接:三次握手。
- 然后建立SSL/TSL加密:
SSL/TSL协议基本流程:
- 客户端向服务器索要并验证服务器的公钥。
- 双方协商生产【会话密钥】。
- 双方采用【会话密钥】进行通信。
前两步也就是SSL/TSL的建立过程,也就是握手阶段。