面試題(一)網絡

  • 簡述TCP協議
    1)Transmission Control Protocol,傳輸控制協議。它是傳輸層的通信協議,有面向連接、可靠、字節流傳輸的特點
1.面向連接
TCP是基於連接進行數據交互,通信雙方在進行數據交互之前需要建立連接,該連接也只能用在雙方之間進行交互。這點不像UDP中的組播和廣播,可以在同一組中多個主機交互數據。這也是導致TCP協議的複雜性的因素之一,建立連接涉及到三次握手和四次揮手的過程。

2.可靠性保證
分段機制。TCP將需要傳輸的數據分成合適的報文段,然後逐個傳輸
定時器的超時和重傳機制。TCP對每個發送的報文段都設置一個定時器等待目標端返回確認收到的響應,如果未收到,則超時重傳
確認報文機制。接受方收到報文後會返回確認報文告訴發送方收到報文
校驗和機制。TCP保持首部和數據的校驗和,接收方將校驗段的校驗和,如果錯誤將丟棄不確認等待發送方超時重傳
有序機制。TCP將對報文段進行排序,保證報文段有序性
去重機制。TCP將對報文段進行去重
流控機制。由於接收方和發送的TCP緩衝區容量不一致和處理速度,需要對發送方的流量進行控制,防止網絡阻塞
TCP雙方進行數據交互時,數據形式爲8bit組成的字節流,TCP也不在這些字節流中做任何特殊標識。

3.字節流
這種字節流的特點表現如下:
TCP不關注數據的具體內容是二進制還是ASCII字符
發送方發送的字節流和接收方接受的字節流整體表現一致,但是發送的次數和每次的大小與接受方接收的次數和大小並沒有關係。

2)TCP三次握手:
客戶端發送SYN(SEQ=X)報文到服務端,進入SYN_SEND狀態
服務端發送SYN(SEQ=Y)+ACK(SEQ=X+1)到客戶端,進入SYN_RECIV狀態
客戶端發送ACK(SEQ=Y+1)到服務端,開始建立連接
在這裏插入圖片描述
3)爲什麼要三次握手:
假設當前場景爲二次握手即可建立連接,客戶端發送第一個連接請求到服務端,中間由於網絡問題導致請求延遲到達服務器,當服務端收到客戶端的第一個請求時回覆了ACK給客戶端並建立請求,而此時客戶端因爲在一定時間內沒有收到服務端的迴應而放棄該次請求。這就導致服務端一直在等客戶端發送請求,造成資源浪費。三次握手可以避免這種情況。
4)四次揮手
客戶端發送FIN至服務端,請求關閉連接
服務端返回ACK,ACK的值等於FIN+SEQ
服務端發送FIN至客戶端,告訴客戶端應用關閉
客戶端返回ACK在這裏插入圖片描述
5)爲什麼要四次揮手:
確保數據能夠完整傳輸。當被動方收到主動方的FIN報文通知時,它僅僅表示主動方沒有數據再發送給被動方了。但未必被動方所有的數據都完整的發送給了主動方,所以被動方不會馬上關閉SOCKET,它可能還需要發送一些數據給主動方後,再發送FIN報文給主動方,告訴主動方同意關閉連接,所以這裏的ACK報文和FIN報文多數情況下都是分開發送的

  • TCP與UDP的區別
    1)TCP是面向連接的(服務端與客戶端之間要傳輸數據必須先有連接),UDP是無連接的
    2)TCP提供可靠的服務(無差錯、不重複、不丟失、按序到達),UDP提供簡單的不可靠的服務
    3)UDP具有良好的時序性,效率大於TCP。適用於高速傳輸和實時性比較高的通訊和廣播
    4)TCP對系統資源要求高,UDP對系統資源要求低
    5)UDP程序結構更簡單
    6)TCP是點對點模式,UDP是一對一,一對多和多對多的交互通信
    7)TCP是流模式,UDP是數據報模式
1、TCP 
打個比方比喻TCP,你家裏有個蓄水池,你可以裏面倒水,蓄水池上有個龍頭,你可以通過龍頭將水池裏的水放出來,然後用各種各樣的容器裝(杯子、礦泉水瓶、鍋碗瓢盆)接水。 上面的例子中,往水池裏倒幾次水和接幾次水是沒有必然聯繫的,也就是說你可以只倒一次水,然後分10次接完。另外,水池裏的水接多少就會少多少;往裏面倒多少水,就會增加多少水,但是不能超過水池的容量,多出的水會溢出。 
結合TCP的概念,水池就好比接收緩存,倒水就相當於發送數據,接水就相當於讀取數據。好比你通過TCP連接給另一端發送數據,你只調用了一次write,發送了100個字節,但是對方可以分10次收完,每次10個字節;你也可以調用10次write,每次10個字節,但是對方可以一次就收完。(假設數據都能到達)但是,你發送的數據量不能大於對方的接收緩存(流量控制),如果你硬是要發送過量數據,則對方的緩存滿了就會把多出的數據丟棄。 這種情況是設置非阻塞I/O模型,會把內存耗盡,因爲socket是存在內核中的。 2、UDP 
UDP和TCP不同,發送端調用了幾次write,接收端必須用相同次數的read讀完。UPD是基於報文的,在接收的時候,每次最多隻能讀取一個報文,報文和報文是不會合並的,如果緩衝區小於報文長度,則多出的部分會被丟棄。也就說,如果不指定MSG_PEEK標誌,每次讀取操作將消耗一個報文。 3、爲什麼 
其實,這種不同是由TCP和UDP的特性決定的。TCP是面向連接的,也就是說,在連接持續的過程中,socket中收到的數據都是由同一臺主機發出的(劫持什麼的不考慮),因此,知道保證數據是有序的到達就行了,至於每次讀取多少數據自己看着辦。 
而UDP是無連接的協議,也就是說,只要知道接收端的IP和端口,且網絡是可達的,任何主機都可以向接收端發送數據。這時候,如果一次能讀取超過一個報文的數據,則會亂套。比如,主機A向發送了報文P1,主機B發送了報文P2,如果能夠讀取超過一個報文的數據,那麼就會將P1和P2的數據合併在了一起,這樣的數據是沒有意義的。
  • 網絡7層模型是那7層?列舉一些具體的應用實例
    1)物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層
    2)物理層:同軸電纜、接收器、發送器
    數據鏈路層:網卡、網橋、交換機
    網絡層:路由器、網關
    傳輸層:TCP協議、UDP協議
    會話層:SQL、PHP
    表示層:MP3,PNG
    應用層:telnet、html

  • 怎麼測試網絡是否連通
    ping

  • 訪問一個網址會經歷哪些流程
    1)app catch:先看下是否有緩存,如果有緩存則直接展示緩存內容
    2)DNS:如果沒有緩存,去DNS服務器對域名進行解析
    3)獲取IP後客戶端與服務器建立TCP連接,客戶端發送http請求
    4)服務端返回請求結果
    5)瀏覽器對服務端返回的內容進行渲染,解析css樣式、js交互等展示給用戶

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