当前位置: 首页 > news >正文

字节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 ,获取最新动态,⚡️ 让信息传递更加迅速。

相关文章:

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

字节iOS面试经验分享:HTTP与网络编程 🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 目录 字节iOS面试经验分享:HTT…...

游戏引擎 Unity - Unity 启动(下载 Unity Editor、生成 Unity Personal Edition 许可证)

Unity Unity 首次发布于 2005 年,属于 Unity Technologies Unity 使用的开发技术有:C# Unity 的适用平台:PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域:开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…...

前端八股CSS:盒模型、CSS权重、+与~选择器、z-index、水平垂直居中、左侧固定,右侧自适应、三栏均分布局

一、盒模型 题目:简述CSS的盒模型 答:盒模型有两种类型,可以通过box-sizing设置 1.标准盒模型(content-box):默认值,宽度和高度只包含内容区域,不包含内边距、边框和外边距。 2.边框盒模型&a…...

Linux网络 | 网络层IP报文解析、认识网段划分与IP地址

前言:本节内容为网络层。 主要讲解IP协议报文字段以及分离有效载荷。 另外, 本节也会带领友友认识一下IP地址的划分。 那么现在废话不多说, 开始我们的学习吧!! ps:本节正式进入网络层喽, 友友们…...

服务器虚拟化实战:架构、技术与最佳实践

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 服务器虚拟化是现代 IT 基础设施的重要组成部分,通过虚拟化技术可以提高服务器资源利用率、降低硬件成本&am…...

(leetcode 213 打家劫舍ii)

代码随想录&#xff1a; 将一个线性数组换成两个线性数组&#xff08;去掉头&#xff0c;去掉尾&#xff09; 分别求两个线性数组的最大值 最后求这两个数组的最大值 代码随想录视频 #include<iostream> #include<vector> #include<algorithm> //nums:2,…...

[C语言日寄] <stdio.h> 头文件功能介绍

在C语言的世界里&#xff0c;<stdio.h> 是一个极其重要的头文件&#xff0c;它提供了标准输入输出功能&#xff0c;是C语言程序与用户交互的核心工具。今天&#xff0c;我们就来深入探讨 <stdio.h> 的功能、使用注意事项以及它的拓展应用。 功能介绍 <stdio.h…...

一文读懂 Faiss:开启高维向量高效检索的大门

一、引言 在大数据与人工智能蓬勃发展的当下&#xff0c;高维向量数据如潮水般涌现。无论是图像、音频、文本&#xff0c;还是生物信息领域&#xff0c;都离不开高维向量来精准刻画数据特征。然而&#xff0c;在海量的高维向量数据中进行快速、准确的相似性搜索&#xff0c;却…...

【二叉搜索树】

二叉搜索树 一、认识二叉搜索树二、二叉搜索树实现2.1插入2.2查找2.3删除 总结 一、认识二叉搜索树 二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09;是一种特殊的二叉树&#xff0c;它具有以下特征&#xff1a; 若它的左子树不为空&#xff0c;则…...

R语言统计分析——ggplot2绘图5——拟合光滑曲线

参考资料&#xff1a;R语言实战【第2版】 ggplot2包可以通过计算统计函数并添加到图形中。例如&#xff1a;分级数据、计算密度、轮廓和分位数等。这里我们重点将添加平滑曲线&#xff08;线性、非线性和非参数&#xff09;到散点图中。 我们可以使用geom_smooth()函数来添加一…...

疯狂拆单词01

疯狂拆单词01 有些单词是可以拆的&#xff0c;不&#xff0c;是可以反复拆的&#xff0c;拆着拆着&#xff0c;你的词汇量&#xff0c;就能快速飙升&#xff1a; 【】disappointment disappointment n.失望&#xff0c;沮丧&#xff0c;扫兴 &#xff08;ment-名缀&#xff0…...

高效学习方法分享

高效学习方法分享 引言 在信息高速发展的今天&#xff0c;学习已经成为每个人不可或缺的一部分。你是否曾感到学习的疲惫&#xff0c;信息的爆炸让你无从下手&#xff1f;今天&#xff0c;我们将探讨几种高效的学习方法&#xff0c;帮助你从中找到适合自己的学习之道。关于学…...

01.双Android容器解决方案

目录 写在前面 一&#xff0c;容器 1.1 容器的原理 1.1.1 Namespace 1.1.2 Cgroups&#xff08;Control Groups&#xff09; 1.1.3 联合文件系统&#xff08;Union File System&#xff09; 1.2 容器的应用 1.2.1 微服务架构 1.2.2 持续集成和持续部署&#xff08;CI/…...

一文大白话讲清楚webpack进阶——9——ModuleFederation实战

文章目录 一文大白话讲清楚webpack进阶——9——ModuleFederation实战1. 啥是ModuleFederation2. 创建容器应用3. 创建远程应用4. 启动远程应用5. 使用远程应用的组件 一文大白话讲清楚webpack进阶——9——ModuleFederation实战 1. 啥是ModuleFederation 先看这篇文章&#…...

Mysql意向锁

这里写目录标题 前置问题概念作用兼容互斥性总结 前置问题 首先我们需要问自己什么是意向锁&#xff1f; 为什么要有意向锁&#xff1f; 意向锁如何使用&#xff1f; 概念 mysql官网上对于意向锁的解释中有这么一句话 The main purpose of IX and IS locks is to show that …...

输入一行字符,分别统计出其中英文字母,空格,数字和其他字符的个数。

input_strinput("请输入一行字符: ") letter0 #表示英文字母的个数 space0 #表示空格的个数 digit0 # 表示数字的个数 others0 #表示其它字符的个数for char in input_str:if char.isalpha(): #判断字符char是否字母letter1elif char.isspace(): # 判断是否空格space…...

AD电路仿真

目录 0 前言 仿真类型 仿真步骤 仿真功能及参数设置 仿真模型 应用优势 1 新建原理图 2 放置元器件及布线 3 放置探头 4 实验结果 Operating Point 分析的作用 DC Sweep 的主要功能 Transient Analysis 的主要功能 AC Analysis 的功能 5 总结 1. 直流工作点分析…...

vim 中粘贴内容时提示: -- (insert) VISUAL --

目录 问题现象&#xff1a;解决方法&#xff1a;问题原因&#xff1a; 问题现象&#xff1a; 使用 vim 打开一个文本文件&#xff0c;切换到编辑模式后&#xff0c;复制内容进行粘贴时有以下提示&#xff1a; 解决方法&#xff1a; 在命令行模式下禁用鼠标支持 :set mouse …...

Redis_Redission的入门案例、多主案例搭建、分布式锁进行加锁、解锁底层源码解析

目录 ①. Redis为什么选择单线程&#xff1f; ②. 既然单线程这么好,为什么逐渐又加入了多线程特性&#xff1f; ③. redis6的多线程和IO多路复用入门篇 ④. Redis6.0默认是否开启了多线程&#xff1f; ⑤. REDIS多线程引入总结 ①. Redis为什么选择单线程&#xff1f; ①…...

ZZNUOJ(C/C++)基础练习1021——1030(详解版)

目录 1021 : 三数求大值 C语言版 C版 代码逻辑解释 1022 : 三整数排序 C语言版 C版 代码逻辑解释 补充 &#xff08;C语言版&#xff0c;三目运算&#xff09;C类似 代码逻辑解释 1023 : 大小写转换 C语言版 C版 1024 : 计算字母序号 C语言版 C版 代码逻辑总结…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...