1. 程式人生 > >校招之計算機網路

校招之計算機網路

前言

悉心整理校正了計算機網路的面試常用知識點,文章圖文並茂,通俗易懂,希望對大家有所幫助。

文章連結 http://blog.csdn.net/never_cxb/article/details/50420521 ,分享請保留出處。

TCP提供面向連線的、可靠的資料流傳輸,而UDP提供的是非面向連線的、不可靠的資料流傳輸。

TCP傳輸單位稱為TCP報文段,UDP傳輸單位稱為使用者資料報。TCP注重資料安全性,UDP資料傳輸快,因為不需要連線等待,少了許多操作,但是其安全性卻一般。

TCP對應的協議和UDP對應的協議TCP對應的協議:(1) FTP:定義了檔案傳輸協議,使用21埠。(2) Telnet:一種用於遠端登陸的埠,使用23埠,使用者可以以自己的身份遠端連線到計算機上,可提供基於DOS模式下的通訊服務。(3) SMTP:郵件傳送協議,用於傳送郵件。伺服器開放的是25號埠。(4) POP3:它是和SMTP對應,POP3用於接收郵件。POP3協議所用的是110埠。(5)HTTP:是從Web伺服器傳輸超文字到本地瀏覽器的傳送協議。UDP對應的協議:(1) DNS:用於域名解析服務,將域名地址轉換為IP地址。DNS用的是53號埠。(2) SNMP:簡單網路管理協議,使用161號埠,是用來管理網路裝置的。由於網路裝置很多,無連線的服務就體現出其優勢。(3) TFTP(Trival File Tran敏感詞er Protocal),簡單檔案傳輸協議,該協議在熟知埠69上使用UDP服務。

TCP/IP 參考模型

分層

每一層都是獨立存在的,因此分配到各層的任務能夠獨立地執行,變更其中某層提供的方案時不影響其他層。

這也可以理解為一個鬆耦合的設計。

tcpip 模型

詳解

網路層 主要是 ip 協議,可以通過 ip 找到某個機器,但是機器上有很多應用程式,每個程式都佔用相應的埠,傳輸層不同協議有不同的埠,通過 ip + 埠 就可以確定某個機器上的具體應用程式了。

Server A 和 Server B 直接傳輸資料,有封裝和解封裝的過程。

資料從A 的應用層往下走到物理層,會在每一層都會加上頭部資訊,進行封裝,然後再發送到B。

然後 Server B 從 最下面的物理層往上

 每一層進行解封裝,最後到達應用層,得到資料。

  • 物理層:將電腦連起來,可以用光纜、電纜、雙絞線、無線電波等方式

  • 鏈路層:資料包會帶上傳送地址和接收地址,也就是MAC地址

  • 網路層:網路地址幫助我們確定計算機所在的子網路,MAC地址則將資料包送到該子網路中的目標網絡卡。 
    因此,從邏輯上可以推斷,必定是先處理網路地址,然後再處理MAC地址。

  • 傳輸層:同一臺主機上有許多程式都需要用到網路,埠可以確定表示這個資料包到底供哪個程式使用。 
    傳輸層建立”埠到埠”的通訊,”網路層”的功能是建立”主機到主機”的通訊。 
    (ftp 21,ssh 22,dns 53,http 80)

  • 應用層 我們在傳輸資料時,可以只使用(傳輸層)TCP/IP協議,但是那樣的話,如果沒有應用層,便無法識別資料內容。 
    如果想要使傳輸的資料有意義,則必須使用到應用層協議。

TCP 區別 UDP

TCP連線是由4個值來識別的: <源IP地址、源埠號、目的IP地址、目的埠號>

  • TCP是面向連線的、可靠的 
    其實網路的不安全不穩定特性,無論多少次握手都不能保證連線的可靠性 
    但TCP的三次握手在最低限度上(實際上也很大程度上保證了)保證了連線的可靠性

  • UDP 無連線的、不可靠 
    UDP傳送資料前並不與對方建立連線,對接收到的資料也不傳送確認訊號,傳送端不知道資料是否會正確接收,當然也不用重發,

 UDP 交給上層進行差錯控制,可以程式碼對UDP的資料收發進行驗證,比如傳送方對每個資料包進行編號然後由接收方進行驗證啊什麼的

 即使是這樣,UDP因為在底層協議的封裝上沒有采用類似TCP的“三次握手”而實現了TCP所無法達到的傳輸效率

IP 協議

A 類 B 類 C 類

IP的地址欄位範圍是0~127,但是由於全0和全1的地址用作特殊用途,實際可指派的第一個欄位範圍是1~126。

A類地址範圍:0.0.0.1 —— 126.255.255.254, 預設網路掩碼為 255.0.0.0

B類地址範圍:128.0.0.1 —— 191.255.255.254,預設子網掩碼為255.255.0.0

C類地址範圍:192.0.0.1 —— 223.255.255.254,預設子網掩碼為255.255.255.0

0 到 128 相差128,128 到192相差64,後面192到224相差32。

A 類地址, 0 開頭, 128 個 
B 類地址,10 開頭,16,384 個 
C 類地址,110 開頭,2,097,152 個

特殊的地址

ip 地址= 網路號 + 主機號

網路號 主機號 用途
全為0 全為0 表示本主機,用作源地址,啟動時用,獲取了 IP 地址後不再使用
全為0 host-id 本地網路上主機號為 host-id 的主機,只作為源地址
全為1 全為1 有限廣播(本地網路),只作目的地址,各路由器都不轉發
net-id 全為1 定向廣播(net-id標識的網路),只作目的地址
net-id 全為0 標識一個網路
127 任意 本地軟體回送地址

B類中169.254.0.0到169.254.255.255是保留地址。如果你的IP地址是自動獲取IP地址,而你在網路上又沒有找到可用的DHCP伺服器,這時你將會從169.254.0.0到169.254.255.255中臨得獲得一個IP地址。

私有地址

私有地址包括3組 
A類:10.0.0.0~10.255.255.255 
B類:172.16.0.0~172.31.255.255 
C類:192.168.0.0~192.168.255.255

學校裡的區域網,因為大概有幾十萬人,所以是10開頭的區域網。

而我們買的無線路由器,也要設定區域網,一般為192開頭的,比如192.168.0.1或者192.168.199.1(比如極路由就是這個地址)

我們建企業網(單位網路)時,一般是使用私有地址來分配內部主機,小企業使用C類的192.168.0.0網路,中型企業使用172.16.0.0網路,如果還不夠用,還有10.0.0.0 網路。

子網劃分

以C類網路為例,原有8位主機位,2的8次方即256個主機地址,預設子網掩碼255.255.255.0。

借用1位主機位,產生2個子網,每個子網有126個主機地址;借用2位主機位,產生4個子網,每個子網有62個主機地址……

練習題

把子網掩碼為255.255.0.0的網路40.15.0.0分為兩個子網,假設第一個子網為40.15.0.0/17,則第二個子網為?

40.15.0.0/17 表示網段是40.15.0.0,子網掩碼是17位。

子網掩碼為:255.255.128.0,用二進位制表示為:11111111 11111111 10000000 00000000 ,斜槓後面的17表示子網掩碼前17位為1.

答案:

劃分為兩個子網的話子網掩碼應該為255.255.128.0 
第一個子網是40.15.0.0/17,可用地址範圍是40.15.0.1~40.15.127.254 
第二個子網是40.15.128.0/17,可用地址範圍是40.15.128.1~40.15.255.254

解析:

掩碼的前兩個八位是255,第三個八位是128,有2的一次方個子網(因為第三個八位只有一個1,後面七位都是0),所以ip 地址第三個8位是0000,0000或者1000,0000,即0或者128。

因為第3個8位是1000,0000,可以區分開頭第一個數是0還是1, 區分了兩個子網。所以這兩個子網是40.15.0.0和40.15.128.0

NAT穿透技術

NAT(Network Address Translation,網路地址轉換)是一種網路地址翻譯技術,將內部私有IP地址改變成可以在公網上使用的.

NAT

NAT三種實現方式

  • 靜態地址轉換:一個公網IP對應一個內部IP,一對一轉換

  • 動態地址轉換:N個公網IP對應M個內部Ip,不固定的一對一IP轉換關係.同一時間,有M-N個主機無法聯網.

  • 埠多路複用:對外只有一個公網IP,通過埠來區別不同內部IP主機的資料.

閘道器

  • 閘道器(gateway)能在不同協議間移動資料

  • 路由器(router)是在不同網路間移動資料 
    相當於傳統所說的IP閘道器(IP gateway)

三次握手

一些名詞

  • seq (Sequence Number)序列號,這是為了連線以後傳送資料用的
  • ack(Acknowledgment Number)確認序列號,是對收到的資料包的確認,值是等待接收的資料包的序列號。
  • SYN synchronous 同步訊號
  • ACK Acknowledgement 應答訊號, 當 ACK=1時候表示ack欄位有意義
  • SYN 和 ACK 也表示 TCP 的標誌位?

三次握手的步驟

三次握手

  1. 客戶端 發起握手,目的端點是 服務端 的端點 post_server 
    • 生成一個隨機數作為它的初始化傳送序號 x
    • 發出一個同步報文段,SYN=1,傳送序號 seq=x
    • 並進入SYN_SEND狀態,等待伺服器確認
  2. 服務端監聽到埠 post_server 上有連線請求,響應 
    • 生成一個隨機數作為它的初始傳送序號 seq = y
    • 發出同步報文欄位並對主機 A 埠1的連線請求進行確認,傳送ack=x+1
    • 即傳送 SYN+ACK 包,此時伺服器進入SYN_RECV狀態
  3. 主機 A 
    • 發出對 服務端 埠 post_server 的確認,確認序號 ack=y+1,還有seq=x+1
    • 客戶端和伺服器進入ESTABLISHED狀態,完成三次握手

為什麼採用3次握手而不是2次握手?

  • 第一次握手 客戶端發,服務端 知道 客戶端 可以 發訊息
  • 第二次握手 服務端收和發,客戶端 知道 服務端 可以 接收訊息 和 發訊息
  • 第三次握手 客戶端收和發,服務端 知道 客戶端可以 接收訊息 和 發訊息

3 次是雙向通訊的最小值,也就是 SYN, SYN ACK, ACK ,兩個傳送、兩個接收 ,其中第二次把接收和傳送合在一起了

如果兩次握手的話,客戶端有可能因為網路阻塞等原因會發送多個請求報文,這時伺服器就會建立連線,浪費掉許多伺服器的資源。所以要增加第三次握手。

第3次失敗會怎麼辦?

第三次失敗,只有客戶端處於成功狀態(因為第2次伺服器返回了ACK),伺服器端沒有接收到客戶端的 ACK。

這要分幾種情況討論:

  • In other words, if the ACK is dropped but the next packet is not dropped, then everything is fine. 
    也就是說客戶端發出的 ACK 丟失了,發出的 下一個資料包 沒有丟失,則服務端接收到下一個資料包(這個資料包裡也會帶上 ACK 資訊),能夠進入正常的 ESTABLISHED 狀態

  • 如果服務端和客戶端都沒有資料傳送,或者服務端想傳送資料(但是發不了,因為沒有收到客戶端的 ACK),伺服器都會有定時器傳送第二步SYN+ACK資料包,如果客戶端再次傳送ACK成功,建立連線。

    如果一直不成功,伺服器肯定會有超時設定,超時之後會給客戶端發RTS報文,進入CLOSED狀態,防止SYN洪泛攻擊。

四次握手關閉連線

四次握手

  1. 主機 A 關閉 A主機的 埠1 到 B主機的 埠2 的傳輸連線:

    • 應用程式通知 TCP 資料已經發送完畢時,關閉連線
    • TCP 向主機 B 傳送一個帶 FIN 附加標記的報文段(FIN 表示 finish),FIN=1,seq=x
  2. 主機 B 響應: 

    • 收到這個 FIN 報文段之後,並不立刻用 FIN 報文段回覆主機 A,而是先向主機 A 傳送一個確認序號 ,ACK=1,ack=x+1
    • 同時通知自己相應的應用程式,主機 A 方傳輸已經結束,對方要求關閉連線(先發送 ACK 的目的是為了防止這段時間內,主機 A 重傳 FIN 報文段) 

    此時 A 到 B 方向上的傳輸連線已經關閉(看第4有TIME_WAIT狀態等待2MSL,第2步的 A 到 B 並沒有徹底關閉?),但是主機 B 到 A 還可以傳送資料,連線處於半關閉的狀態。(因為原來 TCP 是全雙工的工作方式,只關閉了一端的連線)

  3. 主機 B 關閉 埠2到埠1的傳輸連線:

    • 應用程式告訴 TCP: 我要徹底地關閉連線
    • TCP 收到對最後資料的確認後,向主機 A 傳送一個 FIN 報文段。FIN=1,seq=y,y 是 B 傳送資料的最後位元組的序號加1。ACK=1,seq=x+1。
  4. 主機 A 響應:

    • 收到這個 FIN 報文段之後,向主機 B 傳送一個 ACK 表示連線徹底釋放。ACK=1,ack=y+1
    • 主機B收到主機A的ACK報文段以後,就關閉連線;此時,主機A等待2MSL (Maximum Segment Lifetime)後依然沒有收到回覆,則證明主機 B已正常關閉,那好,主機A也可以關閉連線了。

為什麼連線的時候是三次握手,關閉的時候卻是四次握手?

TCP是全雙工模式,關閉連線時,當 主機 B收到主機A的FIN報文時,僅僅表示主機 A不再發送資料了但是還能接收資料。

主機 B也未必全部資料都發送給A了,所以B可以立即close;也可以傳送一些資料給A後,再發送FIN報文給對方來表示同意現在關閉連線,因此, 主機 BACK和FIN一般都會分開發送。

參考文章