【问题】你能说说 OSI 七层协议每一层都做了什么吗?每层常见技术有哪些?你最常用的技术是什么?怎样用的?

这个问题我印象比较深刻,是之前面试开发时问到的。你说它难吧,其实网上都有标准答案。但是你说它不难吧,在面试上也很难说得上来,即使说上来了也只是八股文一笔带过。

当初被问到这个题的时候我就在想“该不会什么时候得罪面试官了?”,如果这题问现在的职场新人肯定会被怼,最起码会反问“知道又有什么用?你工作的时候会七层都用到吗?你们公司最多就到传输层,往下的有你什么事了吗?…”

好吧,虽然没什么用但该答的还是要答,我就按照自己的思路重新回答一下吧,记得多少答多少。OSI 七层协议从下到上依次是:

OSI 层级 回答内容
物理层 做什么:定义了设备的物理特性,比如电缆、接口类型等;
常见技术:各种传输介质(双绞线、光纤等),各种接口和接头(RJ45、USB等);
数据链路层 做什么:在网络中的主机间数据帧传送,处理物理地址、MAC地址等;
常见技术:以太网、FDDI、PPP等数据链路层协议,VLAN、MAC地址等;
网络层 做什么:负责网络互连和IP寻址;
常见技术:IP、ARP、RARP、ICMP、IGMP等网络层协议。路由选择协议如RIP、OSPF、BGP等;
传输层 做什么:提供端到端的可靠传输,处理流量控制、重发等;
常见技术:TCP、UDP等传输层协议以及各种端口号;
会话层 做什么: 建立、管理和终结会话;
常见技术: PAP、SOCKS等会话层协议;
表示层 做什么:对数据进行加密和压缩等处理;
常见技术:ASCII、TIFF、GIF、PCM等数据表示与编码格式;
应用层 做什么:直接为用户的应用进程提供网络服务;
常见技术:HTTP、FTP、SMTP、POP3、DNS等应用层协议;

用得最多的肯定就是 HTTP 技术了,项目里面经常会用到 HttpClient 和 OKHttp 客户端,他们之间各自有自己的优缺点(仅代表个人使用后的意见):

客户端 优点 缺点
Apache HttpClient - 使用广泛、稳定且成熟
- API 完善,功能强大
- 支持多线程,连接池管理优秀
- 支持 HTTPS、认证、代理等功能
- 配置相对复杂
- 底层实现老旧,效率不如 OkHttp
- 不支持 HTTP/2
OkHttp - 性能高,传输速度快
- 支持 HTTP/2 ,采用了多路复用
- 内部实现利用Android最新特性
- 使用不及 Apache HttpClient 广泛
- 连接池管理不如Apache 完善

总体来说如果对于性能方面有所追求可以使用 OkHttp 试试,效果不错。但是如果想快速开发 Apache HttpClient 是更好的选择。扯远了,除了客户端之外,Springcloud 服务通讯也是用 HTTP 协议的(这个应该大家都懂)。它简单、灵活、易扩展,文本显示也便于调试,我想这应该是应用层使用率最高的通讯协议。

关于对 HTTP 性能的优化其实有很多种包括缓存、持久连接、分片传输、压缩、异步传输等,而 HTTP/2 和 HTTP/3 引入了多路复用、头部压缩、服务器推送等功能可以进一步提升 HTTP 性能。我这边接触得最多的是以下 4 种,都是基于服务端的优化方式:

  1. 压缩传输数据:对文本类数据启用 GZIP 压缩,减少包体积。对多媒体文件如图片、视频使用先压缩后上传的策略,而不是整个上传;
  2. 使用 CDN :使用 CDN 缓存和分发静态资源,就近响应用户请求;
  3. 采用 HTTP/2 :HTTP/2 引入多路复用、头部压缩、服务器推送等特性,可以有效优化 HTTP 性能;
  4. 优化 TCP 参数:一般通过调整 Linux 系统参数来实现,譬如:增加初始化拥塞窗口大小 ( Initial Congestion Window ) 。通过 setsockopt() 来设置 SOCKET_RCVBUF 和 SOCKET_SNDBUF 参数。通过修改 /proc/sys/net/ipv4/tcp_delayed_ack 来设置延迟回复来减少 ACK 数量等等;

至于前端嘛,公司有专门的开发人员管理,但如果给我管的话我可能会:

  1. 采用异步技术:使用 AJAX 、HTTP 流(Streaming)等异步技术,改善交互体验;
  2. 利用缓存机制:适当设置 Cache-Control 、Last-Modified 、Etag 等缓存头部信息,充分利用缓存避免重复请求;
  3. 查询字符串优化:避免过长查询字符串,使用 POST 提交数据;

估计就这些吧。

猜你喜欢

转载自blog.csdn.net/kida_yuan/article/details/132497983