計算機網絡複習要點

參考資料:

https://my.oschina.net/yangjiannr/blog/1528516

http://www.cnblogs.com/zyf-zhaoyafei/p/4716297.html

這篇文章總結一下計算機網絡常見的面試問題和複習的要點。由於我不是後臺方向的,所以這些內容都是比較基礎的,個人對 socket 的使用也僅僅侷限於一些基本操作。計算機網絡的複習主要集中在以下幾個模塊:

1. 綱要: OSI七層模型, TCP/IP四層模型,五層模型以及每一層的協議,用處。下面分層提問

     1.1 各種協議的概述

2. 應用層

     2.1 HTTP 1.0與HTTP1.1的區別,HTTPS與HTTP的區別

     2.2 簡述HTTP中GET和POST的區別

     2.3 各種應用層協議分別基於什麼socket TCP or UDP 

     2.4 DNS域名解析,簡述其工作原理

     2.5 HTTP 協議中, cookie, session的概念與區別

     2.6 HTTP 狀態碼,常見的有什麼意義?

     2.7 HTTP 請求的8種方法?

     2.8 HTTP 報文的結構 ?

     2.9 從瀏覽器中輸入地址,回車後發生了什麼,涉及到哪些協議 ?

     2.10 * 如何設計一個應用層協議 ?需要注意哪些問題?

3. 傳輸層

     3.1 什麼是全雙工,什麼是半雙工?TCP的傳輸鏈路是什麼?

     3.2 TCP,UDP 的概念,區別, 報頭的格式 ?

     3.3 TCP socket 建立的三次握手,斷開的四次揮手,每一步都發哪些報文?

           3.3.1 爲什麼連接的時候是三次握手,不是兩次呢?即爲什麼要讓服務端處於半連接狀態?

           3.3.2 關閉的時候卻是四次握手?

           3.3.3 關閉時爲什麼TIME_WAIT狀態需要經過2MSL(兩倍最大報文段生存時間)才能返回到CLOSE狀態?爲什麼不直接CLOSE?

           3.3.4 tcp協議的緩衝區什麼情況下應該設置的大一些,什麼時候應該小一些

           3.3.5 阻塞與非阻塞t的區別?

           3.3.6 Linux IO多路複用的四種方式?poll, epoll, select, pselect

           3.3.7 * DDOS 攻擊(SYN報文攻擊)

     3.4 TCP 的流量控制和擁塞控制機制

     3.5 面向連接和非面向連接的服務的特點是什麼?

     3.6 什麼情況下使用TCP,什麼情況下使用UDP?不同類型的網絡遊戲用什麼?你覺得LOL用的是TCP還是UDP?

     3.7 socket 編程相關問題

4. 網絡層

      4.1 四類IP地址,子網劃分的計算,特殊的IP段,保留地址

      4.2 ARP是地址解析協議,簡單語言解釋一下工作原理

      4.3 ping 操作的原理,涉及哪些協議?

5. 硬件上的一些問題

      5.1 每一層涉及的硬件有哪些?分別是幹什麼用的?對應的協議是什麼?

------------------------------------------------------ 我是分割線 ------------------------------------------------------

注: 打 * 的瞭解一下就可以了,用來吹吹牛逼


一、綱要: OSI七層模型, TCP/IP四層模型,五層模型以及每一層的協議,用處。



OSI七層:         應用層、表示層、會話層、運輸層、網絡層、數據鏈路層、物理層
TCP/IP四層:      應用層、                            運輸層、網絡層、網絡接口層
五層體系:        應用層、                            運輸層、網絡層、數據鏈路層、物理層
其中,上四層決定了應用程序的功能,是作爲程序員一定要掌握的,因爲真的很常用;下三層主要面向通過網絡的端到端的數據流。
每層的用處和協議如下: 

注:
1. 進行FTP文件傳輸中,客戶端首先連接到FTP服務器的21端口,進行用戶的認證,認證成功後,要傳輸文件時,服務器會開一個端口爲20來進行傳輸數據文件。
2. DNS 協議同時基於TCP和UDP,當報文較大時用TCP,否則用UDP。DNS 基於ICMP協議,所以不使用端口。
3. DHCP 動態主機配置協議,有兩個作用,給內部網絡或網絡服務供應商自動分配IP地址,給用戶或者內部網絡管理員作爲對所有計算機作中央管理的手段。UDP 67端口和UDP 68端口分別爲DHCP協議的server和client服務端口。
4. TFTP是一個傳輸文件的簡單協議,它基於UDP協議而實現。此協議設計的時候是進行小文件傳輸的。因此它不具備通常的FTP的許多功能,它只能從文件服務器上獲得或寫入文件,不能列出目錄,不進行認證,它傳輸8位數據。
5. FTP 協議中,21端口用來確認身份,然後20端口用來傳數據。


圖1.1 從應用層自定義數據包一路封裝到鏈路層MAC幀


圖1.2 不同層協議之間的溝通

1.1 各種協議的概述

  • ICMP協議: 因特網控制報文協議。它是TCP/IP協議族的一個子協議,用於在IP主機、路由器之間傳遞控制消息。
  • TFTP協議: 是TCP/IP協議族中的一個用來在客戶機與服務器之間進行簡單文件傳輸的協議,提供不復雜、開銷不大的文件傳輸服務。
  • HTTP協議: 超文本傳輸協議,是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分佈式超媒體信息系統。
  • DHCP協議: 動態主機配置協議,是一種讓系統得以連接到網絡上,並獲取所需要的配置參數手段。
  • NAT協議:網絡地址轉換屬接入廣域網(WAN)技術,是一種將私有(保留)地址轉化爲合法IP地址的轉換技術,
  • DHCP協議:一個局域網的網絡協議,使用UDP協議工作,用途:給內部網絡或網絡服務供應商自動分配IP地址,給用戶或者內部網絡管理員作爲對所有計算機作中央管理的手段

  • FTP:定義了文件傳輸協議,使用21端口進行身份確認,然後用20端口傳數據。
  • Telnet:一種用於遠程登陸的端口,使用23端口,用戶可以以自己的身份遠程連接到計算機上,可提供基於DOS模式下的通信服務。
  • SMTP:郵件傳送協議,用於發送郵件。服務器開放的是25號端口。
  • POP3:它是和SMTP對應,POP3用於接收郵件。POP3協議所用的是110端口。
  • HTTP:是從Web服務器傳輸超文本到本地瀏覽器的傳送協議。 UDP對應的協議:
  • DNS:用於域名解析服務,將域名地址轉換爲IP地址。DNS用的是53號端口。
  • SNMP:簡單網絡管理協議,使用161號端口,是用來管理網絡設備的。由於網絡設備很多,無連接的服務就體現出其優勢。
  • TFTP(Trival File Tran敏感詞er Protocal),簡單文件傳輸協議,該協議在熟知端口69上使用UDP服務。

二、應用層

爲用戶的應用程序提供各種網絡服務,比如文件傳輸、電子郵件等服務。

2.1 HTTP 1.0與HTTP1.1的區別,HTTPS與HTTP的區別

HTTP1.1中才有cache-control響應頭,主要用於控制信息在瀏覽器的緩存 
1. HTTP 1.0規定瀏覽器與服務器只保持短暫的連接,瀏覽器的每次請求都需要與服務器建立一個TCP連接,服務器完成請求處理後立即斷開TCP連接,服務器不跟蹤每個客戶也不記錄過去的請求 缺陷:訪問一個包含有許多圖像的網頁文件的整個過程包含了多次請求和響應,每次請求和響應都需要建立一個單獨的連接,每次連接只是傳輸一個文檔和圖像,器端每次建立和關閉連接卻是一個相對比較費時的過程,並且會嚴重影響客戶機和服務器的性能 
2. HTTP 1.1支持持久連接,在一個TCP連接上可以傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲 HTTP 1.1還允許客戶端不用等待上一次請求結果返回,就可以發出下一次請求,但服務器端必須按照接收到客戶端請求的先後順序依次回送響應結果 ,TTP 1.1還提供了Host、身份認證、狀態管理和Cache緩存等機制相關的請求頭和響應頭

2.2 簡述HTTP中GET和POST的區別

  1. GET提交的數據會放在URL之後,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的數據放在HTTP包的Body中.
  2. GET提交的數據大小有限制(因爲瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制.
  3. GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值。
  4. GET方式提交數據,會帶來安全問題,比如一個登錄頁面,通過GET方式提交數據時,用戶名和密碼將出現在URL上,如果頁面可以被緩存或者其他人可以訪問這臺機器,就可以從歷史記錄獲得該用戶的賬號和密碼.

2.3 各種應用層協議分別基於什麼socket TCP or UDP, 端口?

基於TCP的有: 

  • HTTP 80
  • FTP 21, 20
  • SSH 22
  • Telnet 23
  • SMTP 25
  • POP3 110
基於UDP的有
  • DHCP 67, 68 
  • TFTP 69
基於TCP和UDP的有
  • DNS 

2.4 DNS域名解析,簡述其工作原理

當DNS客戶機需要在程序中使用名稱時,它會查詢DNS服務器來解析該名稱。客戶機發送的每條查詢信息包括三條信息:包括:指定的DNS域名,指定的查詢類型,DNS域名的指定類別。基於UDP服務,端口53. 該應用一般不直接爲用戶使用,而是爲其他應用服務,如HTTP,SMTP等在其中需要完成主機名到IP地址的轉換。

2.5 HTTP 協議中, cookie, session的概念與區別

什麼是cookie?
1. Cookie是Web網站放在您的硬盤上的程序。它守在您的電腦裏,蒐集您的信息以及您在因特網上所做的任何事情,當Web站點需要的時候它能夠下載所有這些蒐集到的信息。” 像這樣的定義在報刊中相當普遍。問題是,它的定義犯了很大的錯誤。Cookie不是程序,而且它不能像程序一樣地運行,所以它無法爲自己蒐集任何信息。它也不能從您的電腦上取得您的任何個人資料。
2. Cookie就是服務器暫存放在你計算機上的一筆資料,好讓服務器用來辨認你的計算機。當你在瀏覽網站的時候,Web服務器會先送一小小資料放在你的計算機上,Cookie 會幫你在網站上所打的文字或是一些選擇,都記錄下來。當下次你再光臨同一個網站,Web服務器會先看看有沒有它上次留下的Cookie資料,有的話,就會依據Cookie裏的內容來判斷使用者,送出特定的網頁內容給你。 Cookie的使用很普遍,許多提供個人化服務的網站,都是利用Cookie來辨認使用者,以方便送出使用者量身定做的內容,像是Web接口的免費E-mail網站,都要用到 Cookie

什麼是session ?

1. Session是服務器端使用的一種記錄客戶端狀態的機制,使用上比Cookie簡單一些,相應的也增加了服務器的存儲壓力。
2. 客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上。這就是Session。客戶端瀏覽器再次訪問時只需要從該Session中查找該客戶的狀態就可以了。
3. 如果說Cookie機制是通過檢查客戶身上的“通行證”來確定客戶身份的話,那麼Session機制就是通過檢查服務器上的“客戶明細表”來確認客戶身份。Session相當於程序在服務器上建立的一份客戶檔案,客戶來訪的時候只需要查詢客戶檔案表就可以了。

兩者的區別?

1. Session是存在服務器端的;而Cookie是存在客戶端的!!
2. Session更不需要Cookie來支持和不會受瀏覽器端的設置影響,可記錄每個訪問者的信息,獨立在服務器端,比Cookie安全!
3. Session是存在內存中的,瀏覽器關閉它也就“死”了;Cookie是以文件方式存在的,可以修改其“存活”時間。


2.6 HTTP 狀態碼,常見的有什麼意義?

狀態行格式如下: HTTP-Version Status-Code Reason-Phrase CRLF 其中,HTTP-Version表示服務器HTTP協議的版本;Status-Code表示服務器發回的響應狀態代碼;Reason-Phrase表示狀態代碼的文本描述。 狀態代碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值:

  • 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 //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常 eg:HTTP/1.1 200 OK (CRLF)

2.9 HTTP 請求的8種方法

請求方法 意義
GET 請求獲取Request-URI所標識的資源
POST 在Request-URI所標識的資源後附加新的數據
HEAD 請求獲取由Request-URI所標識的資源的響應消息報頭
PUT 請求服務器存儲一個資源,並用Request-URI作爲其標識
DELETE 請求服務器刪除Request-URI所標識的資源
TRACE 請求服務器回送收到的請求信息,主要用於測試或診斷
CONNECT 保留將來使用
OPTIONS 請求查詢服務器的性能,或者查詢與資源相關的選項和需求

2.8 HTTP 報文的結構?

第一部分:狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成。 第一行爲狀態行,(HTTP/1.1)表明HTTP版本爲1.1版本,狀態碼爲200,狀態消息爲(ok)

第二部分:消息報頭,用來說明客戶端要使用的一些附加信息 第2~4行爲消息報頭, Date:生成響應的日期和時間;Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8
第三部分:空行,消息報頭後面的空行是必須的
第四部分:響應正文,服務器返回給客戶端的文本信息。

2.9 從瀏覽器中輸入地址,回車後發生了什麼,涉及到哪些協議 ?

  1. 解析URL
  2. DNS查詢,解析域名,將域名解析爲IP地址。過程爲 瀏覽器緩存 -> 系統緩存 -> 路由器緩存 -> ISP DNS緩存 -> 根域名服務器 (注:ISP, Internet Service Provider,互聯網服務提供商,就是那些拉網線到你家裏的運營商,中國電信中國移動什麼的)
  3. ARP廣播,根據IP地址來解析MAC地址
  4. 分別從應用層到傳輸層、網絡層和數據鏈路層分別加入各個層的頭部封裝爲包
  5. 進行三次握手後,客戶端與服務器建立連接
  6. 客服務器向客戶端返回數據,瀏覽器接收到數據
  7. 瀏覽器開始渲染頁面

涉及的協議有: 

  • 應用層:HTTP, DNS
  • 傳輸層:TCP,UDP
  • 網絡層:IP, ICMP, ARP
  • 鏈路層:Ethernet 

2.10 * 如何設計一個應用層協議 ?需要注意哪些問題?

參考資料:http://blog.csdn.net/smstong/article/details/49148283

應用層協議的設計需要考慮的問題有:

  1. 不同平臺對浮點數、字節序的處理不同
  2. struct \ class的字節對齊不同編譯器的實現不同,可能需要強制指定對齊方式如#pragme pack(4),強制四字節對齊
  3. 網絡字節序和本地字節序的匹配問題
  4. 不同平臺的位數不同,整型和實型的表示範圍不同
應用層協議的設計基本有兩種思路:
  1. 字節流,將要傳送的信息定義爲一個byte buffer,規定第幾字節代表什麼信息,傳送的大小是所有字節的長度和。
  2. 文本流,將要傳送的信息格式化爲字符串,以文本的方式,將內容放入 buffer傳遞,接收方解析收到的文本字符串,從中提取信息
兩者的對比:
  1. 字節流實現更加簡單,接收方和發送方只要提取字節流的特定字節就可以獲得消息,缺點是不同平臺、不同編譯器對數據的實現不同,比如有的機器浮點型是1+8+23,有的機器是1+4+11,直接提取是不行的。而且還要考慮字節序的問題,不同機器的字節序也會有差別。所以此實現很難跨平臺
  2. 文本流實現可以跨平臺,因爲字符是完全跨平臺的,它的信息並不直接和數據的表示方式有關,而是和字節順序有關(即字符串)。接收方需要解析讀取的字符串,比如把字符串“{20.0}”解析爲實型20.0,如何解析,解析的精確程度可以根據平臺的限制有所取捨。此實現的確定是比較複雜,需要花大量時間來解析文本而不能直接從字節流中拷貝到內存。
幾種糟糕的設計:
1. 消息格式“包頭+數據+包尾”,如"{{t=12}}"。第二個結束符 }} 其實是多於的,因爲兩個報文之間只需要一個符號就可以區分,上述的方法會造成浪費 {{ 1 }} {{ 2 }} {{ 3 }} .. 其實只需要 {{1 {{ 2 {{ 3就可以區分了。格式應該是 消息1+邊界+消息2+邊界+消息3+邊界+...
2. 用結構體代碼描述消息結構。比如直接發一個結構的實例過去,
struct 
{
char x; 
int y ;
因爲你不知道另一個接收方的數據二進制佈局是什麼樣的,很可能和發送方的不同,直接發過去,肯定無法解析正確。而且,如果沒有指定字節對齊方式和字節序,也會有問題。這是一種跨平臺性很差的實現。應該在發送之前,把結構實例字節序列化爲一個buffer。
3. 直接傳送二進制浮點數。不同的機器對浮點數的實現可能會有差別,存放方式千差萬別。要傳送浮點數,有下面兩種方式:
    a. 文本化。也就是傳送描述浮點數的字符串,我們知道字符串是完全跨平臺的,尤其是在UTF-8這樣全球統一字符編碼的情況下。
    b. 轉換爲整數。例如1.2,可以用整數12代替,只是要規定單位爲0.1即可。

三、傳輸層

3.1 什麼是全雙工,什麼是半雙工?TCP的傳輸鏈路是什麼?

全雙工(Full Duplex)是指在發送數據的同時也能夠接收數據,兩者同步進行,這好像我們平時打電話一樣,說話的同時也能夠聽到對方的聲音。目前的網卡一般都支持全雙工。
半雙工(Half Duplex),所謂半雙工就是指一個時間段內只有一個動作發生,舉個簡單例子,一條窄窄的馬路,同時只能有一輛車通過,當目前有兩量車對開,這種情況下就只能一輛先過,等到頭兒後另一輛再開,這個例子就形象的說明了半雙工的原理。早期的對講機、以及早期集線器等設備都是基於半雙工的產品。隨着技術的不斷進步,半雙工會逐漸退出歷史舞臺.
單工通信是指通信線路上的數據按單一方向傳送.

TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道

3.2 TCP,UDP 的概念,區別, 報頭的格式 ?

  1. TCP提供面向連接的、可靠的數據流傳輸,而UDP提供的是非面向連接的、不可靠的數據流傳輸。
  2. TCP傳輸單位稱爲TCP報文段,UDP傳輸單位稱爲用戶數據報。
  3. TCP注重數據安全性,UDP數據傳輸快,因爲不需要連接等待,少了許多操作,但是其安全性卻一般。
  4. TCP保證數據正確性,UDP可能丟包 
  5. TCP保證數據順序,UDP不保證 
  6. 每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
  7. TCP首部開銷20字節;UDP的首部開銷小,只有8個字節
  8. TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道
  9. UDP報文的最大長度爲 2^32-1=65535; TCP 報文大小沒有限制(暫不考慮緩衝區的大小),如果一次發過去太長,會分段發送,然後拼接,如果比較短,也可能會等到和下一個一起發;整個TCP包的最大長度是由最大傳輸大小(MSS,Maxitum Segment Size)決定,MSS就是TCP數據包每次能夠傳
    輸的最大數據分段,然後接收方把這些片段拼接起來得到完整的數據段。

大部分情況下都是用TCP,UDP適用情況如下:

  1. 面向數據報方式
  2. 網絡數據大多爲短消息 
  3. 擁有大量Client (現在有了epoll,TCP問題也不大)
  4. 對數據安全性無特殊要求
  5. 網絡負擔非常重,但對響應速度要求高

具體編程時的差別:

  1. socket()的參數不同 
  2. UDP Server不需要調用listen和accept 
  3. UDP收發數據用sendto/recvfrom函數 
  4. TCP:地址信息在connect/accept時確定 
  5. UDP:在sendto/recvfrom函數中每次均 需指定地址信息 
  6. UDP:shutdown函數無效

3.2.1 TCP 報文頭部 

TCP報文的頭部最小爲20字節,


注:

1. TCP 報文頭部中有6個用來說明報文類型的位,默認爲 0 , 當被置爲1時,說明此報文爲對應類型。

  • URG 緊急位,對應緊急報文
  • ACK 確認位,對應確認報文
  • PSH 推搡位,對應推送報文
  • RST 復位位,對應復位報文
  • SYN 同步位,對應同步報文
  • FIN 終止位,對應終止報文
2. 序號即 seq, 指自己發送序列的下一個字節在流中的編號
3. 確認序號即確認號 ack,指收到從對方接受過來的字節流,發回下一個字節的編號。

4. 窗口包含接收窗口(流量控制)、發送窗口、擁塞窗口(擁塞控制)

5. 只有ACK=1,ack確認號纔有意義

3.2.2 UDP 報文頭部


注:

1. UDP 頭部中的長度決定了數據部分的長度,所以UDP數據報整個(含頭部和IP報文頭部)的最大長度爲 2^16-1=65535,數據內容的最大長度爲 65535- IP頭(20) - UDP頭(8)=65507 Bytes,在socket編程中,用sendto函數發送數據時,如果發送數據長度大於該值,則函數會返回錯誤。

3.3 TCP socket 建立的三次握手,斷開的四次揮手,每一步都發哪些報文?


圖 3.1 TCP連接建立的三次握手


圖3.2 TCP連接釋放的四次揮手

標誌位縮寫 全稱 中文
SYN synchronous 建立聯機
ACK acknowledgement 確認
PSH push 傳送
FIN finish 結束
RST reset 重置
URG urgent 緊急
Seq Sequence number 順序號碼
ACK Acknowledge number 確認號碼


狀態名稱 意義
LISTEN 偵聽來自遠方TCP端口的連接請求
SYN-SENT 在發送連接請求後等待匹配的連接請求
SYN-RECEIVED 在收到和發送一個連接請求後等待對連接請求的確認
ESTABLISHED 代表一個打開的連接,數據可以傳送給用戶
FIN-WAIT-1 等待遠程TCP的連接中斷請求,或先前的連接中斷請求的確認
FIN-WAIT-2 從遠程TCP等待連接中斷請求
CLOSE-WAIT 等待從本地用戶發來的連接中斷請求
CLOSING 等待遠程TCP對連接中斷的確認
LAST-ACK 等待原來發向遠程TCP的連接中斷請求的確認
TIME-WAIT 等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認
CLOSED 沒有任何連接狀態

3.3.1 爲什麼連接的時候是三次握手,不是兩次呢?即爲什麼要讓服務端處於半連接狀態?

        爲了防止已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤。
        現假定出現一種異常情況,即A發出的第一個連接請求報文段並沒有丟失,而是在某個網絡結點長時間滯留了,以致延誤到連接釋放以後的某個時間纔到達B。本來這是一個早已失效的報文段。但B收到此失效的連接請求報文段後,就誤認爲是A又發出一次新的連接請求。於是就向A發出確認報文段,同意建立連接。假定不採用三次握手,那麼只要B發出確認,新連接就建立了。
        由於現在A並沒有發出建立連接的請求,因此不會理睬B的確認,也不會向B發送數據。但B卻以爲新的運輸連接已經建立了,並一直等待A發來數據,B的許多資源就這樣白白浪費了。

3.3.2 關閉的時候卻是四次握手?

        因爲當Server端收到Client端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。
        關閉連接時,當收到對方的FIN報文時,僅僅表示對方不再發送數據了但是還能接收數據,乙方也未必全部數據都發送給對方了,所以乙方可以立即close,也可以發送一些數據給對方後,再發送FIN報文給對方來表示同意現在關閉連接,因此,乙方ACK和FIN一般都會分開發送。

3.3.3 關閉時爲什麼TIME_WAIT狀態需要經過2MSL(兩倍最大報文段生存時間)才能返回到CLOSE狀態?爲什麼不直接CLOSE?

1.保證TCP協議的全雙工連接能夠可靠關閉

        如果Client直接CLOSED了,那麼由於IP協議的不可靠性或者是其它網絡原因,導致Server沒有收到Client最後回覆的ACK。那麼Server就會在超時之後繼續發送FIN,此時由於Client已經CLOSED了,就找不到與重發的FIN對應的連接,最後Server就會收到RST而不是ACK,Server就會以爲是連接錯誤把問題報告給高層。這樣的情況雖然不會造成數據丟失,但是卻導致TCP協議不符合可靠連接的要求。所以,Client不是直接進入CLOSED,而是要保持TIME_WAIT,當再次收到FIN的時候,能夠保證對方收到ACK,最後正確的關閉連接。

2.保證這次連接的重複數據段從網絡中消失

        如果Client直接CLOSED,然後又再向Server發起一個新連接,我們不能保證這個新連接與剛關閉的連接的端口號是不同的。也就是說有可能新連接和老連接的端口號是相同的。一般來說不會發生什麼問題,但是還是有特殊情況出現:假設新連接和已經關閉的老連接端口號是一樣的,如果前一次連接的某些數據仍然滯留在網絡中,這些延遲數據在建立新連接之後纔到達Server,由於新連接和老連接的端口號是一樣的,又因爲TCP協議判斷不同連接的依據是socket pair,於是,TCP協議就認爲那個延遲的數據是屬於新連接的,這樣就和真正的新連接的數據包發生混淆了。所以TCP連接還要在TIME_WAIT狀態等待2倍MSL,這樣可以保證本次連接的所有數據都從網絡中消失。

3.3.4 tcp協議的緩衝區什麼情況下應該設置的大一些,什麼時候應該小一些

本問題介紹一些影響IP數據報大小的限制,我們先介紹這些限制,然後就他們如何影響應用進程傳遞的數據綜合分析
  • IPv4 數據報最大大小是65535(16位),包括IPv4頭部。
  • IPv6 數據報最大大小是65575,包括40個字節的IPv4頭部
  • MTU, 這是由硬件規定的,如以太網的MTU是1500字節,IPv4要求最小MTU是68字節,IPv6要求最小MTU是576字節
  • path MTU: 指兩臺主機間的路徑上最小MTU
  • 分片(fragmentation): 指ip數據報大小超過相應鏈路的MTU,IPv4和IPv6都將對ip數據進行分片,到達目的主機後進行重組。
  • IPv4頭部的DF位用於設置分片還是不分片
  • MSS:最大分節大小,向對方TCP通告被通告方在每個分節中能發送的最大TCP數據量。MSS的目的是告訴對方其重組緩衝區大小的實際值,從而避免分片。
TCP與UDP的輸出
        每個TCP套接口有一個發送緩衝區,可以用SO_SNDBUF套接口選項來改變這一緩衝區的大小。當應用進程調用write往套接口寫數據時,內核從應用進程緩衝區中拷貝所有數據到套接口的發送緩衝區,如果套接口發送緩衝區容不下應用程序的所有數據,或者是應用進程的緩衝區大於套接口的發送緩衝區,或者是套接口的發送緩衝區中有別的數據,應用進程將被掛起。內核將不從write返回。直到應用進程緩衝區中的所有數據都拷貝到套接口發送緩衝區。所以,從寫一個TCP套接口的write調用成功返回僅僅表示我們可以重新使用應用進程緩衝區,它並不是告訴我們對方收到數據。
TCP發給對方的數據,對方在收到數據時必須給矛確認,只有在收到對方的確認時,本方TCP纔會把TCP發送緩衝區中的數據刪除。
        UDP因爲是不可靠連接,不必保存應用進程的數據拷貝,應用進程中的數據在沿協議棧向下傳遞時,以某種形式拷貝到內核緩衝區,當數據鏈路層把數據傳出後就把內核緩衝區中數據拷貝刪除。因此它不需要一個發送緩衝區。
        寫UDP套接口的write返回表示應用程序的數據或數據分片已經進入鏈路層的輸出隊列,如果輸出隊列沒有足夠的空間存放數據,將返回錯誤ENOBUFS.
tcp協議的發送緩衝區什麼情況下應該設置的大一些,什麼時候應該小一些
        

3.3.5 阻塞與非阻塞的區別?阻塞模式會有什麼後果?

套接字socket 有兩種模式,即阻塞和非阻塞式,默認是阻塞的。注意兩者都是同步IO,而非異步IO。異步IO是另一種IO方式,這類函數的工作機制是告知內核啓動某個操作,並讓內核在整個操作(包括將數據從內核拷貝到用戶空間)完成後通知我們。
可以阻塞或非阻塞的函數有: 
  • read()/write()
  • recv()/send()  TCP 
  • readv()/writev()
  • recvmsg()/sendmsg()
  • recvfrom()/sendto()   UDP 
阻塞或者非阻塞socket讀寫的寫法參考 http://www.cnblogs.com/sunziying/p/6501045.html
知乎上有個答案說的挺好的(兩列):

問題一:概念
        阻塞:一般的I/O操作可以在新建的流中運用.在服務器迴應前它等待客戶端發送一個空白的行.當會話結束時,服務器關閉流和客戶端socket.如果在隊列中沒有請示將會出現什麼情況呢?那個方法將會等待一個的到來.這個行爲叫阻塞.accept()方法將會阻塞服務器線程直到一個呼叫到來.當5個連接處理完閉之後,服務器退出.任何的在隊列中的呼叫將會被取消.
        非阻塞:非阻塞套接字是指執行此套接字的網絡調用時,不管是否執行成功,都立即返回。比如調用recv()函數讀取網絡緩衝區中數據,不管是否讀到數據都立即返回,而不會一直掛在此函數調用上。在實際Windows網絡通信軟件開發中,異步非阻塞套接字是用的最多的。平常所說的C/S(客戶端/服務器)結構的軟件就是異步非阻塞模式的。 
問題二:阻塞模式的問題
        套接字在IO時阻塞應用程序,就是說控制權不會返回給應用程序,也就是說程序執行到此代碼時會卡住。分兩種情況,
        1. send函數時,只有把要發送的數據下傳至TCP層,send這句代碼才繼續向下執行,此時可確認自己的數據已經在網絡上傳輸了
        2. recv時,只有收到一定數據給應用程序緩衝區時,recv這行代碼纔會向下執行。如果不想這樣做,可以使用多線程,或者選用其他網絡IO模型。
        一般在做服務器程序時,不會使用阻塞套接字,性能低,數據吞吐率也不高。優點是此種模型編寫難度較低,可以用來做入門的學習之用。
       非阻塞套接字,IO會馬上返回.但在send時,如果SOCKET緩衝區已滿,會返回錯誤,使用WSAGetLastError會得到錯誤碼爲WSAEWOULDBLOCK,意思是說在一個非阻塞的套接字上,請求沒有完成。recv時如果SOCKET緩衝區沒有可以讀的數據,也會返回WSAEWOULDBLOCK.
問題三:什麼時候選什麼模式?
       一般情況下,簡單的客戶端程序可以選擇阻塞式socket,編程簡單,使用穩定。其餘情況大多是非阻塞的,因爲非阻塞socket的性能高,數據吞吐率高。非阻塞模式編程通常需要一個while循環,因爲每次發送和接受的長度(寫入、讀出內核緩衝區的長度,即send,recv的返回值)不一定是buf的大小,而阻塞式編程一定是等到都發送出去或者接受完才從send, recv返回,不需要while。http://blog.csdn.net/bird67/article/details/8561414
問題四:同步、異步和阻塞、非阻塞的關係
        知乎上有一個答案講的很好 https://www.zhihu.com/question/19732473
        總的來說,同步、異步與阻塞、 非阻塞並沒有直接對應關係,是兩種不同的概念。
        1. 同步與異步是關注消息通信機制。同步是指發起一個調用後,在得到結果之前,調用不返回 return,一直在調用處,但一旦 return,就得到了結果,此調用結束。異步是指還是發起一個調用後,此調用直接返回,沒有返回結果,當一個異步過程調用發出後,調用者不會立刻得到結果, 而是在*調用*發出後,*被調用者*通過狀態、通知來通知調用者,或通過回調函數處理這個調用。
        2. 阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態。涉及到了線程的阻塞掛起。阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之後纔會返回。非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程,但是調用者需要時不時的(定期的)查看是否有結果返回。
問題五:非阻塞讀寫的寫法
非阻塞的read調用一般這樣寫:
if ((nread = read(sock_fd, buffer, len)) < 0)
{
   if (errno == EWOULDBLOCK)
   {
       return 0;              //表示沒有讀到數據
    }
   else return -1; //表示讀取失敗
}
else return nread;讀到數據長度

非阻塞的write操作一般寫法是:
int write_pos = 0;
int nLeft = nLen;

while (nLeft > 0)
{
 int nWrite = 0;
 if ((nWrite = write(sock_fd, data + write_pos, nLeft)) <= 0)
 {
  if (errno == EWOULDBLOCK)
   {
     nWrite = 0;
    }else return -1; //表示寫失敗
 }
 nLeft -= nWrite;
 write_pos += nWrite;
}
return nLen;

3.3.6 Linux的IO多路複用的四種方式: poll, epoll, select,pselect


3.3.7 DDOS 攻擊(SYN報文攻擊)

       在三次握手過程中,Server發送SYN-ACK之後,收到Client的ACK之前的TCP連接稱爲半連接(half-open connect),此時Server處於SYN_RCVD狀態,當收到ACK後,Server轉入ESTABLISHED狀態。
  SYN攻擊就是Client在短時間內僞造大量不存在的IP地址,並向Server不斷地發送SYN包,Server回覆確認包,並等待Client的確認,由於源地址是不存在的,因此,Server需要不斷重發直至超時,這些僞造的SYN包將長時間佔用未連接隊列,導致正常的SYN請求因爲隊列滿而被丟棄,從而引起網絡堵塞甚至系統癱瘓。
  SYN攻擊時一種典型的DDOS攻擊,檢測SYN攻擊的方式非常簡單,即當Server上有大量半連接狀態且源IP地址是隨機的,則可以斷定遭到SYN攻擊了

3.4 TCP 的流量控制和擁塞控制機制

TCP的流量控制和擁塞控制涉及到三個窗口:
(1)接收端窗口 rwnd
接收端緩衝區大小。接收端將此窗口值放在 TCP 報文的首部中的窗口字段,傳送給發送端。
(2) 擁塞窗口 cwnd (congestion window)
發送端緩衝區大小
(3)發送窗口swnd
發送窗口的上限值 = Min [rwnd, cwnd],綜合考慮了流量控制和擁塞控制。
當 rwnd < cwnd 時,是接收端的接收能力限制發送窗口的最大值。
當 cwnd < rwnd 時,則是網絡的擁塞限制發送窗口的最大值。 

(1)流量控制

問 爲什麼需要流量控制? 
答 如果發送方發的太快,接收方可能會來不及接受,會造成數據的丟失。所謂流量控制就是讓發送方的發送速率不要太快,要讓接收方來得及接收。
發送端已發送了 400 字節的數據,但只收到對前 200 字節數據的確認,同時窗口大小不變。還可發送 300 字節。下面的圖解釋了“滑動”的核心概念,即發送窗口的滑動,發送窗口由接收方發來的確認報文中的rwnd接收窗口設置,發送方的發送窗口大小等於接收方的發接收窗口。發送方的發送窗口不能超過接收方的接收窗口的數值。
 


 
發送端收到了對方對前 400 字節數據的確認,但對方通知發送端必須把窗口減小到 400 字節。現在發送端最多還可發送 400 字節的數據。
下面是另一個例子說明利用滑動窗口機制進行流量控制:

  設A向B發送數據。在連接建立時,B告訴了A:“我的接收窗口是 rwnd = 400 ”(這裏的 rwnd 表示 receiver window) 。因此,發送方的發送窗口不能超過接收方給出的接收窗口的數值。請注意,TCP的窗口單位是字節,不是報文段。TCP連接建立時的窗口協商過程在圖中沒有顯示出來。再設每一個報文段爲100字節長,而數據報文段序號的初始值設爲1。大寫ACK表示首部中的確認位ACK,小寫ack表示確認字段的值ack。

    從圖中可以看出,B進行了三次流量控制。第一次把窗口減少到 rwnd = 300 ,第二次又減到了 rwnd = 100 ,最後減到 rwnd = 0 ,即不允許發送方再發送數據了。這種使發送方暫停發送的狀態將持續到主機B重新發出一個新的窗口值爲止。B向A發送的三個報文段都設置了 ACK = 1 ,只有在ACK=1時確認號字段纔有意義。

    TCP爲每一個連接設有一個持續計時器(persistence timer)。只要TCP連接的一方收到對方的零窗口通知,就啓動持續計時器。若持續計時器設置的時間到期,就發送一個零窗口控測報文段(攜1字節的數據),那麼收到這個報文段的一方就重新設置持續計時器。

(2) 擁塞控制

問:爲什麼需要擁塞控制
答:擁塞控制是防止過多數據注入網絡中使得路由器、交換機等資源過載。由於帶寬、交換機、CPU等網絡資源有限,對這些資源的需求超過了資源可用數時,就會發生擁塞。

擁塞控制主要包含以下2個內容:
  1. 慢開始(指數增大即*2),擁塞避免(加法增大)
  2. 快重傳,快恢復
涉及的窗口是 擁塞窗口 cwnd。有發送方維護。發送方讓自己的發送窗口swnd等於擁塞窗口cwnd,擁塞窗口的大小是動態變化的。四個算法都是相互關聯,可以組合使用的。

2.1 慢開始和擁塞避免
基本思路是爲了避免一次性注入太多數據進網絡可能帶來的擁塞問題,由於網絡的負荷情況是無法得知的,直覺的解決思路是逐漸增加發送窗口(擁塞窗口),來試探網絡的最大承載門限。慢開始和擁塞避免之間的拐點是慢開始門限,先執行慢開始算法,指數級增大擁塞窗口,達到慢開始門限值時,執行擁塞避免算法,因爲門限值以後很可能會發生擁塞,最好慢慢增加(加法增大)。
2.1.1 慢開始原理
(1)在主機剛剛開始發送報文段時可先將擁塞窗口 cwnd 設置爲一個最大報文段 MSS 的數值。
(2)在每收到一個對新的報文段的確認後,將擁塞窗口增加至多一個 MSS 的數值。
(3)用這樣的方法逐步增大發送端的擁塞窗口 cwnd,可以使分組注入到網絡的速率更加合理。
2.1.2 實例講解

注:圖中窗口的單位都是報文段
(1)當 TCP 連接進行初始化時:
發送窗口:swnd = 1 
慢開始閾值(慢開始門限):ssthresh = 16
(2)發送端收到 ACK1 (確認 M0,期望收到 M1)後,將 cwnd 從 1 增大到 2,於是發送端可以接着發送 M1 和 M2 兩個報文段(指數增長)
(3)接收端發回 ACK2 和 ACK3。發送端每收到一個對新報文段的確認 ACK,就把發送端的擁塞窗口加 1。現在發送端的 cwnd 從 2 增大到 4,並可發送 M4 ~ M6共 4個報文段。(指數增長)
(4)當swnd >= ssthresh,swnd執行擁塞避免算法,swnd窗口按線性規律增長。 (加法增大)
(5)當發送 超時,此時swnd = 24 :
ssthresh = swnd/2 = 12;(乘法減小)
swnd = 1
(6)重複地2步。
2.2 快重傳和快恢復(兩者配合使用)
2.2.1 快重傳
接受方一旦發現一個包丟失,則連續發三個針對上一個收到的包的重複確認。發送端只要一連收到三個重複的 ACK 即可斷定有分組丟失了,就應立即重傳丟失的報文段而不必繼續等待爲該報文段設置的重傳計時器的超時,減少了因數據報丟失帶來的重傳時間,提高網絡的吞吐率。然後進行快恢復算法。
2.2.2 快恢復
(1) 當發送方連續收到三個重複確認時,就執行“乘法減小”算法,把ssthresh門限減半。但是接下去並不執行慢開始算法。
(2) 考慮到如果網絡出現擁塞的話就不會收到好幾個重複的確認,所以發送方現在認爲網絡可能沒有出現擁塞。所以此時不執行慢開始算法,而是將cwnd設置爲ssthresh的大小,然後執行擁塞避免算法。如下圖:


3.5 面向連接和非面向連接的服務的特點是什麼?

面向連接的服務,通信雙方在進行通信之前,要先在雙方建立起一個完整的可以彼此溝通的通道,在通信過程中,整個連接的情況一直可以被實時地監控和管理。 非面向連接的服務,不需要預先建立一個聯絡兩個通信節點的連接,需要通信的時候,發送節點就可以往網絡上發送信息,讓信息自主地在網絡上去傳,一般在傳輸的過程中不再加以監控。

3.6 什麼情況下使用TCP,什麼情況下使用UDP?不同類型的網絡遊戲用什麼?你覺得LOL用的是TCP還是UDP?

TCP的優點在於
  • 簡單直接的長連接
  • 可靠的信息傳輸,保證不會丟包,保證數據的順序
  • 數據包的大小沒有限制
TCP的缺點是
  • 延遲比較大。由於是可靠的,一旦丟包,會進行重傳,
  • 包體比較大,傳輸速率較慢
  • 會進行擁塞控制且假定了這是由網絡帶寬不夠造成,擁塞窗口會在擁塞時乘法減小,發包數量腰斬
UDP的優點在於
  • 包體較小,傳輸速率快
  • 延遲小
  • 無需建立連接
UDP的缺點是
  • 連接不可靠,會丟包
  • 包的大小有限制 2^16 - 20 - 8.
如何選擇TCP或者UDP? 
  • 可以容忍延遲並且有很好的屏蔽延遲的設計,如紙牌類和MMO,用TCP
  • 實時遊戲,不能容忍延遲,如DOTA類和動作類,用UDP
  • 在多人網絡遊戲中,人物的移動可以用UDP來發。因爲人物一直處於移動當中,會頻繁發出位置信息的包。由於發的比較頻繁,而且後面的位置信息會覆蓋掉前面的位置信息,所以丟不丟包不重要。就可以用UDP來發。每個UDP包的數據裏面加個時間戳,那麼進來的包你判斷下時間,如果是已經過期的包,就可以直接丟掉。這樣,即使udp包過來的順序不一樣都無所謂了。
你覺得LOL用的是TCP還是UDP?
  • 英雄聯盟TCP和UDP都用
  • 如果對於數據傳輸速度要求非常高的場景,比如FPS,MOBA等遊戲過程中,用戶對戰時候的數據肯定是要用UDP來傳輸的,並且在程序層面保證傳輸的可靠性,包括自己做校驗等;
  • 但其它模塊,比如大廳裏啊,買東西啊,創建房間啊等等,都是可以TCP實現的
  • LOL這種MOBA類的無法忍受延遲,且響應速度至關重要,必然會使用UDP

3.7 socket 編程相關問題

可以看看我的C跨平臺socket庫是怎麼寫tcp_send和tcp_recv的,兩個函數在阻塞或非阻塞模式下都可以準確發送和接收。 https://github.com/neonum/tekcos/blob/master/tekcos.c
要點:
1. TCP socket send() 並不把數據傳到網絡上,而只是吧數據從socket緩衝區的數據複製到內核的發送緩衝區。此時這些數據並不一定馬上被傳到連接的另一端。
2. setsockopt 和 getsockopt 分別用來設置socket的內部變量、選項。set socket option and get socket option. 
3. tcp協議本身是可靠的,並不等於應用程序用tcp發送數據就一定是可靠的.不管是否阻塞,send發送的大小,並不代表對端recv到多少的數據.
4. send 和 recv只與內核的發送和輸出緩衝區打交道,不和另一端打交道。數據在端到端的傳送由內核完成。

3.8 TCP socket如何判斷連接的有效性?

心跳包和心跳檢測。網絡中的接收和發送數據都是使用SOCKET進行實現。但是如果此套接字已經斷開,那發送數據和接收數據的時候就一定會有問題。可是如何判斷這個套接字是否還可以使用呢?這個就需要在系統中創建心跳機制。其實TCP中已經爲我們實現了一個叫做心跳的機制。如果你設置了心跳,那TCP就會在一定的時間(比如你設置的是3秒鐘)內發送你設置的次數的心跳(比如說2次),並且此信息不會影響你自己定義的協議。所謂“心跳”就是定時發送一個自定義的結構體(心跳包或心跳幀),讓對方知道自己“在線”。 以確保鏈接的有效性。

四、網絡層

提供邏輯地址與路由

4.1 四類IP地址,子網劃分的計算,特殊的IP段,保留地址


注:
1. 無論是A,B,C類哪種地址,主機號host-id全0表示本主機,全1表示本網絡(net-id一樣)的所有主機,用於廣播。所以,在計算主機數的時候需要 -2.
2. A 類地址中,網絡號爲全1(即127,127.xxx.xxx.xxx)的一組保留用作本地軟件環回測試地址,如127.0.0.1;網絡號全0(即0.0.0.0)表示本網絡.所以用戶可用的A類網絡有 2^7-2個,每個網絡的主機數爲 2^24-2。
3. B類地址中,網絡號爲 128(即1000 0000)的被保留,不可指派,所以B類地址的網絡數爲2^14-1,每個網絡的主機數爲 2^16-2。
4. C類地址中,網絡號爲192(即1100 0000) 的被保留,不可指派,所以C類的地址的網絡數爲 2^21-1,每個網絡的主機數爲 2^8-2。
5. D類地址不指向特定網絡,用在多播中。
6. 其他保留的IP地址 10.0.0.0—10.255.255.255, 172.16.0.0—172.31.255.255, 192.168.0.0—192.168.255.255。(Internet上保留地址用於內部)

子網掩碼是用來計算網絡地址的值,子網掩碼和該網絡中如何一個主機的IP地址按位與,得到該網絡的net-id網絡號,其餘位爲0。

4.2 ARP是地址解析協議,簡單語言解釋一下工作原理

ARP將IP地址轉換爲MAC地址
1. 首先,每個主機都會在自己的ARP緩衝區中建立一個ARP列表,以表示IP地址和MAC地址之間的對應關係。
2. 當源主機要發送數據時,首先檢查ARP列表中是否有對應IP地址的目的主機的MAC地址,如果有,則直接發送數據,如果沒有,就向本網段的所有主機發送ARP數據包,該數據包包括的內容有:源主機IP地址,源主機MAC地址,目的主機的IP地址。
3. 當本網絡的所有主機收到該ARP數據包時,首先檢查數據包中的IP地址是否是自己的IP地址,如果不是,則忽略該數據包,如果是,則首先從數據包中取出源主機的IP和MAC地址寫入到ARP列表中,如果已經存在,則覆蓋,然後將自己的MAC地址寫入ARP響應包中,告訴源主機自己是它想要找的MAC地址。
4. 源主機收到ARP響應包後。將目的主機的IP和MAC地址寫入ARP列表,並利用此信息發送數據。如果源主機一直沒有收到ARP響應數據包,表示ARP查詢失敗。
廣播發送ARP請求,單播發送ARP響應。

4.3 ping 操作的原理,涉及哪些協議?

        ping 使用的是ICMP協議,它發送icmp回送請求消息給目的主機。ICMP協議規定:目的主機必須返回ICMP回送應答消息給源主機。如果源主機在一定時間內收到應答,則認爲主機可達。

ICMP協議通過IP協議發送的,IP協議是一種無連接的,不可靠的數據包協議,可靠性由ICMP協議解決。
        假定主機A的IP地址是192.168.1.1,主機B的IP地址是192.168.1.2,都在同一子網內,則當你在主機A上運行“Ping 192.168.1.2”後,都發生了些什麼呢?
        首先,Ping命令會構建一個固定格式的ICMP請求數據包,然後由ICMP協議將這個數據包連同地址“192.168.1.2”一起交給IP協議(和ICMP一樣,實際上是一組後臺運行的進程),IP層協議將以地址“192.168.1.2”作爲目的地址,本機IP地址作爲源地址,加上一些其他的控制信息,構建一個IP數據包,並在一個映射表(由ARP)協議實現中查找出IP地址192.168.1.2所對應的物理地址(也叫MAC地址,熟悉網卡配置的朋友不會陌生,這是數據鏈路層協議構建數據鏈路層的傳輸單元——幀所必需的),一併交給數據鏈路層。後者構建一個數據幀,目的地址是IP層傳過來的物理地址,源地址則是本機的物理地址,還要附加上一些控制信息,依據以太網的介質訪問規則,將它們傳送出去。
        主機B收到這個數據幀後,先檢查它的目的地址,並和本機的物理地址對比,如符合,則接收;否則丟棄。接收後檢查該數據幀,將IP數據包從幀中提取出來,交給本機的IP層協議。同樣,IP層檢查後,將有用的信息提取後交給ICMP協議,後者處理後,馬上構建一個ICMP應答包,發送給主機A,其過程和主機A發送ICMP請求包到主機B一模一樣。
        即先由IP地址,在網絡層傳輸,然後再根據mac地址由數據鏈路層傳送到目的主機。
        涉及到的協議有:

  1. ICMP internet報文控制協議, 用於在IP主機、路由器之間傳遞控制消息。
  2. IP 協議
  3. ARP 協議 

五、硬件上的一些問題

5.1 每一層涉及的硬件有哪些?分別是幹什麼用的?對應的協議是什麼?

交換機,網關,路由的區別

  • 交換機 在計算機網絡系統中,交換機是針對共享工作模式的弱點而推出的。交換機擁有一條高帶寬的背部總線和內部交換矩陣。交換機的所有的端口都掛接在這條背 部總線上,當控制電路收到數據包以後,處理端口會查找內存中的地址對照表以確定目的MAC(網卡的硬件地址)的NIC(網卡)掛接在哪個端口上,通過內部 交換矩陣迅速將數據包傳送到目的端口。目的MAC若不存在,交換機才廣播到所有的端口,接收端口迴應後交換機會“學習”新的地址,並把它添加入內部地址表 中。 交換機工作於OSI參考模型的第二層,即數據鏈路層。交換機內部的CPU會在每個端口成功連接時,通過ARP協議學習它的MAC地址,保存成一張 ARP表。在今後的通訊中,發往該MAC地址的數據包將僅送往其對應的端口,而不是所有的端口。因此,交換機可用於劃分數據鏈路層廣播,即衝突域;但它不 能劃分網絡層廣播,即廣播域。 交換機被廣泛應用於二層網絡交換,俗稱“二層交換機”。 交換機的種類有:二層交換機、三層交換機、四層交換機、七層交換機分別工作在OSI七層模型中的第二層、第三層、第四層盒第七層,並因此而得名。
  • 路由器 路由器(Router)是一種計算機網絡設備,提供了路由與轉送兩種重要機制,可以決定數據包從來源端到目的端所經過 的路由路徑(host到host之間的傳輸路徑),這個過程稱爲路由;將路由器輸入端的數據包移送至適當的路由器輸出端(在路由器內部進行),這稱爲轉 送。路由工作在OSI模型的第三層——即網絡層,例如網際協議。 路由器的一個作用是連通不同的網絡,另一個作用是選擇信息傳送的線路。 路由器與交換器的差別,路由器是屬於OSI第三層的產品,交換器是OSI第二層的產品(這裏特指二層交換機)。
  • 網關 網關(Gateway),網關顧名思義就是連接兩個網絡的設備,區別於路由器(由於歷史的原因,許多有關TCP/IP 的文獻曾經把網絡層使用的路由器(Router)稱爲網關,在今天很多局域網採用都是路由來接入網絡,因此現在通常指的網關就是路由器的IP),經常在家 庭中或者小型企業網絡中使用,用於連接局域網和Internet。 網關也經常指把一種協議轉成另一種協議的設備,比如語音網關。 在傳統TCP/IP術語中,網絡設備只分成兩種,一種爲網關(gateway),另一種爲主機(host)。網關能在網絡間轉遞數據包,但主機不能 轉送數據包。在主機(又稱終端系統,end system)中,數據包需經過TCP/IP四層協議處理,但是在網關(又稱中介系 統,intermediate system)只需要到達網際層(Internet layer),決定路徑之後就可以轉送。在當時,網關 (gateway)與路由器(router)還沒有區別。 在現代網絡術語中,網關(gateway)與路由器(router)的定義不同。網關(gateway)能在不同協議間移動數據,而路由器(router)是在不同網絡間移動數據,相當於傳統所說的IP網關(IP gateway)。 網關是連接兩個網絡的設備,對於語音網關來說,他可以連接PSTN網絡和以太網,這就相當於VOIP,把不同電話中的模擬信號通過網關而轉換成數字信號,而且加入協議再去傳輸。在到了接收端的時候再通過網關還原成模擬的電話信號,最後才能在電話機上聽到。 對於以太網中的網關只能轉發三層以上數據包,這一點和路由是一樣的。而不同的是網關中並沒有路由表,他只能按照預先設定的不同網段來進行轉發。網關最重要的一點就是端口映射,子網內用戶在外網看來只是外網的IP地址對應着不同的端口,這樣看來就會保護子網內的用戶。


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