有關網路程式設計的一些面試

2021-07-12 00:11:56 字數 3770 閱讀 5445

1,首先說明socket是什麼??

我們知道:資訊的互動需要涉及到tcp的四層模型

socket:可以看作使用者程序和核心網路協議棧程式設計(互動)介面

socket:不僅可以在同一臺主機上進行通訊,也可以在網路上不同的主機間進行通訊,也可以異構(軟硬體平台不同)進行通訊(手機qq和pc機上的qq進行通訊,手機的系統是arm,而pc機是x86)

全雙共的,可以從a主機到達b主機,也可以從b主機到達a主機 ,跟管道不同

2,資料的通訊的過程到底是什麼樣的???

類似與上圖,當主機a要想向主機b傳送資訊的過程中,首先是應用層通過套介面將要傳送的資訊給傳輸層,選擇以什麼協議傳送(tcp,udp)並加入首部,傳遞給網路層,加入ip首部,構成ip報文,繼續傳遞給鏈路層,交由乙太網傳遞出去,通過路由器等等,,,(如上,加入首部的過程就是封裝)

當資料到達對等方之後,乙太網接受到了資料幀,資料需要想上層傳輸,此刻,資料需要根據資料幀當中的型別欄位來進行傳遞,如果是arp的話,那就傳輸給鏈路層的arp協議進行處理,如果是rarp協議的話,那麼就傳輸給鏈路層的rarp協議進行處理,如果是ip協議的話,那麼就傳遞給網路層中的ip協議進行處理,同理:ip協議的頭部也有乙個型別,承載著具體的協議,如果是tcp的話,那麼就傳遞給運輸層的tcp協議進行處理,如果是udp的話,那麼也就給tcp協議進行處理,並且去掉ip首部,緊接著去掉tcp首部,根據埠號,將資訊傳遞給具體的程序。這就是我們通訊的整個過程,如上:去掉首部的過程就是解封裝。

3,icmp,arp協議都屬於那些層??

icmp協議(internet control message protocol,internet控制訊息協議),它的功能是報告無法傳送的資料報的錯誤,並幫助對這些錯誤進行解答。屬於「網路層」,是所有tcp/ip協議網路的核心。

arp協議(address resolution protocol,位址解析協議),屬於ipv4協議族,屬於資料鏈路層,功能是將ip位址解析為對應的mac位址

rarp協議(reverse arp,反向arp協議),功能是將mac位址解析為對應的ip位址。屬於資料鏈路層

4,套接字型別

流式套接字 (sock_stream)

提供面向連線的,可靠的資料傳輸服務,資料誤差錯,無重複的傳送,且按傳送順序接受

資料報式套接字(sock_dgram)

提供無連線服務。不提供無錯保證,資料可能丟失或重複,並且接受順序混亂

原始套接字(sock_raw)

跨越運輸層,沒有什麼tcp,udp,直接到達網路ip層

5,在通訊的過程中,路由器是如何將資料**出去的,用到了那些層???

假如:使用者主機h1通過**線上網,中間經過三個路由器(r1,r2,r3)連線到遠端主機h2。所經過的網路可以是各種的,如:**網,區域網,廣域網。當主機h1向h2傳送資料時,從協議的層次來看,資料的流動如下圖,資料進入路由器後要先從物理層上到網路層,在**表中找到下一跳的位址後,再下到物理層**出去。因此,資料從主機h1傳送到h2需要在路徑中的各結點的協議棧向上和向下流動多次,

實際**如下:

6,關於客戶端服務端終止應答的情況

在tcp客戶/伺服器模型中:通訊的雙方都可以來呼叫close函式來進行終止,

客戶端先關閉:會傳送乙個檔案結束的通知,相當與傳送了乙個eof,

會導致read返回等於0,然後此刻服務端就

會意識到客戶端已經關閉,所以服務端也就會呼叫相應的close來退出

服務端先關閉:如果我們先結束了伺服器(ctrl+c),那麼客戶端是不會立即退出的,可是在發一次資料便會自動退出,

這是因為在正常通訊中,伺服器關閉了連線,那麼客戶端會正常接收到eof,,如果對這個連線用epoll或者select進行監聽,可以馬上得知伺服器關閉了連線。否則就定時向伺服器發心跳探測,不然是不太可能得知伺服器目前的狀態的。之所以你現在不會立刻發現問題是因為伺服器退出後,客戶端需要靠下一次send才會觸發問題,因為這時候連線已關閉,而客戶端繼續寫,會產生sigpipe異常,而這個異常的預設動作是程序終止,所以你的客戶端退出了。

回射客戶/伺服器

同樣的關於啟動過程,必須服務端先啟動,如果客戶端先啟動當執行到connect的過程中就會出錯的,那是因為那個過程要繫結,找不到目標,所以會出錯:

connect: connection refused

7,主動套接字,被動套接字,listen

當socket函式建立乙個套接字時,它被假設為乙個主動套接字,也就是說,它是將呼叫connect發起連線的客戶套接字。但是如果執行listen的話(呼叫應該在socket和bind函式之後,accept之前),會把乙個未連線的套接字轉換成乙個被動套接字,指示核心應接受指向給套接字的連線請求,狀態:close--->listen

#include int listen(int sockfd, int backlog);

返回:成功為0,若出錯則為-1

關於其中的backlog引數,我們必須充分的認識到核心為任何乙個給定的監聽套接字維護兩個佇列

1,未完成連線佇列(incomplete connection queue),每個這樣的syn分節對應其中一項:已由某個客戶發出並到達伺服器,而伺服器正在等待完成相應的tcp三路握手過程。這些位元組處於syn_rcvd狀態

2,已完成連線佇列(completed connection queue),每個已完成tcp三路握手過程的客戶對應其中一項。這些套接字處於established狀態

每當在未完成連線佇列中建立一項時:來自監聽套接字的引數就複製到即將建立的連線中。連線的建立機制是完全自動的,無需伺服器程序插手,如下:

當來自客戶的syn到達時,tcp在未完成連線佇列中建立乙個新項,然後響應以三路握手的第二個分節:伺服器的syn響應,其中稍帶對客戶syn的ack。這一項一直保留在未完成連線佇列中,直到三路握手的第三個分節(客戶對伺服器syn的ack)到達或者該項超時為止。如果三路握手正常,該項就從未完成佇列移到已完成連線佇列的隊尾。當程序呼叫accept時,已完成連線佇列中的隊頭返回給程序,或者如果該隊列為空,那麼程序將被投入睡眠,知道tcp在該佇列中放入一項才喚醒它。。。。

accept

#include int accept(int sockfd, struct sockaddr * cliaddr, socklen_t *addrlen);

返回:成功(非負描述符,出錯為-1)

在討論accept函式時,前面應該已經呼叫過socket函式,會建立乙個套接字,在bind,listen之後,變成了監聽套接字,稱accept的返回值為已連線套接字。區分這兩個套接字非常重要。乙個伺服器通常僅僅建立乙個監聽套接字,它在該伺服器的生命期內一直存在。核心為每個由伺服器程序接受的客戶連線建立乙個已連線套接字(也就是對於它的tcp三路握手過程已經完成)。當伺服器完成對某個給定客戶的服務時,相應的已連線套接字就被關閉。

網路程式設計一些重要的面試題

為什麼需要三次握手?答 三次握手的目的是 為了防止已經失效的連線請求報文段突然又傳到服務端,因而產生錯誤 這種情況是 一端 client a發出去的第乙個連線請求報文並沒有丟失,而是因為某些未知的原因在某個網路節點上發生滯留,導致延遲到連線釋放以後的某個時間才到達另一端 server b。本來這是乙...

有關廣告推薦的一些面試「坑」

據知情人透露,gmm,和em演算法 推導q函式及證明收斂性 k means與gmm的對應關係。k means是無監督的聚類方法,gmm是有監督的生成模型。svm的公式推導。神經網路bp演算法的公式推導。logistics regression的推導,l1和l2正則化。l1有套索現象,l1的weigh...

有關程式設計和工作的一些思考

在這裡,作者講到專業技能和非專業技能兩種.專業技能一般具有不可遷移性,我把它理解為知識能力中的深度,非專業技能可以理解為在實際應用中無法直接顯現的技能,比如抽象思維,歸納能力,設計能力,或者解決問題的能力.除此之外,作者還把一些 旁門左道 歸入到非專業技能裡面,比如溝通能力,自我管理,或者其他學科領...