这个问题我印象比较深刻,是之前面试开发时问到的。你说它难吧,其实网上都有标准答案。但是你说它不难吧,在面试上也很难说得上来,即使说上来了也只是八股文一笔带过。
当初被问到这个题的时候我就在想“该不会什么时候得罪面试官了?”,如果这题问现在的职场新人肯定会被怼,最起码会反问“知道又有什么用?你工作的时候会七层都用到吗?你们公司最多就到传输层,往下的有你什么事了吗?…”
好吧,虽然没什么用但该答的还是要答,我就按照自己的思路重新回答一下吧,记得多少答多少。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 种,都是基于服务端的优化方式:
- 压缩传输数据:对文本类数据启用 GZIP 压缩,减少包体积。对多媒体文件如图片、视频使用先压缩后上传的策略,而不是整个上传;
- 使用 CDN :使用 CDN 缓存和分发静态资源,就近响应用户请求;
- 采用 HTTP/2 :HTTP/2 引入多路复用、头部压缩、服务器推送等特性,可以有效优化 HTTP 性能;
- 优化 TCP 参数:一般通过调整 Linux 系统参数来实现,譬如:增加初始化拥塞窗口大小 ( Initial Congestion Window ) 。通过 setsockopt() 来设置 SOCKET_RCVBUF 和 SOCKET_SNDBUF 参数。通过修改 /proc/sys/net/ipv4/tcp_delayed_ack 来设置延迟回复来减少 ACK 数量等等;
至于前端嘛,公司有专门的开发人员管理,但如果给我管的话我可能会:
- 采用异步技术:使用 AJAX 、HTTP 流(Streaming)等异步技术,改善交互体验;
- 利用缓存机制:适当设置 Cache-Control 、Last-Modified 、Etag 等缓存头部信息,充分利用缓存避免重复请求;
- 查询字符串优化:避免过长查询字符串,使用 POST 提交数据;
估计就这些吧。