字节iOS面试经验分享:HTTP与网络编程

字节iOS面试经验分享:HTTP与网络编程


🌟 嗨,我是LucianaiB!

🌍 总有人间一两风,填我十万八千梦。

🚀 路漫漫其修远兮,吾将上下而求索。


目录

  1. 字节iOS面试经验分享:HTTP与网络编程
    1. HTTP协议简介
    2. iOS中HTTP请求的实现原理
    3. HTTPS与HTTP的区别
    4. TCP与UDP的区别
    5. 三次握手
    6. 四次挥手
    7. Cookie与Session
    8. 流量控制与拥塞控制
    9. 虚拟内存
    10. 多线程并发访问共享资源
    11. iOS中线程数量的限制
    12. 堆和栈的区别
    13. autoreleasepool的使用
    14. App从编译到可执行文件的过程
    15. 静态库与动态库的区别
    16. 类是如何添加到可执行文件中的
    17. 复制粘贴的原理
    18. 大容器VC的使用方式

最近,我有幸参加了字节跳动的iOS面试,这不仅是一次技术的挑战,更是一场知识的盛宴。面试过程中,我深刻感受到了字节对技术细节的严谨态度和对创新思维的高度重视。今天,我就把这次面试中关于HTTP与网络编程的那些事儿分享给大家,希望能帮到正在准备面试的小伙伴们。

HTTP协议简介

HTTP,即超文本传输协议,是互联网上应用最为广泛的网络协议之一。它基于TCP协议,通过请求-响应模式进行信息交换。客户端(如浏览器)向服务器发送请求,服务器处理后返回响应。这种模式使得客户端和服务器之间的数据交互变得简单而高效。

一个典型的URL地址,如https://www.google.com/search?q=url+含义#top,包含了多个部分,每个部分都有其特定的含义:

  • 协议https,表示使用安全协议访问,相比HTTP,HTTPS增加了SSL/TLS加密层,数据传输更加安全。
  • 域名www.google.com,表示Google搜索引擎的地址。
  • 路径/search,表示访问搜索页面。
  • 查询参数?q=url+含义,表示搜索关键词为"url 含义"。
  • 片段标识符#top,表示跳转到搜索结果页面的最顶部。

iOS中HTTP请求的实现原理

在iOS开发中,发起一个HTTP请求的原理是基于底层的网络协议栈。具体来说,它利用TCP或UDP协议建立网络连接,然后根据HTTP协议的规范发送请求信息并接收服务器的响应。这个过程涉及到以下几个关键步骤:

  1. 创建URLRequest对象:使用NSURLRequest类创建一个请求对象,设置请求的URL、HTTP方法(如GET、POST等)、请求头信息、请求体等。
  2. 创建URLSession对象:使用NSURLSession类创建一个会话对象,它负责管理HTTP请求的执行。可以选择使用默认的共享会话,也可以创建自定义的会话。
  3. 创建URLSessionTask对象:使用dataTask(with:completionHandler:)方法创建一个数据任务,它负责执行HTTP请求并处理响应数据。
  4. 执行任务:调用resume()方法启动HTTP请求。
  5. 处理响应:数据任务完成之后,会回调completionHandler,传递响应数据、响应头信息等。

HTTPS与HTTP的区别

HTTPS和HTTP的主要区别在于安全性。HTTPS在HTTP的基础上增加了SSL/TLS加密层,使用端口443,而HTTP使用的是明文传输,端口为80。这意味着在HTTPS中,数据在传输过程中被加密,即使被截获,也无法轻易被解读,从而大大提高了数据传输的安全性。

TCP与UDP的区别

TCP和UDP是两种常用的传输层协议,它们的主要区别如下:

  • 连接方式:TCP是面向连接的,需要通过三次握手建立连接,四次挥手断开连接;UDP是无连接的,不需要建立连接即可直接发送数据。
  • 报头大小:TCP数据报的报头大小最少为20字节,UDP数据报的报头固定为8字节。
  • 交付保证:TCP提供可靠的数据传输,如果数据在传输过程中丢失,会进行重传;UDP则不保证数据的可靠传输,数据包可能会丢失。
  • 流量控制和拥塞控制:TCP有流量控制和拥塞控制机制,可以根据网络状况调整数据传输速率;UDP则没有这些机制。
  • 面向对象:TCP面向字节流,UDP面向报文。

三次握手

三次握手是 TCP 协议建立连接的过程

  • 客户端发送 SYN 包: 客户端向服务器发送一个 SYN 包,请求建立连接,并包含客户端的初始序列号(ISN)。
  • 服务器发送 SYN+ACK 包: 服务器收到 SYN 包后,发送一个 SYN+ACK 包,表示同意建立连接,并包含服务器的初始序列号(ISN)和对客户端 SYN 包的确认号(ACK)。
  • 客户端发送 ACK 包: 客户端收到 SYN+ACK 包后,发送一个 ACK包,确认服务器的 SYN+ACK 包,并包含对服务器 SYN+ACK 包的确认号(ACK)。

四次挥手

四次挥手是 TCP 协议断开连接的过程

  • 客户端发送 FIN 包: 客户端向服务器发送一个 FI包,表示客户端不再发送数据,请求关闭连接。
  • 服务器发送 ACK 包: 服务器收到 FIN 包后,发送一个 ACK包,确认客户端的 FIN 包。此时服务器仍然可以向客户端发送数据。
  • 服务器发送 FIN 包: 服务器发送一个 FIN 包,表示服务器也不再发送数据,请求关闭连接。
  • 客户端发送 ACK 包: 客户端收到 FIN 包后,发送一个 ACK包,确认服务器的 FIN 包,并表示连接已关闭。

Cookie与Session

在HTTP协议中,Cookie和Session是两种常用的会话跟踪技术。Cookie存储在用户本地,由浏览器管理,而Session存储在服务器端。如果禁用了Cookie,可以使用URL重写技术来进行会话跟踪,即在URL后面附加sid=xxxxx等参数。

流量控制与拥塞控制

流量控制和拥塞控制是网络通信中的两个重要概念。流量控制主要关注单个连接的传输速率,通过接收方告知发送方当前的接收能力,发送方根据接收方的反馈调整发送速率。拥塞控制则关注整个网络的流量控制,通过网络节点的反馈信息,如丢包率、延迟等,来判断网络是否拥塞,并根据判断结果调整发送速率。

虚拟内存

虚拟内存是计算机系统中的一种内存管理技术。当程序运行时,如果内存不足,系统会将外存的一部分空间作为虚拟内存使用,从而扩展可用内存。然而,虚拟内存中的数据在断电后会丢失,与硬盘等外部存储器不同。

多线程并发访问共享资源

在多线程编程中,如果多个线程同时对一个共享资源进行操作,可能会导致数据不一致等问题。例如,两个线程对一个int a = 1的变量同时进行a++操作一万次,最后a的值可能会小于20000。这是因为a++操作并非原子操作,多个线程可能读取了相同的旧值并进行加1操作。解决方法包括使用互斥锁、原子操作等。

iOS中线程数量的限制

为了保证系统稳定性和性能,iOS对线程数量有着一定的限制。实际情况取决于设备的硬件资源和应用程序的内存使用情况。过多的线程可能会导致系统资源不足,从而引发应用程序崩溃或性能下降。因此,建议使用GCD或其他更高效的并发机制来管理线程。

堆和栈的区别

堆和栈是两种不同的内存分配方式。堆空间的内存是动态分配的,一般存放对象,并且需要手动释放内存。栈空间的内存是由系统自动分配,一般存放局部变量,如对象的地址等值,不需要程序员对这块内存进行管理。栈不够用时会发生栈溢出现象,此时可以使用堆来存储数据,但需要注意及时释放堆内存,否则会导致内存泄漏等错误。

@autoreleasepool的使用

在iOS开发中,@autoreleasepool用于管理自动释放对象的生命周期。使用@autoreleasepool可以减少内存峰值,特别是在需要创建大量临时对象的情况下,如在一个循环中不断创建和使用对象。此外,在非UI线程和自定义线程中,也需要手动创建@autoreleasepool,以确保在这些线程中创建的自动释放对象能够被及时释放,避免内存泄漏。

App从编译到可执行文件的过程

App从编译到变成可执行文件的过程包括以下几个阶段:

  1. 预处理:处理源代码文件中的以"#"开头的预编译指令。
  2. 编译:将高级语言翻译成汇编语言。
  3. 汇编:将汇编语言变成计算机可识别的二进制代码。
  4. 链接:把目标文件(一个或多个)和需要的库(静态库/动态库)链接成可执行文件。

静态库与动态库的区别

静态库和动态库是两种不同的库类型,它们的主要区别如下:

  • 静态库:在程序编译时就将所有要使用的库都装进了程序中,然后程序开始运行。优点是程序运行时不需要额外加载库,缺点是程序体积较大。
  • 动态库:程序运行时,用到什么库,再去链接什么库。优点是程序体积较小,缺点是程序运行时需要额外加载库,可能会导致程序启动速度变慢。

类是如何添加到可执行文件中的

类信息是在编译和链接阶段被添加到可执行文件中的。编译器会将类信息转换为机器码并生成符号表,链接器会将类信息整合到可执行文件中,并为其分配内存地址。

复制粘贴的原理

我们常用的复制粘贴功能,其原理是使用了共享内存。操作系统会将我们选择的文本、图像、文件等数据复制到一块共享内存区域中,当需要粘贴时,再从这块共享内存区域中读取数据。

大容器VC的使用方式

在iOS开发中,大容器VC的使用方式主要有两种:

  1. 直接调用:父容器VC直接持有子容器VC的引用,并在需要时直接调用子容器的声明周期方法。
  2. 代理模式:父容器VC可以定义一个代理协议,子容器VC实现该协议。通过代理模式,父容器VC可以间接调用子容器VC的方法,从而实现解耦和更好的代码组织。

嗨,我是LucianaiB。如果你觉得我的分享有价值,不妨通过以下方式表达你的支持:👍 点赞来表达你的喜爱,📁 关注以获取我的最新消息,💬 评论与我交流你的见解。我会继续努力,为你带来更多精彩和实用的内容。

点击这里👉LucianaiB ,获取最新动态,⚡️ 让信息传递更加迅速。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/8279.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins上生成的allure report打不开怎么处理

目录 问题背景: 原因: 解决方案: Jenkins上修改配置 通过Groovy脚本在Script Console中设置和修改系统属性 步骤 验证是否清空成功 进一步的定制 也可以使用Nginx去解决 使用逆向代理服务器Nginx: 通过合理调整CSP配置&a…

【16届蓝桥杯寒假刷题营】第2期DAY5

2.最大公因数 - 蓝桥云课 问题描述 给你2个正整数N,M。 你需要构造一个有N个数的正整数序列a,满足以下条件: ∑i1N​ai​M。 求gcd(a),可能的最大值。 输入描述 输入一行两个正整数N,M,表示数组的长…

【Linux系统】计算机世界的基石:冯诺依曼架构与操作系统设计

文章目录 一.冯诺依曼体系结构1.1 为什么体系结构中要存在内存?1.2 冯诺依曼瓶颈 二.操作系统2.1 设计目的2.2 系统调用与库函数 一.冯诺依曼体系结构 冯诺依曼体系结构(Von Neumann Architecture)是计算机的基本设计理念之一,由…

顶刊JFR|ROLO-SLAM:首个针对不平坦路面的车载Lidar SLAM系统

摘要 基于激光雷达(LiDAR)的同步定位与地图构建(SLAM)被认为是在恶劣环境中提供定位指导的一种有效方法。然而,现成的基于激光雷达的SLAM方法在经过不平坦地形时,尤其是在垂直方向相关的部分,会…

深度学习探索:ChatGPT数据分析精髓 梯度下降优化方法深度剖析

网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…

docker安装elk6.7.1-搜集java日志

docker安装elk6.7.1-搜集java日志 如果对运维课程感兴趣,可以在b站上、A站或csdn上搜索我的账号: 运维实战课程,可以关注我,学习更多免费的运维实战技术视频 0.规划 192.168.171.130 tomcat日志filebeat 192.168.171.131 …

网络工程师 (3)指令系统基础

一、寻址方式 (一)指令寻址 顺序寻址:通过程序计数器(PC)加1,自动形成下一条指令的地址。这是计算机中最基本、最常用的寻址方式。 跳跃寻址:通过转移类指令直接或间接给出下一条指令的地址。跳…

思科交换机telnet配置案例

目录 1.telnet简述2.网络拓扑3.设备说明4.网络配置4.1 电脑PC ip设置4.2 网络交换机telnet配置 5.小结 1.telnet简述 Telnet是远程登录服务的一个协议,该协议定义了远程登录用户与服务器交互的方式。它允许用户在一台联网的计算机上登录到一个远程分时系统中&#…

Spring MVC(二)

介绍 Cookie 与 Session Session 类似哈希表,存储了一些键值对结构,Key 就是 SessionID,Vaule 就是用户信息,客户端发起会话的时候,服务器一旦接收,就会创建会话【也就是 Session】,通过 Sessi…

spark运行流程

spark运行流程 任务提交后,先启动 Driver 程序随后 Driver 向集群管理器注册应用程序集群管理器根据此任务的配置文件分配 Executor 并启动Driver 开始执行 main 函数,Spark 查询为懒执行,当执行到 Action 算子时开始反向推 算,根…

【数据资产】数据资产管理概述

导读:数据资产管理在企业的数字化转型和业务发展中扮演着至关重要的角色。它直接关系到企业的决策效率、运营优化、业务创新以及风险防控等多个方面。数据资产作为企业的重要战略资源,能够为企业带来经济利益,其价值可能来自于数据本身的稀缺…

Qt中Widget及其子类的相对位置移动

Qt中Widget及其子类的相对位置移动 最后更新日期:2025.01.25 下面让我们开始今天的主题… 一、开启篇 提出问题:请看上图,我们想要实现的效果是控件黄色的Widge(m_infobarWidget)t随着可视化窗口(m_glWidge…

Mybatis配置文件详解

MyBatis通过XML或注解的方式将Java对象与数据库中的记录进行映射,极大地简化了数据访问层的开发。而在MyBatis的核心组成部分中,配置文件扮演着举足轻重的角色。它不仅定义了MyBatis的运行环境,还配置了数据源、事务管理、映射器等关键元素&a…

怎样在PPT中启用演讲者视图功能?

怎样在PPT中启用演讲者视图功能? 如果你曾经参加过重要的会议或者演讲,你就会知道,演讲者视图(Presenter View)对PPT展示至关重要。它不仅能帮助演讲者更好地掌控演讲节奏,还能提供额外的提示和支持&#…

算法-加油站问题

hello 大家好!今天开写一个新章节,每一天一道算法题。让我们一起来学习算法思维吧! function canCompleteCircuit(gas, cost) {// 加油站的总数const n gas.length;// 记录总剩余油量,若总剩余油量小于 0,说明无法绕环…

蓝桥杯模拟算法:蛇形方阵

P5731 【深基5.习6】蛇形方阵 - 洛谷 | 计算机科学教育新生态 我们只要定义两个方向向量数组,这种问题就可以迎刃而解了 比如我们是4的话,我们从左向右开始存,1,2,3,4 到5的时候y就大于4了就是越界了&…

MOS的体二极管能通多大电流

第一个问题:MOS导通之后电流方向可以使任意的,既可以从D到S,也可以从S到D。 第二个问题:MOS里面的体二极管电流可以达到几百安培,这也就解释了MOS选型的时候很少考虑体二极管的最大电流,而是考虑DS之间电流…

java语法学习

目录 一、基础语法 1.注释 2.关键字 3.字面量 4.变量 定义与使用 存储 5.数据类型 6.标识符 7.集成环境 二、运算符 1.概念 2.种类 算术运算符 除法与取模 转化规则 自增减 赋值运算符 关系运算符 逻辑运算符 短路运算符 三元运算符 其它运算符 三、流…

CAN总线

1. 数据帧(Data Frame) 数据帧是 CAN 总线中最常用的帧类型,用于传输实际的数据。其结构如下: 起始位(Start of Frame, SOF):标志帧的开始。标识符(Identifier)&#x…

Autosar-Os是怎么运行的?(Os基础模块)

写在前面: 入行一段时间了,基于个人理解整理一些东西,如有错误,欢迎各位大佬评论区指正!!! 书接上文 Autosar-Os是怎么运行的?(一)-CSDN博客 目录 1.Resourc…