面試總結一之linux和網絡

(1)linux系統內核態和用戶態是什麼,有什麼區別?
在理解內核態和用戶態之前我們需要先了解Linux的特權級。
特權級:其實無論是不是Unix或者Linux,對於任何操作系統來說,創建一個新的進程都是屬於核心功能,因爲它要做很多底層細緻地工作,消耗系統的物理資源,比如分配物理內存,從父進程拷貝相關信息,拷貝設置頁目錄頁表等等,這些顯然不能隨便讓哪個程序就能去做,於是就自然引出特權級別的概念,顯然,最關鍵性的權力必須由高特權級的程序來執行,這樣纔可以做到集中管理,減少有限資源的訪問和使用衝突。就Intel x86架構的CPU來說一共有0~3四個特權級,0級最高,3級最低,硬件上在執行每條指令時都會對指令所具有的特權級做相應的檢查,相關的概念有CPL、DPL和RPL,這裏不再過多闡述。硬件已經提供了一套特權級使用的相關機制,軟件自然就是好好利用的問題,這屬於操作系統要做的事情,對於Unix/Linux來說,只使用了0級特權級和3級特權級。也就是說在Unix/Linux系統中,一條工作在0級特權級的指令具有了CPU能提供的最高權力,而一條工作在3級特權級的指令具有CPU提供的最低或者說最基本權力。
**區別:**現在我們從特權級的調度來理解用戶態和內核態就比較好理解了,當程序運行在3級特權級上時,就可以稱之爲運行在用戶態,因爲這是最低特權級,是普通的用戶進程運行的特權級,大部分用戶直接面對的程序都是運行在用戶態;反之,當程序運行在0級特權級上時,就可以稱之爲運行在內核態。雖然用戶態下和內核態下工作的程序有很多差別,但最重要的差別就在於特權級的不同,即權力的不同。運行在用戶態下的程序不能直接訪問操作系統內核數據結構和程序。
(2)BIO、NIO、AIO都是什麼,有什麼區別?
bio :同步阻塞,服務器實現模式是一個連接一個線程,當客戶端發來連接時服務器就需要啓動一個線程進行處理,如果這個連接不做任何事情就會造成不必要的線程開銷,當然線程池機制可以改善。
nio:同步非阻塞,服務器實現模式爲多個請求一個線程,即客戶端發來的請求都會註冊到多路複用器上,多路複用器輪訓的連接有io請求時纔開啓一個線程進行處理。
aio:異步非阻塞,服務器實現模式爲多個有效請求一個線程。即客戶端發來的請求由os處理完成纔會通知服務器應用啓動線程進行處理。
(3)TCP和UDP的區別?
TCP提供面向連接的、可靠bai的數據流傳輸,而UDP提供的是du非面向連接的、不可zhi靠的數據流傳輸。
TCP傳輸單dao位稱爲TCP報文段,UDP傳輸單位稱爲用戶數據報。
TCP注重數據安全性,UDP數據傳輸快,因爲不需要連接等待,少了許多操作,但是其安全性卻一般。
TCP編程的服務器端一般步驟是:
  1、創建一個socket,用函數socket();
  2、設置socket屬性,用函數setsockopt(); * 可選
  3、綁定IP地址、端口等信息到socket上,用函數bind();
  4、開啓監聽,用函數listen();
  5、接收客戶端上來的連接,用函數accept();
  6、收發數據,用函數send()和recv(),或者read()和write();
  7、關閉網絡連接;
  8、關閉監聽;

TCP編程的客戶端一般步驟是:
  1、創建一個socket,用函數socket();
  2、設置socket屬性,用函數setsockopt();* 可選
  3、綁定IP地址、端口等信息到socket上,用函數bind();* 可選
  4、設置要連接的對方的IP地址和端口等屬性;
  5、連接服務器,用函數connect();
  6、收發數據,用函數send()和recv(),或者read()和write();
  7、關閉網絡連接;

與之對應的UDP編程步驟要簡單許多,分別如下:
  UDP編程的服務器端一般步驟是:
  1、創建一個socket,用函數socket();
  2、設置socket屬性,用函數setsockopt();* 可選
  3、綁定IP地址、端口等信息到socket上,用函數bind();
  4、循環接收數據,用函數recvfrom();
  5、關閉網絡連接;

UDP編程的客戶端一般步驟是:
  1、創建一個socket,用函數socket();
  2、設置socket屬性,用函數setsockopt();* 可選
  3、綁定IP地址、端口等信息到socket上,用函數bind();* 可選
  4、設置對方的IP地址和端口等屬性;
  5、發送數據,用函數sendto();
  6、關閉網絡連接;
  (4)詳細敘述TCP3次握手,TCP和HTTP的區別,第三次握手如果失敗會怎樣,TCP關閉時的4次揮手。
 1、客戶端的TCP進程也首先創建傳輸控制模塊TCB,然後向服務端發出連接請求報文段,該報文段首部中的SYN=1,ACK=0,同時選擇一個初始序號 seq=i。TCP規定,SYN=1的報文段不能攜帶數據,但要消耗掉一個序號。這時,TCP客戶進程進入SYN—SENT(同步已發送)狀態,這是 TCP連接的第一次握手。
2、服務端收到客戶端發來的請求報文後,如果同意建立連接,則向客戶端發送確認。確認報文中的SYN=1,ACK=1,確認號ack=i+1,同時爲自己 選擇一個初始序號seq=j。同樣該報文段也是SYN=1的報文段,不能攜帶數據,但同樣要消耗掉一個序號。這時,TCP服務端進入SYN—RCVD(同 步收到)狀態,這是TCP連接的第二次握手。
3、TCP客戶端進程收到服務端進程的確認後,還要向服務端給出確認。確認報文段的ACK=1,確認號ack=j+1,而自己的序號爲seq=i+1。 TCP的標準規定,ACK報文段可以攜帶數據,但如果不攜帶數據則不消耗序號,因此,如果不攜帶數據,則下一個報文段的序號仍爲seq=i+1。這 時,TCP連接已經建立,客戶端進入ESTABLISHED(已建立連接)狀態。這是TCP連接的第三次握手,可以看出第三次握手客戶端已經可以發送攜帶 數據的報文段了。
第三次握手如果失敗會怎樣:
當失敗時服務器並不會重傳ack報文,而是直接發送RTS報文段,進入CLOSED狀態。這樣做的目的是爲了防止SYN洪泛攻擊。
TCP關閉時的4次揮手
Server端收到Client端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,”你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。
(5)rpc和http的區別,你知道有什麼rpc框架。
1 RPC要求服務提供方和服務調用方都需要使用相同的技術,要麼都hessian,要麼都dubbo
而http無需關注語言的實現,只需要遵循rest規範
2 RPC的開發要求較多,像Hessian框架還需要服務器提供完整的接口代碼(包名.類名.方法名必須完全一致),否則客戶端無法運行
3 Hessian只支持POST請求
4 Hessian只支持JAVA語言
RPC:框架有:dubbo、cxf、(RMI遠程方法調用)Hessian
http:框架有:httpClient
(6)https相對http都實現了什麼加密方式,是對稱加密還是非對稱加密?
HTTPS 在內容傳輸的加密上使用的是對稱加密,非對稱加密只作用在證書驗證階段。
(7)用linux命令怎麼做分組求和,怎麼把字符串根據分隔符變成數組

s="student,teacher,history"

OLD_IFS="$IFS"                #IFS : Internal Field Separator,默認值爲空格,tab, 和新行

IFS=","                               #將IFS臨時替換爲","

arr=($s)

IFS="$OLD_IFS"              #將 IFS 替換回去  

for i in ${arr[@]}               

do

    print $i

done



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章