面試總結8--計算機網絡相關問題Part2

1、關閉TCP連接一定需要4次揮手嗎?

不一定,4次揮手關閉TCP連接是最安全的做法。但在有些時候,我們不喜歡TIME_WAIT 狀態(如當MSL數值設置過大導致服務器端有太多TIME_WAIT狀態的TCP連接,減少這些條目數可以更快地關閉連接,爲新連接釋放更多資源),這時我們可以通過設置SOCKET變量的SO_LINGER標誌來避免SOCKETclose()之後進入TIME_WAIT狀態,這時將通過發送RST強制終止TCP連接(取代正常的TCP四次握手的終止方式)。但這並不是一個很好的主意,TIME_WAIT對於我們來說往往是有利的。

2、TCP/IP接受發送緩衝區相關概念

       Tcp收發需要緩衝區,udp不需要緩衝區。

    每個TCP套接口有一個發送緩衝區,可以用SO_SNDBUF套接口選項來改變這一緩衝區的大小。當應用進程調用write往套接口寫數據時,內核從應用進程緩衝區中拷貝所有數據到套接口的發送緩衝區,如果套接口發送緩衝區容不下應用程序的所有數據,或者是應用進程的緩衝區大於套接口的發送緩衝區,或者是套接口的發送緩衝區中有別的數據,應用進程將被掛起。內核將不從write返回。直到應用進程緩衝區中的所有數據都拷貝到套接口發送緩衝區。所以,從寫一個TCP套接口的write調用成功返回僅僅表示我們可以重新使用應用進程緩衝區,它並不是告訴我們對方收到數據。TCP發給對方的數據,對方在收到數據時必須給予確認,只有在收到對方的確認時,本方TCP纔會把TCP發送緩衝區中的數據刪除。由於應用程序調用send的速度跟網絡介質發送數據的速度存在差異,所以,一部分應用數據被組織成tcp數據報之後,會緩存在tcp socket的發送緩存隊列中,等待網絡空閒時再發送出去。同時,tcp協議要求對端在收到tcp數據報後,要對其序號進行ACK,只有當收到一個tcp數據報的ACK之後,纔可以把這個tcp數據報(以一個struct sk_buff的形式存在)socket的發送緩衝隊列中清除。

     UDP因爲是不可靠連接,不必保存應用進程的數據拷貝,應用進程中的數據在沿協議棧向下傳遞時,以某種形式拷貝到內核緩衝區,當數據鏈路層把數據傳出後就把內核緩衝區中數據拷貝刪除。因此它不需要一個發送緩衝區。寫UDP套接口的write返回表示應用程序的數據或數據分片已經進入鏈路層的輸出隊列,如果輸出隊列沒有足夠的空間存放數據,將返回錯誤ENOBUFS.

3IO多路複用相關問題?

概念:IO多路複用是指內核一旦發現進程指定的一個或者多個IO條件準備讀取,它就通知該進程。

輪詢(polling)用一個進程,但是使用非阻塞的I/O讀取數據,當一個I/O不可讀的時候立刻返回,檢查下一個是否可讀,這種方法比較浪費CPU時間,因爲大多數時間是不可讀,但是仍花費時間不斷反覆執行read系統調用。

異步I/O(asynchronousI/O),當一個描述符準備好的時候用一個信號告訴進程,但是由於信號個數有限,多個描述符時不適用

I/O多路轉接(I/O multiplexing)(貌似也翻譯多路複用),先構造一張有關描述符的列表(epoll中爲隊列),然後調用一個函數,直到這些描述符中的一個準備好時才返回,返回時告訴進程哪些I/O就緒。select和epoll這兩個機制都是多路I/O機制的解決方案,select爲POSIX標準中的,而epoll爲Linux所特有的。

(1)Select、Epoll機制相關概念(Epoll與Select機制區別)

    epoll模型及優缺點?(很重要!)

主要有3點,對應於select3個缺點:連接數受限 2 查找配對速度慢 3數據由內核拷貝到用戶態。

1.select的句柄數目受限,在linux/posix_types.h頭文件有這樣的聲明:#define__FD_SETSIZE    1024  表示select最多同時監聽1024個fd。而epoll監視的描述符數量不受限制,它的限制是最大的打開文件句柄數目。

2.epoll的最大好處是不會隨着FD的數目增長而降低效率,在selec中採用輪詢處理,其中的數據結構類似一個數組的數據結構, epoll是維護一個隊列,直接看隊列是不是空就可以了。epoll只會對"活躍"的socket進行操作---這是因爲在內核實現中epoll是根據每個fd上面的callback函數實現的。那麼,只有"活躍"的socket纔會主動的去調用 callback函數(把這個句柄加入隊列),其他idle狀態句柄則不會,在這點上,epoll實現了一個"僞"AIO。但是如果絕大部分的I/O都是“活躍的”,每個I/O端口使用率很高的話,epoll效率不一定比select高(可能是要維護隊列複雜)。

epoll是通過每個fd定義的回調函數來實現的。只有就緒的fd纔會執行回調函數

3.使用mmap加速內核與用戶空間的消息傳遞。無論是select,poll還是epoll都需要內核把FD(文件描述符)消息通知給用戶空間,如何避免不必要的內存拷貝就很重要,在這點上,epoll是通過內核於用戶空間mmap同一塊內存實現的。

4、支持電平觸發和邊沿觸發(只告訴進程哪些文件描述符剛剛變爲就緒狀態,它只說一遍,如果我們沒有採取行動,那麼它將不會再次告知,這種方式稱爲邊緣觸發)兩種方式,理論上邊緣觸發的性能要更高一些,但是代碼實現相當複雜。

poll的實現和select非常相似,只是描述fd集合的方式不同,poll使用pollfd結構而不是selectfd_set結構,其他的都差不多


4大端模式和小端模式?

字節序分爲兩類:Big-EndianLittle-Endian,引用標準的Big-EndianLittle-Endian的定義如下:

a)   Little-Endian就是低位字節排放在內存的低地址端,高位字節排放在內存的高地址端。
b) Big-Endian
就是高位字節排放在內存的低地址端,低位字節排放在內存的高地址端。
c)
網絡字節序:TCP/IP各層協議將字節序定義爲Big-Endian,因此TCP/IP協議中使用的字節序通常稱之爲網絡字節序。

寫個小端模式轉大端模式函數:

判斷大端還是小端大端返回1,小端返回0。

int checkCPU(void)
{
union
{
        int a;
        char b;
}c;
c.a = 1;
return (c.b == 1);
}

由於聯合體union的存放順序是所有成員都從低地址開始存放,利用該特性就可以輕鬆地獲得了CPU對內存採用Little-endian還是Big-endian模式讀寫。

 

5、Linux下du,df的區別?

dfdu的統計機制不一樣。

du會把指定目錄下所有文件、目錄、目錄下的文件都統計。是建立在文件系統能看到的的確確是有這樣一些文件的基礎上的。也就是說我們能在文件系統裏面看到的文件纔會被du統計。

linuxdf命令的功能是用來檢查linux服務器的文件系統的磁盤空間佔用情況。可以利用該命令來獲取硬盤被佔用了多少空間,目前還剩下多少空間等信息。

 

6TCPMTUMSS

    MTU:最大傳輸單元,通俗的理解就是在網絡上傳送的最大數據包,單位是字節。以太網對數據幀的長度都有一個限制,其最大值爲1500,這個特性被稱作MTU,不同類型的網絡大多數都有一個上限。如果IP層有一個IP包要傳,而且數據的長度比鏈路層上的MTU值還要大,那麼就需要對這個數據包進行分片處理,而且要求被分片的每個數據包都要等於或小於這個MTU值,一般是最後一個數據包小於這個值。例如,一個大小爲5000字節的數據包在穿越網絡時,如果遇到一條MTU大小爲1500字節的數據鏈路,即數據幀對多能容納大小爲1500字節的數據包。需要在數據成幀之前將數據包分片成多個小的數據包。被分片後,每片數據包的標示字段上打上相同的標記,以便接收者可以識別出屬於同一個數據包的分片。如果不分片,該數據包就會被丟棄,從而造成數據包丟失。但是,如果因爲MTU值設定得太小,以致於一個不是很大的數據包被分成許多片進行傳輸,這樣就會產生很多數據包碎片,增加了設備負擔,降低了網絡使用率。

TCP-MSS:MSS是Maxitum Segment Size最大分段大小的縮寫,意爲TCP數據包每次能夠傳輸的最大數據分段,是TCP協議裏面的一個概念。

建立tcp連接的兩端在三次握手時會協商tcp mss大小. 單說拿TCP包做例子。報文傳輸1400字節的數據的話,那麼mss就是1400,再加上20字節IP包頭,20字節tcp包頭,那麼mtu就是1400+20+20. 當然傳輸的時候其他的協議還要加些包頭在前面,總之mtu就是總的最後發出去的報文大小。mss就是你需要發出去的數據大小。MSS就是TCP數據包每次能夠傳輸的最大數據分段。爲了達到最佳的傳輸效能TCP協議在建立連接的時候通常要協商雙方的MSS值,這個值TCP協議在實現的時候往往用MTU值代替(需要減去IP數據包包頭的大小20BytesTCP數據段的包頭20Bytes)所以往往MSS1460。通訊雙方會根據雙方提供的MSS值得最小值確定爲這次連接的最大MSS值。

 

7、mmap與malloc的比較?

      mmap並不分配空間只是將文件映射到調用進程的地址空間裏然後你就可以用memcpy等操作寫文件而不用write().寫完後用msync()同步一下你所寫的內容就保存到文件裏了不過這種方式沒辦法增加文件的長度因爲要映射的長度在調用mmap()的時候就決定了.

brksbrk主要的工作是實現虛擬內存到內存的映射.每個進程可訪問的虛擬內存空間爲3G,但在程序編譯時,不可能也沒必要爲程序分配這麼大的空間,只分配並不大的數據段空間,程序中動態分配的空間就是從這一塊分配的。如果這塊空間不夠,malloc函數族(realloccalloc等)就調用sbrk函數將數據段的下界移動,sbrk函數在內核的管理下將虛擬地址空間映射到內存,供malloc函數使用.


8、TCP/IP四層參考模型 ?

第一層:網絡接口層
  包括用於協作IP數據在已有網絡介質上傳輸的協議。實際上TCP/IP標準並不定義與ISO數據鏈路層和物理層相對應的功能。相反,它定義像地址解析協議(Address Resolution Protocol,ARP)這樣的協議,提供TCP/IP協議的數據結構和實際物理硬件之間的接口。
  第二層:網間層
  對應於OSI七層參考模型的網絡層。本層包含IP協議、RIP協議(Routing Information Protocol,路由信息協議),負責數據的包裝、尋址和路由。同時還包含網間控制報文協議(Internet Control Message Protocol,ICMP)用來提供網絡診斷信息。
  第三層:傳輸層
  對應於OSI七層參考模型的傳輸層,它提供兩種端到端的通信服務。其中TCP協議(Transmission Control Protocol)提供可靠的數據流運輸服務,UDP協議(Use Datagram Protocol)提供不可靠的用戶數據報服務。
  第四層:應用層
  對應於OSI七層參考模型的應用層和表達層。應用程序間溝通的層。因特網的應用層協議包括Finger、Whois、FTP(文件傳輸協議)、Gopher、HTTP(超文本傳輸協議)、Telent(遠程終端協議)、SMTP(簡單郵件傳送協議)、IRC(因特網中繼會話)、NNTP(網絡新聞傳輸協議)等.

9、3次握手,4次揮手狀態圖。

 
 
10、實現防火牆的主流技術?

1. 包過濾技術

包過濾是最早使用的一種防火牆技術,包過濾技術工作的地方就是各種基於TCP/IP協議的數據報文進出的通道,它把這兩層作爲數據監控的對象,對每個數據包的頭部、協議、地址、端口、類型等信息進行分析,並與預先設定好的防火牆過濾規則(Filtering Rule)進行覈對,一旦發現某個包的某個或多個部分與過濾規則匹配並且條件爲“阻止”的時候,這個包就會被丟棄。

2. 應用代理技術

由於包過濾技術無法提供完善的數據保護措施,而且一些特殊的報文攻擊僅僅使用過濾的方法並不能消除危害(如SYN攻擊、ICMP洪水等),因此人們需要一種更全面的防火牆保護技術,在這樣的需求背景下,採用“應用代理”(Application Proxy)技術的防火牆誕生了。一個完整的代理設備包含一個服務端和客戶端,服務端接收來自用戶的請求,調用自身的客戶端模擬一個基於用戶請求的連接到目標服務器,再把目標服務器返回的數據轉發給用戶,完成一次代理工作過程。

3 .狀態檢測技術

這種防火牆技術通過一種被稱爲“狀態監視”的模塊,在不影響網絡安全正常工作的前提下采用抽取相關數據的方法對網絡通信的各個層次實行監測,並根據各種過濾規則作出安全決策。

 
11、ATM?
ATM是異步傳輸模式的縮略語,ATM採用面向連接的交換方式,它以信元爲單位。之所以稱其爲異步,是因爲來自某一用戶的、含有信息的信息元重複出現不是週期性的。
ATM信元總長度53字節,前5字節爲信元頭負責差錯控制、流量控制、路由,後48字節爲有用信息。

12、子網劃分、求主機數?

子網劃分是通過借用IP地址的若干位主機位來充當子網地址從而將原網絡劃分爲若干子網而實現的。

劃分子網時,隨着子網地址借用主機位數的增多,子網的數目隨之增加,而每個子網中的可用主機數逐漸減少。以C類網絡爲例,原有8位主機位,2的8次方即256個主機地址,默認子網掩碼255.255.255.0。借用1位主機位,產生2個子網,每個子網有126個主機地址;借用2位主機位,產生4個子網,每個子網有62個主機地址……每個網中,第一個IP地址(即主機部分全部爲0的IP)和最後一個IP(即主機部分全部爲1的IP)不能分配給主機使用,所以每個子網的可用IP地址數爲總IP地址數量減2;根據子網ID借用的主機位數,我們可以計算出劃分的子網數、掩碼、每個子網主機數,

主機數:子網掩碼中主機號的位數n,主機數=2的n次方-2;


13、UDP socket一個綁定端口號和不綁定的區別,不綁定是什麼後果。不綁定IP又是什麼後果?
對於UDP來說,socket函數建立一個插口;bind函數指明瞭本地地址/端口(包括ADDR_ANY,通配所有本地網絡接口);connect可以用來指明目的地址/端口;
一般來說,UDP客戶端在建立了插口後會直接用sendto函數發送數據,需要在sendto函數的參數裏指明目的地址/端口。如果一個UDP客戶端在建立了插口後首先用connect函數指明瞭目的地址/端口,然後也可以用send函數發送數據,因爲此時send函數已經知道對方地址/端口,用getsockname也可以得到這個信息。UDP客戶端在建立了插口後會直接用sendto函數發送數據,還隱含了一個操作,那就是在發送數據之前,UDP會首先爲該插口選擇一個獨立的UDP端口(在1024-5000之間),將該插口置爲已綁定狀態。如果一個UDP客戶端在建立了插口後首先用bind函數指明瞭本地地址/端口,也是可以的,這樣可以強迫UDP使用指定的端口發送數據。(事實上,UDP無所謂服務器和客戶端,這裏的界限已經模糊了。)UDP服務器也可以使用connect,如上面所述,connect可以用來指明目的地址/端口;這將導致服務器只接受特定一個主機的請求。
l客戶端
1. TCP客戶端:
1) TCP客戶未綁定IP地址,當它調用connect時內核會根據外出接口給它綁定一個IP地址和一個臨時端口號。並且TCP服務器在接到這個連接後會以這個IP地址作爲迴應數據報的目的IP地址。
2) TCP客戶綁定了IP地址,它就爲發出的數據連接指定了一個源IP地址,並且TCP服務器在接到這個連接後會以這個IP地址作爲迴應數據報的目的IP地址。
3) TCP客戶只能根據四元組(原端口號,原IP地址,目的端口號,目的IP地址)接受數據報。
2. UDP客戶端:
1) UDP客戶未綁定IP地址,當它調用sendto時內核會根據外出接口給它綁定一個IP地址和一個臨時端口號。(UDP客戶可以接收到達它綁定的臨時端口的任何UDP數據報)。
2) UDP客戶綁定了IP地址,它就爲發出的數據報指定了一個源IP地址,並且UDP服務器在接到這個數據報後會以這個IP地址作爲迴應數據報的目的IP地址。(UDP客戶只能接收到達它綁定的臨時端口並且目的地址爲它綁定的IP地址的UDP數據報)。
3) UDP客戶調用connect,內核記錄下對方的IP地址和端口號,它們包含在傳遞給connect的套接口地址結構中,併爲UDP客戶綁定了一個臨時端口號和IP地址。(UDP客戶只能接收目的IP地址爲它綁定的IP地址和端口號並且源IP地址爲它指定對方的IP地址和端口號的數據報)。
l 服務器端
1. TCP服務器:
1) TCP服務器綁定通配IP地址,套接口會接收到達它綁定端口的任何TCP連接。並以接收的目的IP地址作爲它的源IP地址(用以確定四源組),以接收的源IP地址作爲它的目的IP地址發回應答。
2) TCP服務器綁定本地IP地址,這就限制了套接口只接收到達它綁定端口並且目的地址爲此IP地址的客戶連接。以綁定的目的IP地址作爲源IP地址(當然,綁定的IP地址肯定與接收連接的目的IP地址相同,否則它不會接收),並以接收的源IP地址作爲它的目的IP地址發回應答。
2. UDP服務器:
1) UDP服務器綁定通配IP地址,套接口會接收到達它綁定端口的任何UDP數據報。並以數據報的外出接口的主IP地址爲源IP地址,以接收到的源IP地址作爲它的目的IP地址發回應答。
2) UDP服務器綁定本機IP地址,這就限制了套接口只接收到達它綁定端口並且目的地址爲此IP地址的UDP數據報。並以綁定的IP地址作爲源IP地址,以接收的源IP地址作爲它的目的IP地址發回應答。
3) UDP服務器調用connect,內核記錄下對方的IP地址和端口號,它們包含在傳遞給connect的套接口地址結構中,併爲UDP服務器綁定了一個臨時端口號和IP地址。(UDP服務器只能接收目的IP地址爲它綁定的IP地址和端口號並且源IP地址爲它指定對方的IP地址和端口號的數據報)。
 
 
14、將文件或目錄拷貝到另一個Linux系統下?(scp)
scp就是security copy,用於將文件或者目錄從一個Linux系統拷貝到另一個Linux系統下。scp傳輸數據用的是SSH協議,保證了數據傳輸的安全,其格式如下:
scp 遠程用戶名@IP地址:文件的絕對路徑本地Linux系統路徑
scp 本地Linux系統文件路徑遠程用戶名@IP地址:遠程系統文件絕對路徑名。
目前我們處在IP爲“192.168.60.133”的Linux系統下,計劃將系統下的/home/ixdba/etc.tar.gz文件拷貝到IP爲“192.168.60.168”的遠程Linux系統中root用戶下的/tmp目錄下:
scp  /home/ixdba/etc.tar.gz  [email protected]:/tmp
 
15、SIGTERM和SIGKILL有什麼不同?
程序結束(terminate)信號,與SIGKILL不同的是該信號可以被阻塞和處理。通常用來要求程序自己正常退出,shell命令kill缺省產生這個信號。如果進程終止不了,我們纔會嘗試SIGKILL。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章