#### 基礎題
---
##### 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. 各個狀態的意義如下

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協議的抽象,從而形成了我們知道的一些最基本的函數接口。