第十篇:计算机网络

目录

1. 计算机网络的体系结构

2. 介绍一下五层协议体系结构

3. TCP/UDP协议有什么区别?

4. 三次握手

5. 四次挥手

6. HTTP和HTTPS有什么区别?HTTPS是怎么做的加密机制?

7. 常见的HTTP状态码

8. GET和POST请求的区别?

9. 跨域同源是什么?怎么解决跨域问题?

10. 什么是对称加密和非对称加密?

11. cookie、session和token是什么?

12. servlet是什么?线程安全吗?

13. servlet的生命周期?


1. 计算机网络的体系结构

2. 介绍一下五层协议体系结构

  • 应用层:应用程序之间的交互。这一层有http协议、FTP协议、支持电子邮件的SMTP协议;
  • 运输层:负责两台主机之间的数据传输。这一层有TCP、UDP、Dubbo协议;
  • 网络层:负责找到主机在网络中的位置,确保数据准确传输。有IP协议;
  • 数据链路层:把网络层传下来的IP数据包组装成帧,在两台主机之间传输帧;
  • 物理层:物理层的传输数据的单位是比特,负责在两台主机之间传输比特流。

3. TCP/UDP协议有什么区别?

  • UDP面向无连接,数据传输不可靠,但是效率高,支持一对多,比如IP电话、视频会议、直播都用的UDP协议
  • TCP面向连接,数据传输可靠,只能一对一,比如文件传输就用的TCP协议

基于TCP/UDP的应用层协议有哪些?

基于TCP的协议:http、https、FTP、SMTP(发邮件)、POP3(收邮件)

基于UDP的协议:NTP(网络时间协议,用于网络同步)、DHCP(动态主机配置协议)

基于TCPUDP的协议:DNS,用于完成地址查找、邮件转发

4. 三次握手

讲解链接:TCP的三次握手与四次挥手理解及面试题(很全面) - 李卓航 - 博客园

  • 第一次握手:客户端向服务端发送一个同步报文(SYN=1,seq=x),服务端收到后,就确定了客户端的发件能力和自己的收件能力;
  • 第二次握手:服务端向客户端发送确认报文+同步报文(SYN=1, ACK=1, seq=y, ack=x+1),客户端收到后,就确认了自己和服务端的收发件能力;
  • 第三次握手:客户端向服务端发送确认报文(ACK=1, ack=y+1, seq=x+1),服务端收到后,就确认了自己的发件能力和客户端的收件能力。

seq:序列号,每次由计算机随机生成

ack:确认号,取值是seq+1

SYN、ACK、FIN:这种大写的都是标志位,要么是1,要么是0,表示序列号或者确认号是否有效

5. 四次挥手

  • 第一次挥手:客户端向服务端发送释放连接报文(FIN=1, seq=u),并不再给服务端发送数据包;
  • 第二次挥手:服务端收到后,向客户端发送确认释放连接报文(ACK=1, ack=u+1, seq=v),告诉客户端自己知道客户端要释放连接了;
  • 第三次挥手:服务端等待一段时间后,确认自己也没有要向客户端发送的数据包,就给客户端发送 确认连接释放报文+连接释放报文(FIN=1, ACK=1, ack=u+1, seq=w);
  • 第四次挥手:客户端收到后,向服务端发送确认报文(ACK=1,ack=w+1, seq=u+1),告诉服务端自己收到服务端已关闭的消息了,服务端收到后,关闭连接。客户端等待2MSL(最长报文段生存时间)后,自动关闭连接。

为什么客户端要再等待2MSL(最长报文段生存时间)才关闭?

因为最后一次客户端给服务端发的确认包有可能丢失,此时服务端没收到消息,就会继续向客户端发送确认包+连接释放报文,所以客户端要再等待一个发送和回复报文的时间再关闭,保证服务端确实已经关闭连接了。

为什么握手三次,而挥手要四次?

因为释放连接的时候,服务端要确认自己也没有数据包发给客户端,才会发送释放连接报文

为什么握手要三次?两次不行吗?

不行,三次握手是客户端和服务端确认双方收发件能力的过程,如果只有前两次握手,没有最后一次,服务端就无法得知自己的发件能力和客户端的收件能力。

并且两次握手如果第二次握手的报文丢失,服务端就不会再给客户端发送报文;但是三次握手,服务端没收到客户端的确认报文就会重发第二次握手的报文。

如果已经建立了连接,但是客户端突然故障了怎么办?

TCP设有一个保活计时器,通常时间是2小时。每次客户端给服务端发送数据,服务端都会把计时器复位,如果超过2小时客户端都没发送数据,服务端就会每隔75秒向客户端发送一个探测报文,连续10次客户端还没响应,服务端就会关闭连接。

6. HTTP和HTTPS有什么区别?HTTPS是怎么做的加密机制?

https信息传输更加安全,因为它加上了SSL安全协议。

SSL主要有三个作用:身份验证(非对称加密)、数据加密(对称加密)、数据完整性验证(散列算法,比如md5)

Https工作流程

准备阶段:

  • 服务器生成公钥S.pub和私钥S.pri,公钥发给CA,私钥自己保存
  • CA生成C.pub和C.pri,并用C.pri对S.pub签名生成CA证书
  • 然后把证书给服务器,证书和C.pub给客户端

客户端和服务端交互阶段:

  • 客户端发起一个请求(三次握手)
  • 服务端把CA证书发给客户端
  • 客户端用C.pub验证证书合法性
  • 如果证书合法,客户端则生成对称秘钥,并用S.pub把对称秘钥加密发给服务端
  • 双方通过客户端生成的随机秘钥进行通信

其中涉及到两对公钥和私钥,C.pub和C.pri用于签名(CA机构用C.pri给S.pub加签形成证书,客户端用C.pub对证书验签),S.pub和S.pri用于加解密(S.pub用于给对称秘钥加密,S.pri用于解密对称秘钥)

7. 从输入URL到页面展示到底发生了什么?

  1. 用户输入URL后,浏览器会通过DNS服务器获取域名对应的IP和端口
  2. 浏览器根据IP和端口,向目标服务器发起一个TCP连接请求(过程中发送数据使用的是IP协议)
  3. 浏览器在TCP连接上,向服务器发送一个HTTP请求,并等待服务器处理后返回的HTTP响应
  4. 浏览器收到响应报文后,解析响应体中的HTML代码,并渲染网页结构和样式
  5. 浏览器在不需要和服务器通信时,可以主动关闭TCP连接,或等待服务器的关闭请求

8. 常见的HTTP状态码

  • 1xx:请求处理中
  • 2xx:成功。比如:200-请求成功
  • 3xx:重定向。比如:302-临时重定向
  • 4xx:客户端错误。比如:404-找不到资源、403-请求的资源被服务端拒绝
  • 5xx:服务端错误。比如:500-服务器内部错误

9. GET和POST请求的区别?

get是不安全的,请求参数都在url中,而post的请求参数对用户不可见。

get请求提交的url长度不能超过2048个字节,这是浏览器限制的,防止有人恶意发送请求,post则没有这个限制。

10. 跨域同源是什么?怎么解决跨域问题?

同源:两个URL的协议,域名,端口一致,反之就是跨域.

出现跨域的根本原因:浏览器的同源策略不允许非同源的 URL 之间进行资源的交互

怎么解决跨域问题?

        常用的两种解决方案:分别是JSONPCORS

  • JSONP:兼容性好,但是是一种临时解决方案,只支持GET请求,不支持POST
  • CORS:从根本上解决问题,但是不兼容某些低版本的浏览器

JSONP:

        实现原理就是通过<script>标签的src属性,请求跨域的接口数据,并通过函数调用的形式,接受跨域接口响应回来的数据

CORS:

        在服务端配置 CORS,允许指定的源(域名、协议、端口)访问资源

        原理:浏览器会在请求头中携带一个字段:Origin,Origin中会指出当前请求属于哪个域(协议+域名+端口)。服务会根据这个值决定是否允许其跨域。

11. 什么是对称加密和非对称加密?

对称加密:加解密使用的秘钥是同一个。比如AES对称加密

非对称加密:公钥加密,私钥解密。比如RSA非对称加密

为什么公钥加密的数据可以用私钥解密?

        非对称加密的算法就是可以用一对秘钥,一个加密,一个解密。具体就是数学问题了

12. cookie、session和token是什么?

  • cookie:保存在客户端的key-value格式的文件,也叫浏览器缓存。可以存储用户名密码等,用于实现自动登录,自动填充用户名等;
  • session:保存在服务端的存储空间,一般用来存储用户的身份信息、登录状态。客户端发起请求时,cookie里会携带sessionId,服务端根据sessionId找到对应的session
  • token:用户的身份令牌,用户第一次请求时,服务端查询数据库对比用户名和密码是否匹配,并生成token并返回给客户端,客户端每次请求携带上token,服务端校验token的合法性

13. servlet是什么?线程安全吗?

servlet用于接收用户请求的HttpServletRequest,在doGet()、doPost()中做相应的处理,并返回HttpServletResponse。

servlet线程不安全,但是servlet是无状态的,也就是不存储数据,因此也就不存在并发写共享数据问题,所以某种程度上可以说它是线程安全的。

servlet是单例的吗?

默认是单例的,但是可以支持多例,给一个类上边加@webServlet注解,web容器启动的时候扫描到该注解,就会创建该类的视力,并加载到容器中。

14. servlet的生命周期?

web容器启动的时候,会调用servlet的init方法,初始化servlet

当有请求进入时,调用servlet的service()方法,service()会根据需要调用doGet()或doPost()

当服务器销毁的时候,会调用servlet的destory()方法,销毁servlet

15. 拆包和粘包

        TCP在接受数据的时候,用缓冲区来控制接收数据的大小。

  • 如果一次请求发送的数据包较小,没达到缓冲区大小,TCP则会把多个请求合并为一个请求进行发送,这就是粘包。
  • 如果一次请求发送的数据包较大,超过了缓冲区大小,TCP则会把其分为多次发送,这就是拆包。也就是也一个大数据包拆陈多个小包进行发送。

        由于TCP传输的数据是以流的形式,流数据没有明确的开始和结束位置,所以会导致消息的正确性受影响(比如数据混淆)。

        UDP不存在粘包问题,因为UDP有保护消息边界,每个UDP包中都有消息头。

解决方案:

  • 发送端将数据包封装为固定长度。缺点是数据量小时会用空字符还填充,额外增加网络传输负担
  • 在数据尾部增加特殊字符进行分割,比如\n,读的时候使用readline按行读取。缺点是如果传输的数据中有\n就会造成半包,所以最好对内容进行编码和解码
  • 将数据分为两部分,一部分是头部,一部分是内容体。其中头部结构大小固定,且有一个字段声明内容体的大小

HTTP是如何解决粘包拆包的?

http请求报文格式
1)请求行:以\r\n结束;
2)请求头:以\r\n结束;
3)\r\n;
3)请求体:数据;

http响应报文格式
1)响应行:以\r\n结束;
2)响应头:以\r\n结束;
3)\r\n;
4)请求体:数据;
  • 遇到第一个\r\n表示请求行结束
  • 遇到\r\n\r\n表示请求头结束
  • 请求头中有content-length标识body长度,依赖此字段读取请求体数据

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值