ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
#### 基础题 --- ##### 1. i++ 和 ++i的区别 ``` int i = 1, a = 0; i++ 先运算在赋值, 例如 a = i++, 先运算a = i, 后运算 i = i + 1, 所以结果是 a = 1; ++i 先赋值在运算, 例如 a = ++1, 先运算i = i + 1,后运算a = i,所以结果是 a = 2; ``` ##### 2. 为什么要用源代码管理工具 ``` 1. 能过追踪项目从诞生一直到定案的过程 2. 方便记录一个项目所有的内容变化 3. 方便查阅特定版本的修订情况 ``` ##### 2. 最常用的版本控制工具是什么? 能大概讲讲原理吗? ``` 1. 最常用的版本控制工具有GIT和SVN。 2. SVN是集中式代码管理的核心服务器;所有开发者在开始新一天的工作之前必须从服务器获取代码,然后开发,最后解决冲突提交。所有的版本信息都放在服务器上。如果脱离了服务器,开发者基本上可以说是无法工作的。 3. GIT是分布式的版本控制系统;在git中并不存在主库这样的概念,每一份出的库都可以独立使用,任何两个库之间的不一致之处都可以进行合并。 ``` ##### 3. UINIX常用的命令 ``` 1. cd 改变工作目录 2. pwd输出当前工作目录的绝对路径,在UINIX中要执行什么命令,一定要知道自己当前所在的工作目录 3. ls 查看文件 4. touch 创建新文件,用于修改文件访问和修改时间的标准UINIX程序 ``` ##### 4. C语言 ``` C语言,开发的基础功底,iOS很多高级应用都要和C语言打交道,所以C语言在iOS开发中的重要性。里面的问题可能并不是C语言问题,但是属于计算机的一些原理性的知识。 ``` ##### 5. 谈谈HTTP、TCP、IP、socket协议的理解 ###### HTTP HTTP超文本传输协议,HTTP协议对应应用层,HTTP协议是基于TCP连接的。HTTP连接就是所谓的短连接,即客户端向服务器发送一次请求,服务器响应后连接立即会断掉。 因为HTTP是"短连接",所以要保持客户端程序的在线状态,需要不断的向服务器发起连接请求,一般的做法是不需要获取任何数据。客户端也保持每隔一段固定时间向服务器发送一次“保存连接”的请求,服务器端在收到请求之后对客户端进行回复,表示客户端在线。若服务器长时间无法收到客户端的请求,则认为客户端下线,若客户端长时间无法收到服务器的回复,则认为网络已经断开。 ###### TCP/IP 1. TPC/IP 协议是传输层协议,主要解决数据如何在网络中传输。“IP”代表网际协议,TCP和UDP使用该协议从一个网络传送数据包到另一个网络。把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口。TCP和UDP是高速公路上的“卡车”,它们携带的货物就是像HTTP,文件传输协议FTP这样的协议等。 你应该能理解,TCP和UDP是FTP,HTTP和SMTP之类使用的传输层协议。虽然TCP和UDP都是用来传输其他协议的,它们却有一个显著的不同:TCP提供有保证的数据传输,而UDP不提供。这意味着TCP有一个特殊的机制来确保数据安全的不出错的从一个端点传到另一个端点,而UDP不提供任何这样的保证。 2. 下面的图表试显示不同的TCP/IP和其他的协议在最初OSI模型中的位置: TCP 标志位,有以下6种标示 1、SYN(synchronous建立联机) 2、ACK(acknowledgement 确认) 3、PSH(push传送) 4、FIN(finish结束) 5、RST(reset重置) 6、URG(urgent紧急) Sequence number(顺序号码) Acknowledge number(确认号码) 3. 客户端 TCP 状态迁移: CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED 服务器TCP状态迁移: CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED 4. 各个状态的意义如下 ![152044946586380f9d7f316](http://p1.pstatp.com/large/pgc-image/152044946586380f9d7f316) LISTEN - 侦听来自远方TCP端口的连接请求; SYN-SENT -在发送连接请求后等待匹配的连接请求; SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认; ESTABLISHED- 代表一个打开的连接,数据可以传送给用户; FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认; FIN-WAIT-2 - 从远程TCP等待连接中断请求; CLOSE-WAIT - 等待从本地用户发来的连接中断请求; CLOSING -等待远程TCP对连接中断的确认; LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认; TIME-WAIT -等待足够的时间以确保远程TCP接收到连接中断请求的确认; CLOSED - 没有任何连接状态; ###### ```TCP/IP 三次握手``` 1. 第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。 2. 第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。 3. 第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。 完成后,客户端和服务器开始传送数据。 4. 由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。 CP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作 ###### Socket 1. socket连接就是所谓的长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉;但是由于各种环境因素可能会是连接断开,比如说:服务器端或客户端主机down了,网络故障,或者两者之间长时间没有数据传输,网络防火墙可能会断开该连接以释放网络资源。所以当一个socket连接中没有数据的传输,那么为了维持连接需要发送心跳消息~~具体心跳消息格式是开发者自己定义的。 2. 套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。 3. 我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。 实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现 只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、 listen、connect、accept、send、read和write等等。网络有一段关于socket和TCP/IP协议关系的说法比较容易理解:“TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。这个就像操作系统会提供标准的编程接口,比如win32编程接口一样,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。”实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口。socket是对端口通信开发的工具,它要更底层一些. 4. Socket是一个针对TCP和UDP编程的接口,你可以借助它建立TCP连接等等。而TCP和UDP协议属于传输层 。而http是个应用层的协议,它实际上也建立在TCP协议之上(HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力)。 ```总结:``` Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口。