计算机网络相关面试题汇总
作为Java程序员,对于计网的了解也是很有必要的,在面试时也经常会被问到关于计网的问题,下面总结我在笔面试期间遇到的相关题目,希望对大家有所帮助,祝各位童鞋早日上岸~!
如有错误请指出更正,互相学习,因为我也是没有工作经历的初学者,谢谢大家~!
1、简述ISO/OSI七层模型的分层与作用
应用层:为用户提供一个操作界面,如window等的窗口
表示层:将数据进行二进制的转换,提供表示,还提供加密压缩功能
会话层:确定数据是否需要进行网络传递
传输层:对报文进行分组或组装,提供传输协议的选择,有TCP(可靠面向连接的传输协议)和UDP协议(不可靠面向无连接的传输协议)
网络层:IP地址编址(写入源IP和目标IP)、路由选择(进行分发路由)
数据链路层:MAC地址编址、MAC地址寻址、差错检验
物理层:数据实际传输
2、说一下三次握手的过程
第一次握手:客户端将标志位SYN置为1,表示发请求,并随机生成一个seq序列号,假设为100,并将此数据包发送给服务器,此时客户端变为SYN_SENT状态
第二次握手:服务器发现收到的数据包的SYN为1,表示客户端此时请求建立连接,因此服务器将ACK标志位置为1,并获取原来的(seq+1),赋值给ack确认序列号,同时再随机生成一个seq序列号,假设为200,因为此时的服务器就相当于一个客户端,需要再次确认客户端是否进行连接,此时服务器端变为SYN_RCVD状态
第三次握手:检查ack的序列号是否为100+1,如果是则代表服务器接收到请求,可以建立连接;获取发送来的seq序列号,进行+1,放到ack确认序列号中,即201,将ACK=1与ack=201一同发送给服务器。同时服务器检查ack是否为原来的seq+1,ACK是否为1,如果是则建立连接成功,双方进入ESTABLISHED状态(译为已确立的),随后客户端与服务器就可以传输数据了
3、说一下四次挥手的过程
第一次挥手:客户端将FIN标志位置为1,表示想要终止连接,同时随机生成一个seq序列号,假设是100,此时客户端变为FIN_WAIT_1状态
第二次挥手:服务器接收到数据包,发现FIN标志位为1,说明客户端想要终止连接,因此将接收到的seq序列号+1并放到ack序列号中,并且将ACK标志位置为1,表示确认消息,此时服务器变为CLOSE_WAIT状态
第三次挥手:因为客户端想要断开连接,但服务器可能有未完成的数据操作,因此需要延迟片刻后,服务器端再次发送一个数据包,FIN、ACK标志位为1,ack序列号为101,并随机生成一个seq序列号假设是200;服务器端变为LAST_ACK状态;
第四次挥手:客户端检查发送来的ack序列号是否为我之前发送的seq序列号+1,如果是则代表服务器准备完毕,可以断开连接,并且接收到seq序列号进行+1,也即是201,然后赋值给ack确认序列号,发送到服务器;服务器接收到后检查是否为201,是则断开连接。
4、tcp 为什么要三次握手,两次不行吗?
三次握手是确保双方的数据包能够被对方所接收到,即双方相互告知序列号起始值,并且确认对方已经收到了序列号起始值。
如果只有两次握手,那么至多只有连接发起方的确认序列号能够被另一方确认,而另一方的序列号则得不到确认
5、简述 tcp 和 udp的区别?
tcp是面向连接的可靠传输协议,称为传输控制协议。udp是面向无连接的不可靠传输协议,称为用户数据报协议
tcp传输速度慢,但可靠,数据丢失会要求重传。udp传输速度快,但不可靠,数据丢失即丢失,直接将数据包舍弃。
tcp是面向字节流的,udp是基于数据报的
tcp能保证顺序,而udp不能保证
6、TCP 为什么是可靠连接?
通过tcp连接传输的数据无差错、不丢失、不重复、而且按顺序到达(通过tcp报文头里面的序号保证)
报文头里面的确认序号ack能保证不丢包,累计确认以及超时重传机制
tcp拥有流量控制及拥塞控制的机制
7、http是基于tcp还是udp协议的?那为何不使用其他的?
tcp协议。http客户端发起一个请求,与服务器目标端口假设是80端口建立一个tcp连接,服务器接收到请求后,回送一个状态行和响应消息。
不使用udp的原因是,tcp能提供传输控制,因为http请求是客户端发起的一个精确连接,可能会传递很多数据,比如说查询,如果查询信息丢了,导致需求达不到,并且tcp可以按照顺序接收和发送,并且提供错误纠正功能
8、get和post请求的区别?
get和post都是http请求报文中的一个请求方法,而http请求都是根据http报文发送的,所以两种请求方法实际上都是一个tcp连接;
请求参数的存放位置不同:如果使用get请求,http请求报文中的请求行的url会携带有数据,而如果是post请求,http请求报文中的请求行则不含有数据,而是放到了请求报文中的请求数据中;
可发送的数据长度不同:get请求所携带的数据有长度限制,但这不是http协议所规范的,是各个浏览器进行限制的;而因为post请求所携带的数据是放在http请求报文的请求数据中的,因此没有长度限制;
安全性不同:传统的说法是get请求的数据会在url暴露出来,而post不会,但这不能断定post请求就比get请求安全(因此这里说的安全是表面上的),因为post经过抓包也能看见http请求报文中的详细内容,数据也自然暴露出来了
9、地址栏输入一个url会发生什么?(http请求过程)
①输入地址:
当输入地址时,浏览器已经开始从缓存中读取数据了,可以智能寻找你所要的url,让你可以补全url地址
②浏览器查找域名的 IP 地址:
请求发起后(Enter键),第一步解析url的域名,首先查看本地磁盘的hosts文件,如果有域名对应的规则,则直接使用对应的ip地址
如果本地hosts文件找不到,则发一个DNS请求到本地DNS服务器,首先查询缓存,再到域服务器查询,然后返回一个解析服务器地址,向这个解析服务器地址发请求,这时候就能收到一个域名和ip地址的对应关系了,并保存到缓存中
(扩展:DNS就是根据域名获取IP地址的服务器)
③浏览器向web服务器发送一个http请求
在发送http请求之前,浏览器会先建立tcp连接(因为有连接才能发送请求,)。浏览器在拿到域名对应的ip地址后,会以一个随机端口向web服务器端口发起tcp的连接,建立连接后再发送http请求
④服务器的永久重定向响应
服务器给浏览器响应一个301永久重定向响应
⑤浏览器跟踪重定向地址
⑥服务器处理请求(例如Java中执行handler→service→mapper→数据库)当然对于一些大网站,会搭配负载均衡Nginx来进行请求分发,不至于请求至一个服务器,导致压力过大
⑦服务器返回一个http响应,并关闭tcp连接
⑧浏览器显示HTML(如果含有其他css、js文件,同样会进行发请求获取并载入)
10、说一下http请求报文与http响应报文格式?
http请求报文:请求行(请求方法、url、协议版本)、请求头、请求正文(也叫请求数据)
http响应报文:响应行(协议版本、状态代码、状态描述)、响应头、响应正文(也叫响应数据)
11、http 响应码 301 和 302 代表的是什么?有什么区别?
301代表永久重定向,当原来的地址不再使用,比如说需要更换域名了,一般使用301进行重定向;
302代表临时重定向,旧地址的资源仍然存在,只是临时重定向到另一个地址罢了
12、forward 和 redirect 的区别?
请求转发是服务器内部的转发,是直接转发,浏览器中url的变化是看不到的,并且转发时原来携带的参数仍然可以使用;
请求重定向是客户端层面的,是间接转发,用户需重新请求另一个地址,因此url发生了改变,同时原来request域中的参数失效,而且发送的请求是两次。
13、http有没有状态?
HTTP是一种无状态协议,即服务器不保留与客户交易时的任何状态。也就是说上一次请求对这次的请求是没有影响的,服务器也不会对上一次的请求进行任何记录处理。因此每次访问服务器都无法判断是否已经登录,都需重新登录。
如果想要http有状态,可以使用cookie和session
14、http与https的区别?
①http是超文本传输协议,信息是明文传输,而https是具有安全性的SSL加密传输协议;
②http与https使用的是完全不同的连接方式,而且端口也不一样http是80,而https是443;
③http连接很简单,是无状态的;https协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议更安全
15、session和cookie的区别?
①session用在服务器端,cookie用在客户端的浏览器上
②session的生效依赖于cookie中的session id,如果cookie禁用了,那么session也会失效
③cookie不是浏览器生成的,而是服务器端传递给客户端的(在响应报文中),而session是服务器端生成的,用于保存状态的
16、https连接建立过程?
https实际上也是基于tcp的连接,但是与传统的tcp不太当用户相同,具体过程如下:
①当浏览器发送https请求时,首先将客户端支持的加密算法带给服务器。
②服务器接收到加密算法后,与自己的加密算法进行比对,如果不一致则直接断开连接;如果一致,服务器颁发数字证书(公钥)给客户端浏览器,包括证书日期,机构等。
③客户端接收到证书后进行验证,看是否合法(没过期等)。验证通过后,客户端随机生成一个字符串,使用公钥进行加密,保证了只有服务器端的私钥才能进行解密查看真正的数据,然后将加密好的信息发送给服务器。
④服务器接收到加密信息后进行私钥解密,查看数据是否正确,如果正确,服务器跟客户端一样也生成一个随机字符串并加密,发送给客户端。
⑤客户端接收到加密信息后,进行解密查看,验证是否正确,如果正确,表名双方通道安全,可以建立连接,握手完毕,此时即可以进行通信了
17、说一下tcp/ip的四层和对应的作用?
①应用层:负责处理应用程序的逻辑,提供可操作的界面
②传输层:提供两台主机之间的数据传输服务
③网络层:ip地址编址以及路由选择转发
④网络接口层:实际上是数据链路层和物理层的合体,提供实际数据传输、差错检验、MAC地址编址与寻址
18、讲一下127.0.0.1、255.255.255.255、0.0.0.0?
127.0.0.1:本机地址,不能用于传输,主要用于测试,同时在windows系统中有一个别名localhost
0.0.0.0:有一些网络访问无法得知目标网络地址,那么将会使用0.0.0.0作为默认路由
255.255.255.255:限制广播地址,当路由器进行转发数据报时,如果发现目的地址为255.255.255.255,那么将不会进行转发,这样的数据报仅出现在本地网络中
19、TCP的实现步骤
服务端:
①创建ServerSocket对象,绑定监听端口
②调用该对象的accept()方法获取Socket对象,持续监听客户端的连接
③通过Socket获取输入流,读数据
客户端:
①创建Socket对象,指定ip地址和端口号
②通过Socket获取输出流,进行发送数据
20、UDP的实现步骤
服务端:
①创建DatagramSocket对象,并绑定端口
②创建数据包DatagramPacket,用于接收数据
③调用DatagramSocket对象的receive()方法接收数据
④解析数据包打印结果
客户端:
①创建DatagramSocket对象
②创建数据包DatagramPacket,指定ip地址、端口号和要发送的数据
③调用DatagramSocket对象的send()方法发送数据包
应用层:为用户提供一个操作界面,如window等的窗口
表示层:将数据进行二进制的转换,提供表示,还提供加密压缩功能
会话层:确定数据是否需要进行网络传递
传输层:对报文进行分组或组装,提供传输协议的选择,有TCP(可靠面向连接的传输协议)和UDP协议(不可靠面向无连接的传输协议)
网络层:IP地址编址(写入源IP和目标IP)、路由选择(进行分发路由)
数据链路层:MAC地址编址、MAC地址寻址、差错检验
物理层:数据实际传输
2、说一下三次握手的过程
第一次握手:客户端将标志位SYN置为1,表示发请求,并随机生成一个seq序列号,假设为100,并将此数据包发送给服务器,此时客户端变为SYN_SENT状态
第二次握手:服务器发现收到的数据包的SYN为1,表示客户端此时请求建立连接,因此服务器将ACK标志位置为1,并获取原来的(seq+1),赋值给ack确认序列号,同时再随机生成一个seq序列号,假设为200,因为此时的服务器就相当于一个客户端,需要再次确认客户端是否进行连接,此时服务器端变为SYN_RCVD状态
第三次握手:检查ack的序列号是否为100+1,如果是则代表服务器接收到请求,可以建立连接;获取发送来的seq序列号,进行+1,放到ack确认序列号中,即201,将ACK=1与ack=201一同发送给服务器。同时服务器检查ack是否为原来的seq+1,ACK是否为1,如果是则建立连接成功,双方进入ESTABLISHED状态(译为已确立的),随后客户端与服务器就可以传输数据了
3、说一下四次挥手的过程
第一次挥手:客户端将FIN标志位置为1,表示想要终止连接,同时随机生成一个seq序列号,假设是100,此时客户端变为FIN_WAIT_1状态
第二次挥手:服务器接收到数据包,发现FIN标志位为1,说明客户端想要终止连接,因此将接收到的seq序列号+1并放到ack序列号中,并且将ACK标志位置为1,表示确认消息,此时服务器变为CLOSE_WAIT状态
第三次挥手:因为客户端想要断开连接,但服务器可能有未完成的数据操作,因此需要延迟片刻后,服务器端再次发送一个数据包,FIN、ACK标志位为1,ack序列号为101,并随机生成一个seq序列号假设是200;服务器端变为LAST_ACK状态;
第四次挥手:客户端检查发送来的ack序列号是否为我之前发送的seq序列号+1,如果是则代表服务器准备完毕,可以断开连接,并且接收到seq序列号进行+1,也即是201,然后赋值给ack确认序列号,发送到服务器;服务器接收到后检查是否为201,是则断开连接。
4、tcp 为什么要三次握手,两次不行吗?
三次握手是确保双方的数据包能够被对方所接收到,即双方相互告知序列号起始值,并且确认对方已经收到了序列号起始值。
如果只有两次握手,那么至多只有连接发起方的确认序列号能够被另一方确认,而另一方的序列号则得不到确认
5、简述 tcp 和 udp的区别?
tcp是面向连接的可靠传输协议,称为传输控制协议。udp是面向无连接的不可靠传输协议,称为用户数据报协议
tcp传输速度慢,但可靠,数据丢失会要求重传。udp传输速度快,但不可靠,数据丢失即丢失,直接将数据包舍弃。
tcp是面向字节流的,udp是基于数据报的
tcp能保证顺序,而udp不能保证
6、TCP 为什么是可靠连接?
通过tcp连接传输的数据无差错、不丢失、不重复、而且按顺序到达(通过tcp报文头里面的序号保证)
报文头里面的确认序号ack能保证不丢包,累计确认以及超时重传机制
tcp拥有流量控制及拥塞控制的机制
7、http是基于tcp还是udp协议的?那为何不使用其他的?
tcp协议。http客户端发起一个请求,与服务器目标端口假设是80端口建立一个tcp连接,服务器接收到请求后,回送一个状态行和响应消息。
不使用udp的原因是,tcp能提供传输控制,因为http请求是客户端发起的一个精确连接,可能会传递很多数据,比如说查询,如果查询信息丢了,导致需求达不到,并且tcp可以按照顺序接收和发送,并且提供错误纠正功能
8、get和post请求的区别?
get和post都是http请求报文中的一个请求方法,而http请求都是根据http报文发送的,所以两种请求方法实际上都是一个tcp连接;
请求参数的存放位置不同:如果使用get请求,http请求报文中的请求行的url会携带有数据,而如果是post请求,http请求报文中的请求行则不含有数据,而是放到了请求报文中的请求数据中;
可发送的数据长度不同:get请求所携带的数据有长度限制,但这不是http协议所规范的,是各个浏览器进行限制的;而因为post请求所携带的数据是放在http请求报文的请求数据中的,因此没有长度限制;
安全性不同:传统的说法是get请求的数据会在url暴露出来,而post不会,但这不能断定post请求就比get请求安全(因此这里说的安全是表面上的),因为post经过抓包也能看见http请求报文中的详细内容,数据也自然暴露出来了
9、地址栏输入一个url会发生什么?(http请求过程)
①输入地址:
当输入地址时,浏览器已经开始从缓存中读取数据了,可以智能寻找你所要的url,让你可以补全url地址
②浏览器查找域名的 IP 地址:
请求发起后(Enter键),第一步解析url的域名,首先查看本地磁盘的hosts文件,如果有域名对应的规则,则直接使用对应的ip地址
如果本地hosts文件找不到,则发一个DNS请求到本地DNS服务器,首先查询缓存,再到域服务器查询,然后返回一个解析服务器地址,向这个解析服务器地址发请求,这时候就能收到一个域名和ip地址的对应关系了,并保存到缓存中
(扩展:DNS就是根据域名获取IP地址的服务器)
③浏览器向web服务器发送一个http请求
在发送http请求之前,浏览器会先建立tcp连接(因为有连接才能发送请求,)。浏览器在拿到域名对应的ip地址后,会以一个随机端口向web服务器端口发起tcp的连接,建立连接后再发送http请求
④服务器的永久重定向响应
服务器给浏览器响应一个301永久重定向响应
⑤浏览器跟踪重定向地址
⑥服务器处理请求(例如Java中执行handler→service→mapper→数据库)当然对于一些大网站,会搭配负载均衡Nginx来进行请求分发,不至于请求至一个服务器,导致压力过大
⑦服务器返回一个http响应,并关闭tcp连接
⑧浏览器显示HTML(如果含有其他css、js文件,同样会进行发请求获取并载入)
10、说一下http请求报文与http响应报文格式?
http请求报文:请求行(请求方法、url、协议版本)、请求头、请求正文(也叫请求数据)
http响应报文:响应行(协议版本、状态代码、状态描述)、响应头、响应正文(也叫响应数据)
11、http 响应码 301 和 302 代表的是什么?有什么区别?
301代表永久重定向,当原来的地址不再使用,比如说需要更换域名了,一般使用301进行重定向;
302代表临时重定向,旧地址的资源仍然存在,只是临时重定向到另一个地址罢了
12、forward 和 redirect 的区别?
请求转发是服务器内部的转发,是直接转发,浏览器中url的变化是看不到的,并且转发时原来携带的参数仍然可以使用;
请求重定向是客户端层面的,是间接转发,用户需重新请求另一个地址,因此url发生了改变,同时原来request域中的参数失效,而且发送的请求是两次。
13、http有没有状态?
HTTP是一种无状态协议,即服务器不保留与客户交易时的任何状态。也就是说上一次请求对这次的请求是没有影响的,服务器也不会对上一次的请求进行任何记录处理。因此每次访问服务器都无法判断是否已经登录,都需重新登录。
如果想要http有状态,可以使用cookie和session
14、http与https的区别?
①http是超文本传输协议,信息是明文传输,而https是具有安全性的SSL加密传输协议;
②http与https使用的是完全不同的连接方式,而且端口也不一样http是80,而https是443;
③http连接很简单,是无状态的;https协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议更安全
15、session和cookie的区别?
①session用在服务器端,cookie用在客户端的浏览器上
②session的生效依赖于cookie中的session id,如果cookie禁用了,那么session也会失效
③cookie不是浏览器生成的,而是服务器端传递给客户端的(在响应报文中),而session是服务器端生成的,用于保存状态的
16、https连接建立过程?
https实际上也是基于tcp的连接,但是与传统的tcp不太当用户相同,具体过程如下:
①当浏览器发送https请求时,首先将客户端支持的加密算法带给服务器。
②服务器接收到加密算法后,与自己的加密算法进行比对,如果不一致则直接断开连接;如果一致,服务器颁发数字证书(公钥)给客户端浏览器,包括证书日期,机构等。
③客户端接收到证书后进行验证,看是否合法(没过期等)。验证通过后,客户端随机生成一个字符串,使用公钥进行加密,保证了只有服务器端的私钥才能进行解密查看真正的数据,然后将加密好的信息发送给服务器。
④服务器接收到加密信息后进行私钥解密,查看数据是否正确,如果正确,服务器跟客户端一样也生成一个随机字符串并加密,发送给客户端。
⑤客户端接收到加密信息后,进行解密查看,验证是否正确,如果正确,表名双方通道安全,可以建立连接,握手完毕,此时即可以进行通信了
17、说一下tcp/ip的四层和对应的作用?
①应用层:负责处理应用程序的逻辑,提供可操作的界面
②传输层:提供两台主机之间的数据传输服务
③网络层:ip地址编址以及路由选择转发
④网络接口层:实际上是数据链路层和物理层的合体,提供实际数据传输、差错检验、MAC地址编址与寻址
18、讲一下127.0.0.1、255.255.255.255、0.0.0.0?
127.0.0.1:本机地址,不能用于传输,主要用于测试,同时在windows系统中有一个别名localhost
0.0.0.0:有一些网络访问无法得知目标网络地址,那么将会使用0.0.0.0作为默认路由
255.255.255.255:限制广播地址,当路由器进行转发数据报时,如果发现目的地址为255.255.255.255,那么将不会进行转发,这样的数据报仅出现在本地网络中
19、TCP的实现步骤
服务端:
①创建ServerSocket对象,绑定监听端口
②调用该对象的accept()方法获取Socket对象,持续监听客户端的连接
③通过Socket获取输入流,读数据
客户端:
①创建Socket对象,指定ip地址和端口号
②通过Socket获取输出流,进行发送数据
20、UDP的实现步骤
服务端:
①创建DatagramSocket对象,并绑定端口
②创建数据包DatagramPacket,用于接收数据
③调用DatagramSocket对象的receive()方法接收数据
④解析数据包打印结果
客户端:
①创建DatagramSocket对象
②创建数据包DatagramPacket,指定ip地址、端口号和要发送的数据
③调用DatagramSocket对象的send()方法发送数据包