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

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

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

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

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


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























