面試攻略六(網路專題)
說一下HTTP協議
HTTP協議是超文字傳輸協議,屬於應用層協議,規定了客戶端與服務端傳輸資料的格式;它是無狀態的,對於前面傳送過的資訊沒有記錄;請求方式有GET,POST,HEAD,PUT,DELETE等等,最主要的get,post方法;get請求:資料會以URL的形式傳輸,對資料大小有一定的限制,安全性比較低 ,用於傳輸一些比較小,安全性要求低的資料;
post請求:資料是通過資料包的形式傳輸,比較安全,用於傳輸比較大的,對於安全性要求較高的資料;
HTTP轉態碼:
狀態程式碼有三位數字組成,第一個數字定義了響應的類別,共分五種類別:
1xx:指示資訊--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操作
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
5xx:伺服器端錯誤--伺服器未能實現合法的請求
常見狀態碼:
-
200 OK //客戶端請求成功
-
400 Bad Request //客戶端請求有語法錯誤,不能被伺服器所理解
-
401 Unauthorized //請求未經授權,這個狀態程式碼必須和WWW-Authenticate報頭域一起使用
-
403 Forbidden //伺服器收到請求,但是拒絕提供服務
-
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
-
500 Internal Server Error //伺服器發生不可預期的錯誤
-
503 Server Unavailable //伺服器當前不能處理客戶端的請求,一段時間後可能恢復正常
TCP協議簡述
TCP協議是面向連線的、可靠的傳輸層協議,規定了資料在網路中是如何傳輸的。
TCP的三次握手:
1.第一次握手:建立連線。客戶端傳送連線請求報文段,將SYN位置為1,Sequence Number為x;然後,客戶端進入SYN_SEND狀態,等待伺服器的確認;
2.第二次握手:伺服器收到SYN報文段。伺服器收到客戶端的SYN報文段,需要對這個SYN報文段進行確認,設定Acknowledgment Number為x+1(Sequence Number+1);同時,自己自己還要傳送SYN請求資訊,將SYN位置為1,Sequence Number為y;伺服器端將上述所有資訊放到一個報文段(即SYN+ACK報文段)中,一併傳送給客戶端,此時伺服器進入SYN_RECV狀態;
3.第三次握手:客戶端收到伺服器的SYN+ACK報文段。然後將Acknowledgment Number設定為y+1,向伺服器傳送ACK報文段,這個報文段傳送完畢以後,客戶端和伺服器端都進入ESTABLISHED狀態,完成TCP三次握手。
四次揮手:
1.第一次分手:主機1(可以使客戶端,也可以是伺服器端),設定Sequence Number和Acknowledgment Number,向主機2傳送一個FIN報文段;此時,主機1進入FIN_WAIT_1狀態;這表示主機1沒有資料要傳送給主機2了;
2.第二次分手:主機2收到了主機1傳送的FIN報文段,向主機1回一個ACK報文段,Acknowledgment Number為Sequence Number加1;主機1進入FIN_WAIT_2狀態;主機2告訴主機1,我也沒有資料要傳送了,可以進行關閉連線了;
3.第三次分手:主機2向主機1傳送FIN報文段,請求關閉連線,同時主機2進入CLOSE_WAIT狀態;
4.第四次分手:主機1收到主機2傳送的FIN報文段,向主機2傳送ACK報文段,然後主機1進入TIME_WAIT狀態;主機2收到主機1的ACK報文段以後,就關閉連線;此時,主機1等待2MSL後依然沒有收到回覆,則證明Server端已正常關閉,那好,主機1也可以關閉連線了。
TCP三次握手連線的建立過程:
TCP四次揮手的釋放過程:
TCP與UDP的區別
1.基於連線與無連線
2.TCP要求系統資源較多,UDP較少;
3.UDP程式結構較簡單
4.流模式(TCP)與資料報模式(UDP);
5.TCP保證資料正確性,UDP可能丟包
6.TCP保證資料順序,UDP不保證
流量控制和擁塞控制
擁塞控制
網路擁塞現象是指到達通訊子網中某一部分的分組數量過多,使得該部分網路來不及處理,以致引起這部分乃至整個網路效能下降的現象,嚴重時甚至會導致網路通訊業務陷入停頓,即出現死鎖現象。擁塞控制是處理網路擁塞現象的一種機制。
流量控制
資料的傳送與接收過程當中很可能出現收方來不及接收的情況,這時就需要對發方進行控制,以免資料丟失。
多執行緒如何同步
windows
執行緒同步有四種方式:臨界區、核心物件、互斥量、訊號量。
Linux
執行緒同步有最常用的是:互斥鎖、條件變數和訊號量。
程序間通訊的方式有哪些,各有什麼優缺點
程序間通訊
Linux 程序間通訊(IPC)以下以幾部分發展而來:
早期UNIX程序間通訊、基於System V程序間通訊、基於Socket程序間通訊和POSIX程序間通訊。
UNIX程序間通訊方式包括:管道、FIFO、訊號。
System V程序間通訊方式包括:System V訊息佇列、System V訊號燈、System V共享記憶體、
POSIX程序間通訊包括:posix訊息佇列、posix訊號燈、posix共享記憶體。
現在linux使用的程序間通訊方式:
(1)管道(pipe)和有名管道(FIFO)
(2)訊號(signal)
(3)訊息佇列
(4)共享記憶體
(5)訊號量
(6)套接字(socket)
connect方法會阻塞,請問有什麼方法可以避免其長時間阻塞?
答:最通常的方法最有效的是加定時器;也可以採用非阻塞模式。
網路中,如果客戶端突然掉線或者重啟,伺服器端怎麼樣才能立刻知道?
答:若客戶端掉線或者重新啟動,伺服器端會收到復位訊號,每一種tcp/ip得實現不一樣,控制機制也不一樣。
在子網210.27.48.21/30種有多少個可用地址?分別是什麼?
答:
30表示的是網路號(network number)是30位,剩下2位中11是廣播(broadcast)地址,00是multicast地址,只有01和10可以作為host address。
詳:
210.27.48.21/30代表的子網的網路號是30位,即網路號是210.27.48.21 & 255.255.255.251=210.27.48.20,此子網的地址空間是2位,即可以有4個地址:210.27.48.20, 210.27.48.21, 210.27.48.22, 210.27.48.23。第一個地址的主機號(host number/id)是0,而主機號0代表的是multicast地址。最後一個地址的最後兩位是11,主機號每一位都為1代表的是廣播(broadcast)地址。所以只有中間兩個地址可以給host使用。其實那個問題本身不準確,廣播或multicast地止也是可以使用的地址,所以回答4也應該正確,當然問的人也可能是想要你回答2。我個人覺得最好的回答是一個廣播地址,一個multicast地址,2個unicast地址。
TTL是什麼?有什麼用處,通常那些工具會用到它?(ping? traceroute? ifconfig? netstat?)
答:
簡:TTL是Time To Live,一般是hup count,每經過一個路由就會被減去一,如果它變成0,包會被丟掉。它的主要目的是防止包在有迴路的網路上死轉,浪費網路資源。ping和traceroute用到它。
詳:TTL是Time To Live,目前是hup count,當包每經過一個路由器它就會被減去一,如果它變成0,路由器就會把包丟掉。IP網路往往帶有環(loop),比如子網A和子網B有兩個路由器相連,它就是一個loop。TTL的主要目的是防止包在有迴路的網路上死轉,因為包的TTL最終後變成0而使得此包從網上消失(此時往往路由器會送一個ICMP包回來,traceroute就是根據這個做的)。ping會送包出去,所以裡面有它,但是ping不一定非要不可它。traceroute則是完全因為有它才能成的。ifconfig是用來配置網絡卡的,netstat -rn 是用來列路由表的,所以都用不著它
路由表示做什麼用的?在linux環境中怎麼來配置一條預設路由?
答:
簡:路由表是用來決定如何將包從一個子網傳送到另一個子網的,換局話說就是用來決定從一個網絡卡接收到的包應該送的哪一張網絡卡上的。在Linux上可以用“route add default gw <預設路由器IP>”來配置一條預設路由。
詳:路由表是用來決定如何將包從一個子網傳送到另一個子網的,換局話說就是用來決定從一個網絡卡接收到的包應該送的哪一張網絡卡上的。路由表的每一行至少有目標網路號、netmask、到這個子網應該使用的網絡卡。當路由器從一個網絡卡接收到一個包時,它掃描路由表的每一行,用裡面的netmask和包裡的目標IP地址做並邏輯運算(&)找出目標網路號,如果此網路號和這一行裡的網路號相同就將這條路由保留下來做為備用路由,如果已經有備用路由了就在這兩條路由裡將網路號最長的留下來,另一條丟掉,如此接著掃描下一行直到結束。如果掃描結束任沒有找到任何路由,就用預設路由。確定路由後,直接將包送到對應的網絡卡上去。在具體的實現中,路由表可能包含更多的資訊為選路由演算法的細節所用。題外話:路由演算法其實效率很差,而且不scalable,解決辦法是使用IP交換機,比如MPLS。
在Linux上可以用“route add default gw <預設路由器IP>”來配置一條預設路由。
在網路中有兩臺主機A和B,並通過路由器和其他交換裝置連線起來,已經確認物理連線正確無誤,怎麼來測試這兩臺機器是否連通?如果不通,怎麼來判斷故障點?怎麼排除故障?
答:測試這兩臺機器是否連通:從一臺機器ping另一臺機器
如果ping不通,用traceroute可以確定是哪個路由器不能連通,然後再找問題是在交換裝置/hup/cable等。
網路程式設計中設計併發伺服器,使用多程序 與 多執行緒 ,請問有什麼區別?
答案一:
1,程序:子程序是父程序的複製品。子程序獲得父程序資料空間、堆和棧的複製品。
2,執行緒:相對與程序而言,執行緒是一個更加接近與執行體的概念,它可以與同進程的其他執行緒共享資料,但擁有自己的棧空間,擁有獨立的執行序列。
兩者都可以提高程式的併發度,提高程式執行效率和響應時間。
執行緒和程序在使用上各有優缺點:執行緒執行開銷小,但不利於資源管理和保護;而程序正相反。同時,執行緒適合於在SMP機器上執行,而程序則可以跨機器遷移。
答案二:
根本區別就一點:用多程序每個程序有自己的地址空間(address space),執行緒則共享地址空間。所有其它區別都是由此而來的:
1。速度:執行緒產生的速度快,執行緒間的通訊快、切換快等,因為他們在同一個地址空間內。
2。資源利用率:執行緒的資源利用率比較好也是因為他們在同一個地址空間內。
3。同步問題:執行緒使用公共變數/記憶體時需要使用同步機制還是因為他們在同一個地址空間內。
等等
網路程式設計的一般步驟
對於TCP連線:
1.伺服器端1)建立套接字create;2)繫結埠號bind;3)監聽連線listen;4)接受連線請求accept,並返回新的套接字;5)用新返回的套接字recv/send;6)關閉套接字。
2.客戶端1)建立套接字create; 2)發起建立連線請求connect; 3)傳送/接收資料send/recv;4)關閉套接字。
TCP總結:
Server端:create – bind – listen– accept– recv/send– close
Client端:create——- conncet——send/recv——close.
對於UDP連線:
1.伺服器端:1)建立套接字create;2)繫結埠號bind;3)接收/傳送訊息recvfrom/sendto;4)關閉套接字。
2.客戶端:1)建立套接字create;2)傳送/接收訊息sendto/recvfrom;3)關閉套接字.
UDP總結:
Server端:create—-bind —-recvfrom/sendto—-close
Client端:create—- sendto/recvfrom—-close.
TCP的重發機制是怎麼實現的?
1.滑動視窗機制,確立收發的邊界,能讓傳送方知道已經發送了多少(已確認)、尚未確認的位元組數、尚待發送的位元組數;讓接收方知道(已經確認收到的位元組數)。
2.選擇重傳,用於對傳輸出錯的序列進行重傳。
TCP和UDP的區別?
1)TCP面向連線(三次握手機制),通訊前需要先建立連線;UDP面向無連線,通訊前不需要建立連線;
2)TCP保障可靠傳輸(按序、無差錯、不丟失、不重複);UDP不保障可靠傳輸,使用最大努力交付;
3)TCP面向位元組流的傳輸,UDP面向資料報的傳輸。
TCP—傳輸控制協議,提供的是面向連線、可靠的位元組流服務。當客戶和伺服器彼此交換資料前,必須先在雙方之間建立一個TCP連線,之後才能傳輸資料。TCP提供超時重發,丟棄重複資料,檢驗資料,流量控制等功能,保證資料能從一端傳到另一端。
UDP—使用者資料報協議,是一個簡單的面向資料報的運輸層協議。UDP不提供可靠性,它只是把應用程式傳給IP層的資料報傳送出去,但是並不能保證它們能到達目的地。由於UDP在傳輸資料報前不用在客戶和伺服器之間建立一個連線,且沒有超時重發等機制,故而傳輸速度很快
TCP為什麼不是兩次連線?而是三次握手?
如果A與B兩個程序通訊,如果僅是兩次連線。可能出現的一種情況就是:A傳送完請報文以後,由於網路情況不好,出現了網路擁塞,即B延時很長時間後收到報文,即此時A將此報文認定為失效的報文。B收到報文後,會向A發起連線。此時兩次握手完畢,B會認為已經建立了連線可以通訊,B會一直等到A傳送的連線請求,而A對失效的報文回覆自然不會處理。依次會陷入B忙等的僵局,造成資源的浪費。
網路程式設計時的同步、非同步、阻塞、非阻塞?
同步:函式呼叫在沒得到結果之前,沒有呼叫結果,不返回任何結果。
非同步:函式呼叫在沒得到結果之前,沒有呼叫結果,返回狀態資訊。
阻塞:函式呼叫在沒得到結果之前,當前執行緒掛起。得到結果後才返回。
非阻塞:函式呼叫在沒得到結果之前,當前執行緒不會掛起,立即返回結果。
Java如何實現無阻塞方式的Socket程式設計?
NIO有效解決了多執行緒伺服器存在的執行緒開銷問題。
在NIO中使用多執行緒主要目的不是為了應對每個客戶端請求而分配獨立的服務執行緒,
而是通過多執行緒充分利用多個CPU的處理能力和處理中的等待時間,達到提高服務能力的目的。
java中有幾種型別的流?JDK為每種型別的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?
JDK提供的流繼承了四大類:
InputStream(位元組輸入流),OutputStream(位元組輸出流),Reader(字元輸入流),Writer(字元輸出流)。
按流向分類:
輸入流: 程式可以從中讀取資料的流。
輸出流: 程式能向其中寫入資料的流。
按資料傳輸單位分類:
位元組流:以位元組(8位二進位制)為單位進行處理。主要用於讀寫諸如影象或聲音的二進位制資料。
字元流:以字元(16位二進位制)為單位進行處理。
都是通過位元組流的方式實現的。字元流是對位元組流進行了封裝,方便操作。在最底層,所有的輸入輸出都是位元組形式的。
字尾是Stream是位元組流,而後綴是Reader,Writer是字元流。
按功能分類:
節點流:從特定的地方讀寫的流類,如磁碟或者一塊記憶體區域。
過濾流:使用節點流作為輸入或輸出。過濾流是使用一個已經存在的輸入流或者輸出流連線建立的。
用JAVA SOCKET 程式設計,讀伺服器幾個 字元,再寫入本地顯示。
客戶端向伺服器端傳送連線請求後,就被動地等待伺服器的響應。
典型的TCP客戶端要經過下面三步操作:
1、建立一個Socket例項:建構函式向指定的遠端主機和埠建立一個TCP連線;
2、通過套接字的I/O流與服務端通訊;
3、使用Socket類的close方法關閉連線。
服務端的工作是建立一個通訊終端,並被動地等待客戶端的連線。
典型的TCP服務端執行如下兩步操作:
1、建立一個ServerSocket例項並指定本地埠,用來監聽客戶端在該埠傳送的TCP連線請求;
2、重複執行:
1)呼叫ServerSocket的accept()方法以獲取客戶端連線,並通過其返回值建立一個Socket例項;
2)為返回的Socket例項開啟新的執行緒,並使用返回的Socket例項的I/O流與客戶端通訊;
3)通訊完成後,使用Socket類的close()方法關閉該客戶端的套接字連線。