嵌入式筆試面試題目系列(三)
本系列將按照類別對題目進行分類整理,重要的地方標上星星,這樣有利于大家打下堅實的基礎。
第三章網(wǎng)絡編程
1 、TCP、UDP的區(qū)別
TCP---傳輸控制協(xié)議,提供的是面向連接、可靠的字節(jié)流服務。當客戶和服務器彼此交換數(shù)據(jù)前,必須先在雙方之間建立一個TCP連接,之后才能傳輸數(shù)據(jù)。
UDP---用戶數(shù)據(jù)報協(xié)議,是一個簡單的面向數(shù)據(jù)報的運輸層協(xié)議。UDP不提供可靠性,它只是把應用程序傳給IP層的數(shù)據(jù)報發(fā)送出去,但是并不能保證它們能到達目的地。
1)TCP是面向連接的,UDP是面向無連接的
2)UDP程序結構較簡單
3)TCP是面向字節(jié)流的,UDP是基于數(shù)據(jù)報的
4)TCP保證數(shù)據(jù)正確性,UDP可能丟包
5)TCP保證數(shù)據(jù)順序到達,UDP不保證
2 、TCP、UDP的優(yōu)缺點
TCP優(yōu)點:可靠穩(wěn)定
TCP的可靠體現(xiàn)在TCP在傳輸數(shù)據(jù)之前,會有三次握手來建立連接,而且在數(shù)據(jù)傳遞時,有確認、窗口、重傳、擁塞控制機制,在數(shù)據(jù)傳完之后,還會斷開來連接用來節(jié)約系統(tǒng)資源。
TCP缺點:慢,效率低,占用系統(tǒng)資源高,易被攻擊
在傳遞數(shù)據(jù)之前要先建立連接,這會消耗時間,而且在數(shù)據(jù)傳遞時,確認機制、重傳機制、擁塞機制等都會消耗大量時間,而且要在每臺設備上維護所有的傳輸連接。然而,每個連接都會占用系統(tǒng)的CPU,內(nèi)存等硬件資源。因為TCP有確認機制、三次握手機制,這些也導致TCP容易被利用,實現(xiàn)DOS、DDOS、CC等攻擊。
UDP優(yōu)點:快,比TCP稍安全
UDP沒有TCP擁有的各種機制,是一種無狀態(tài)的傳輸協(xié)議,所以傳輸數(shù)據(jù)非常快,沒有TCP的這些機制,被攻擊利用的機會就少一些,但是也無法避免被攻擊。
UDP缺點:不可靠,不穩(wěn)定
因為沒有TCP的這些機制,UDP在傳輸數(shù)據(jù)時,如果網(wǎng)絡質量不好,就會很容易丟包,造成數(shù)據(jù)的缺失。
3 、TCP UDP適用場景
TCP:傳輸一些對信號完整性,信號質量有要求的信息。
UDP:對網(wǎng)絡通訊質量要求不高時,要求網(wǎng)絡通訊速度要快的場景。
4、 TCP為什么是可靠連接?
因為tcp傳輸?shù)臄?shù)據(jù)滿足3大條件,不丟失,不重復,按順序到達。
5、OSI典型網(wǎng)絡模型,簡單說說有哪些

6、三次握手、四次揮手
三次握手

1、TCP服務器進程先創(chuàng)建傳輸控制塊TCB,時刻準備接受客戶進程的連接請求,此時服務器就進入了LISTEN(監(jiān)聽)狀態(tài);
2、TCP客戶進程也是先創(chuàng)建傳輸控制塊TCB,然后向服務器發(fā)出連接請求報文,這是報文首部中的同部位SYN=1,同時選擇一個初始序列號 seq=x ,此時,TCP客戶端進程進入了 SYN-SENT(同步已發(fā)送狀態(tài))狀態(tài)。TCP規(guī)定,SYN報文段(SYN=1的報文段)不能攜帶數(shù)據(jù),但需要消耗掉一個序號。
3、TCP服務器收到請求報文后,如果同意連接,則發(fā)出確認報文。確認報文中應該 ACK=1,SYN=1,確認號是ack=x+1,同時也要為自己初始化一個序列號 seq=y,此時,TCP服務器進程進入了SYN-RCVD(同步收到)狀態(tài)。這個報文也不能攜帶數(shù)據(jù),但是同樣要消耗一個序號。
4、TCP客戶進程收到確認后,還要向服務器給出確認。確認報文的ACK=1,ack=y+1,自己的序列號seq=x+1,此時,TCP連接建立,客戶端進入ESTABLISHED(已建立連接)狀態(tài)。TCP規(guī)定,ACK報文段可以攜帶數(shù)據(jù),但是如果不攜帶數(shù)據(jù)則不消耗序號。
5、當服務器收到客戶端的確認后也進入ESTABLISHED狀態(tài),此后雙方就可以開始通信了。
四次揮手

1、客戶端進程發(fā)出連接釋放報文,并且停止發(fā)送數(shù)據(jù)。釋放數(shù)據(jù)報文首部,F(xiàn)IN=1,其序列號為seq=u(等于前面已經(jīng)傳送過來的數(shù)據(jù)的最后一個字節(jié)的序號加1),此時,客戶端進入FIN-WAIT-1(終止等待1)狀態(tài)。TCP規(guī)定,F(xiàn)IN報文段即使不攜帶數(shù)據(jù),也要消耗一個序號。
2、服務器收到連接釋放報文,發(fā)出確認報文,ACK=1,ack=u+1,并且?guī)献约旱男蛄刑杝eq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態(tài)。TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,這時候處于半關閉狀態(tài),即客戶端已經(jīng)沒有數(shù)據(jù)要發(fā)送了,但是服務器若發(fā)送數(shù)據(jù),客戶端依然要接受。這個狀態(tài)還要持續(xù)一段時間,也就是整個CLOSE-WAIT狀態(tài)持續(xù)的時間。
3、客戶端收到服務器的確認請求后,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態(tài),等待服務器發(fā)送連接釋放報文(在這之前還需要接受服務器發(fā)送的最后的數(shù)據(jù))。
4、服務器將最后的數(shù)據(jù)發(fā)送完畢后,就向客戶端發(fā)送連接釋放報文,F(xiàn)IN=1,ack=u+1,由于在半關閉狀態(tài),服務器很可能又發(fā)送了一些數(shù)據(jù),假定此時的序列號為seq=w,此時,服務器就進入了LAST-ACK(最后確認)狀態(tài),等待客戶端的確認。
5、客戶端收到服務器的連接釋放報文后,必須發(fā)出確認,ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態(tài)。注意此時TCP連接還沒有釋放,必須經(jīng)過2∗ *∗MSL(最長報文段壽命)的時間后,當客戶端撤銷相應的TCB后,才進入CLOSED狀態(tài)。
6、服務器只要收到了客戶端發(fā)出的確認,立即進入CLOSED狀態(tài)。同樣,撤銷TCB后,就結束了這次的TCP連接。可以看到,服務器結束TCP連接的時間要比客戶端早一些。
第四章常見算法
十種常見排序算法可以分為兩大類:
非線性時間比較類排序:通過比較來決定元素間的相對次序,由于其時間復雜度不能突破O(nlogn),因此稱為非線性時間比較類排序。
線性時間非比較類排序:不通過比較來決定元素間的相對次序,它可以突破基于比較排序的時間下界,以線性時間運行,因此稱為線性時間非比較類排序。

算法優(yōu)劣評價術語
穩(wěn)定性:
穩(wěn)定:如果 a 原本在 b 前面,而 a = b,排序之后 a 仍然在 b 的前面;
不穩(wěn)定:如果 a 原本在 b 的前面,而 a = b,排序之后 a 可能會出現(xiàn)在 b 的后面;
排序方式:
內(nèi)排序:所有排序操作都在內(nèi)存中完成,占用常數(shù)內(nèi)存,不占用額外內(nèi)存。
外排序:由于數(shù)據(jù)太大,因此把數(shù)據(jù)放在磁盤中,而排序通過磁盤和內(nèi)存的數(shù)據(jù)傳輸才能進行,占用額外內(nèi)存。
復雜度:
時間復雜度: 一個算法執(zhí)行所耗費的時間。
空間復雜度: 運行完一個程序所需內(nèi)存的大小。


至于各種算法的原理以及代碼實現(xiàn),由于太多并且比較復雜,不在本文列出。但推薦兩本入門的書:《啊哈!算法》、《大話數(shù)據(jù)結構》。電子版我會發(fā)在交流群里。
排序算法很多,嵌入式要求的不會太多,你會冒泡排序、快速排序、插入排序就可以解決很多問題。難的比如動態(tài)規(guī)劃問題,圖的路徑問題,嵌入式考的比較少,純軟才會考這些。(大公司和獨角獸公司考的會相對難一些)