计算机网络
输入url发出请求的过程经历了什么
- DNS解析
- DNS解析可以理解为主寻找这个IP地址的过程,其中如果找到IP地址会进行本地缓存,以便下次继续使用
- TCP连接
- HTTP协议是使用TCP作为其传输层协议的
- 客户端发送HTTP请求
- HTTP请求报文是由三部分组成: 请求行, 请求报头和请求正文。请求正文一般是一些需要客户端向服务端发送的数据
- 服务器处理请求并返回HTTP报文
- HTTP响应报文也是由三部分组成: 状态码, 响应报头和响应报文。
- 状态码是由3位数组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息–表示请求已接收,继续处理。
2xx:成功–表示请求已被成功接收、理解、接受。
3xx:重定向–要完成请求必须进行更进一步的操作。
4xx:客户端错误–请求有语法错误或请求无法实现。
5xx:服务器端错误–服务器未能实现合法的请求。 - 响应报头:常见的响应报头字段有: Server, Connection…。
- 响应报文:服务器返回给浏览器的文本信息,通常HTML, CSS, JS, 图片等文件就放在这一部分。
- 浏览器解析渲染页面
- 浏览器一边解析一边渲染
- 结束
Servlet 的生命周期
Servlet 被服务器实例化后,容器调用运行其 init 方法,请求到达时运行其 service 方法,service 方法自动派遣运行与请求对应的 doGet 或 doPost 方法等;当服务器决定将实例销毁时调用其 destroy 方法。
OSI七层模型和TCP四层模型,各层之间数据包如何发送?
各层设备
- 第一层:物理层(PhysicalLayer)
主要功能 :传输比特流,工作在最底层,透明地传输比特流,就是传输的信号
典型设备:集线器、中继器,电缆,发送器,接收器 - 第二层:数据链路dao层(DataLinkLayer)
主要功能 :保证误差错的数据链路,一方面接收来自网络层(第三层)的数据帧并为物理层封装这些帧;另一方面数据链路层把来自物理层的原始数据比特封装到网络层的帧中。起着重要的中介作用。数据链路层由IEEE802规划改进为包含两个子层:介质访问控制(MAC)和逻辑链路控制(LLC)。
典型设备:交换机、网桥、网卡 - 第三层是网络层(Network layer)
主要功能 :路由,寻址,网络层确定把数据包传送到其目的地的路径。就是把逻辑网络地址转换为物理地址。如果数据包太大不能通过路径中的一条链路送到目的地,那么网络层的任务就是把这些包分成较小的包。
典型设备:路由器
后四层主要是计算机软件控制
- 第四层是处理信息的传输层(Transport layer)
主要功能 :端到端控制,确保按顺序无错的发送数据包。传输层把来自会话层的大量消息分成易于管理的包以便向网络发送
典型设备:网关 - 第五层是会话层(Session layer)
主要功能 :会话的建立和结束,在分开的计算机上的两种应用程序之间建立一种虚拟链接,这种虚拟链接称为会话(session)。会话层通过在数据流中设置检查点而保持应用程序之间的同步。允许应用程序进行通信的名称识别和安全性的工作就由会话层完成。
典型设备:网关 - 第六层是表示层(Presentation layer)
主要功能 :数据的表示、压缩和加密。定义由应用程序用来交换数据的格式,该层负责协议转换、数据编码和数据压缩。转发程序在该层进行服务操作。
典型设备:网关 - 第七层应用层(Application layer)
主要功能 :用户接口、应用程序。应用层向应用进程展示所有的网络服务。当一个应用进程访问网络时,通过该层执行所有的动作。
典型设备:网关
网关的作用是什么?
- 易于监控,可以在网关收集监控数据并将其推送到外部系统进行分析;
- 易于认证,可以在网关进行认证,然后再将请求转发到后端的微服务,而无需在每个微服务中进行认证;
- 减少客户端和各个微服务之间的交互次数。
TCP 的三次握手
TCP 是一种面向对象的 单播协议(一对一),在发送数据前,通信双方必须要在彼此之间建立一条连接
- 连接具体是指客户端和服务端的内存里保存一份关于对方的信息,例如:IP地址、端口号…
- TCP 可以看成是一种字节流,可以处理IP层的 丢包、重复和错误问题。在连接的建立过程中,通信双方需要交换一些连接的参数,这些参数放在 TCP 报文的首部
- TCP 协议提供了一种可靠、面向连接的、字节流、传输层的服务
三次握手的目的
让通信双方都能确认自身和对方具有正确的收发能力。(握手目的是建立可靠连接)。
三次握手过程简概
-
第一次握手
- 客户端发送网络包,服务端接收网络包
- 服务端接收到网络包后得出结论:客户端具有发送能力,自身具备接收能力
-
第二次握手
- 服务端发送网络包,客户端接收网络包
- 客户端接收到网络包后得出结论:服务端已经接收到自己发送的网络包,且能发送故服务端具有收发能力,自己也具有收发能力
- 注意:此时只有客户端知道双方具有收发能力,服务端并不知道客户端有接收能力——只知道自己有收发能力,客户端有发送能力
-
第三次握手
- 客户端发送网络包,服务端接收网络包
- 告知服务端双方都具有收发能力
TCP 的握手为什么是三次
-
谢希仁版《计算机网络》对这个问题进行了讨论。总的来说,三次握手是为了防止当已失效的连接请求报文段突然又传到服务端,造成双方的不一致,导致资源的浪费。
-
从上一个问题可以看出,三次握手是让客户端、服务端双方都知道两者都具有收发能力的最优次数。
- 为什么不用两次?两次握手服务端无法知道客户端具有接收能力
- 为什么不用四次?能三次解决没必要用四次
TCP 的四次挥手
断开TCP请求既可以由客户端发起也可以由服务端发起。这里讨论客户端发起断开连接请求的情况。
详细过程
(1) 客户端A发出一个关闭连接的命令,这会使得客户端的TCP发送一个特殊的TCP报文段给服务器B,这个报文段的FIN标记位(finish的缩写,表示结束)被置为1。此时A由ESTABLISHED状态转为FIN_WAIT_1状态,等待来自B的ACK报文。
(2) B收到这个报文段,检测到这是请求关闭连接的报文,发送一个确认报文段(ACK字段为1)给A,表示收到,通知A可以释放连接了。A收到这个ACK报文时,单方面释放了与B的连接,此时他不能再向B发送应用层数据了,但由于B可能还有数据没有发送完,所以此时A还可以接收来自B的报文段。此时A进入FIN_WAIT_2状态,等待来自B的FIN报文。B由ESTABLISHED状态进入CLOSE_WAIT状态。
(3) 当B向A发送完所有数据之后,也向A发送一个关闭连接的报文段,FIN和ACK都为1的报文段(还没有搞清楚为什么ACK也是1,但估计是为了与第一次的请求关闭报文段区分开),并等待来自A的确认报文段。此时B进入LAST_ACK状态。
(4) A接收到B的关闭连接请求后,给B发一个确认报文段,通知B可以释放连接了。B收到之后,释放所有连接资源,进入CLOSED状态。而A并没有马上释放资源,而是进入TIME_WAIT状态,等待一段时间(自定义,通常为30sec、1min或2min),使得可以在ACK报文段丢失的情况下进行重传。在等待时间结束之后,连接正式关闭,客户端的所有资源也被释放,进入CLOSED状态。
过程简概
客户端:数据已发送完成,要断开连接了。
服务端:收到。还有数据没发完,继续发送未完成的数据。
(客户端继续接收服务端发送的数据)
服务端:数据发送完成,可以断开连接。
客户端:收到。断开连接。
为什么要进行四次挥手
之所以需要进行四次挥手,在于某一方发起关闭连接的请求时,可以保证自己不再需要发送数据,但并不能猜测到对方是否已经发送完数据了,所以只是先通知对方我要断开连接了,你也差不多可以断开了,对方可以断开的时候则又会发一个断开连接的报文段。而额外的两个的ACK报文是确保两个FIN报文都被接收到。
TCP 的四次挥手过程中,TIME_WAIT 状态为什么要 2 MSL 时间
主动关闭的一方最后的状态是 TIME_WAIT。
- 为了保证A(主动关闭方)发送的最后一个ACK报文能够到达B。
- 这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。B会超时重传这个FIN_ACK报文段,而A就能在2MSL时间内受到这个重传的FIN+ACK报文段。
- 如果A(主动关闭方)在TIME_WAIT状态不等待一段时间,而是在发送完ACK报文段后就立即释放连接,就无法接收到B重传的FIN+ACK报文段,因而也不会再发送一次确认报文段。这样,B就无法按照正常的步骤进入CLOSED状态
- 总结:为了给B(被动关闭方)足够的时间知道A(主动关闭方)已经收到自己发送的FIN+ACK报文段,确保B的正确关闭
- 为了使下一个新的连接中不会出现旧的连接请求的报文段。
- A在发送完ACK报文段后,再经过 2MSL 时间,就可以使本连接持续的时间产生的所有报文段都从网络消失
get 和 post 请求的区别
- get 在浏览器回退时是无害的,而 post 会再次提交请求
- get 产生的 url 地址可以被 Bookmark(当做书签收藏),而post 不可用
- get 请求会被浏览器主动 cache,而 post 不会,除非手动设置
- get 请求只能进行 url 编码,而 post 支持多种编码方式
- get 请求参数会被完整保留在浏览器历史记录里,而 post 中的参数不会被保留
- get 请求在 url 中传送的参数是有长度限制的,而 post 没有
- 对于参数的数据类型,get 只接受 ASCII 字符,而 post 没有限制
- get 比 post 更不安全,因为参数暴露在 url上,所以不能用来传递敏感信息
- get 参数通过 url 传递,post 放在 Request body 中
TCP 与 UDP 的区别
- TCP 面向连接(如打电话要先拨号建立连接);UDP 是无连接的,即发送数据之前不需要建立连接
- TCP 提供可靠的服务(通过 TCP 连接传送的数据,无差错、不丢失、不重复,且按序到达);UDP 尽最大努力交付,不保证可靠交付
- TCP 面向字节流,实际上是 TCP 把数据看成一连串无结构的字节流;UDP 是面向报文的。
UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如 IP 电话,实时视频会议等) - 每一条 TCP 连接只能是点到点的;UPD 支持一对一,一对多,多对一和多对多的交互通信
- TCP 首部开销20字节;UDP的首部开销小,只有8个字节
- TCP 的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
小结
- 基于连接与无连接
- 对系统资源的要求(TCP 较多,UDP 少)
- UDP 程序结构较简单
- 面向字节流与面向报文
- 可靠性的不同
- 是否一对一的关系
TCP 与 HTTP 的联系
-
OSI网络七层协议:
应用层:网络服务与最终用户的一个接口。
表示层:数据的表示、安全、压缩。
会话层:建立、管理、终止会话。
传输层:定义传输数据的协议端口号,以及流控和差错校验。
网络层:进行逻辑地址寻址,实现不同网络之间的路径选择。
数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能。
物理层:建立、维护、断开物理连接。 -
HTTP 协议依赖于 TCP 协议
- TCP 协议是传输层协议,主要解决数据如何在网络中传输
- HTTP 协议是应用层协议,主要解决如何包装数据
- TCP/IP 与 HTTP 协议从本质上来说,没有可比性,我们在传输数据时,可以只使用 TCP/IP 协议,但是这样的话,如果没有应用层协议,便无法识别数据内容,如果想要传输的数据有意义,则必须使用到应用层协议,这时候应用层协议 http 就产生了
session 与 cookie 的区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以dao分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用cookie。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
- cookie 和session 的联系:
session是通过cookie来工作的
在购物网站中通常将用户加入购物车的商品联通session_id记录到数据库中,当用户再次访问是,通过sessionid就可以查找到用户上次加入购物车的商品。因为sessionid是唯一的,记录到数据库中就可以根据这个查找了。
拦截器与过滤器区别
-
过滤器(filter):就是对请求起到过i滤的作用,它在监听器之后,作用在servlet之前,对请求进行过滤。
-
拦截器(interceptor):就是对请求和返回进行拦截,它作用在servlet的内部,具体来说有三个地方:servlet_1和servlet_2之间,即请求还没有到controller层。servlet_2和servlet_3之间,即请求走出controller层次,还没有到渲染时图层。servlet_3和servlet_4之间,即结束视图渲染,但是还没有到servlet的结束。
-
监听器:监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
1 、拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2 、拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3 、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4 、拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5 、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
转发与重定向的区别
两者原理
- 请求转发
A 向 B 发送请求,想让 B 帮忙完成一项工作,当 B 接收到请求后发现自己完成不了,于是 B 请求 C 帮忙,C 接收到 B 的请求后最终完成了该项工作,并把最后的结果返回给 A 。此过程中 A 只发送了一次请求给 B ,A 只知道吧请求发给 B ,至于 B 怎么完成的 A 并不关心,A 只等待最终结果——不在乎过程 - 重定向
A 向 B 发送请求,想让 B 帮忙完成一项工作,当 B 接收到请求后发现自己完成不了,立即告诉 A 情况,并向 A 推荐 C 可以完成该项工作,于是 A 就找 C 帮忙,C 最终完成该项工作,返回给 A——请求者知道过程
区别与相似点
1.浏览器地址栏显示不同——表面区别
- 无论进行多少次请求,如果使用请求转发实现,浏览器地址栏中只显示第一次发送请求的地址
- 如果使用重定向实现,浏览器地址栏显示的是每次请求的新地址
2.组件之间可共享信息不同——本质区别
- 请求转发时,从发送第一次到最后一次请求的过程中,WEB容器只创建一次 request 和 response 对象,请求之间始终共享这两个对象,所以每个请求可以访问他之前请求中的参数和属性的值
- 重定向时,浏览器每发送一次请求,WEB 容器都会重新创建新的 request 和 response 对象,所以请求之间不能共享信息,即不能在请求中访问到他之前请求中的参数和属性的值
3.实现方式不同
- 请求转发实现步骤:
- 说明将要转发的资源
- 获取请求转发的对象
- 调用请求转发对象中的 forward() 方法
1). String forward = "/a.jsp";
2). RequestDispatcher rd = request.getRequestDispatcher(forward);
3). rd.forward(request, reponse);
//综合:request.getRequestDispatcher("/a.jsp").forward(request,response);
- 重定向实现步骤
- 说明将要重定向的资源
- 调用 response 对象中 sendRedirect() 方法
1. String resource = request.geContextPath() + "/a.jsp";
2. response.sendRedirect(resource);
//综合:response.sendRediect(request.geContextPath() + "/a.jsp");
4.知情人不同
- 请求转发的过程只有 WEB 服务器知道,而浏览器不知道进行了多少次转发,以及转发给哪些组件(servlet,JSP),它只是等待 WEB 服务器最终的结果
- 重定向时,每发送一次请求,WEB 服务器都会通知浏览器,所以重定向了几次请求以及每次都向哪个组件发送的请求,浏览器和 WEB 服务器都清楚
5.相同点:两者都能进行多次请求的转发
使用场景
- 重定向:之前的request中存放的变量全部失效并进入一个新session的作用域;
- 请求转发:之前的request中存放的变量没有失效,就想把两个页面拼在一起
如果要保留请求域中的数据,使用转发,否则使用重定向。
以后访问数据库,增删改使用重定向,查询使用转发。
无论转发或重定向后续的代码都会执行
302 状态码
301和302表示重定向:
301表示这个网页已经永久的由服务器的A路径下移动到路径B下,
而302表示临时移动到B路径下,对应到Url地址也即http://baidu.com/file/A/1.html到http://baidu.com/file/B/1.html,当浏览器访问前面一个地址的时候,这个时候服务器会告知浏览器,请到B路径下获取这个文件,随后浏览器重新发起网络请求,请求B路径下的页面,经过渲染,呈现给用户,例如淘宝的例子,请求taobao.com,收到302,从而浏览器再次请求www.taobao.com获得页面内容。
http 跟 https 的区别
http协议和https协议的bai区别:传输信息安全性不同、连接方式不du同、端口不同zhi、证书申请dao方式不同。
一、传输信息安全性不同
1、http协议:是超文本传输协议,信息是明文传输。如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息。
2、https协议:是具有安全性的ssl加密传输协议,为浏览器和服务器之间的通信加密,确保数据传输的安全。
二、连接方式不同
1、http协议:http的连接很简单,是无状态的。
2、https协议:是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议。
三、端口不同
1、http协议:使用的端口是80。
2、https协议:使用的端口是443.
四、证书申请方式不同
1、http协议:免费申请。
2、https协议:需要到ca申请证书,一般免费证书很少,需要交费。