Java 面試知識點解析(五)——網絡協議篇

  • 前言:

在遨游了一番 Java Web 的世界之后,發現了自己的一些缺失,所以就著一篇深度好文:知名互聯網公司校招 Java 開發崗面試知識點解析 ,來好好的對 Java 知識點進行復習和學習一番,大部分內容參照自這一篇文章,有一些自己補充的,也算是重新學習一下 Java 吧。

前序文章鏈接:

Java 面試知識點解析(一)——基礎知識篇

Java 面試知識點解析(二)——高并發編程篇

Java 面試知識點解析(三)——JVM篇

Java 面試知識點解析(四)——版本特性篇


前排引用說明及好文推薦:面試/筆試第一彈 —— 計算機網絡面試問題集錦——書呆子Rico

(一)網絡基礎知識

1)Http和Https的區別?

答:Http協議運行在TCP之上,明文傳輸,客戶端與服務器端都無法驗證對方的身份;Https是身披SSL(Secure Socket Layer)外殼的Http,運行于SSL上,SSL運行于TCP之上,是添加了加密和認證機制的HTTP。二者之間存在如下不同:

  • 端口不同:Http與Http使用不同的連接方式,用的端口也不一樣,前者是80,后者是443;

  • 資源消耗:和HTTP通信相比,Https通信會由于加減密處理消耗更多的CPU和內存資源;

  • 開銷:Https通信需要證書,而證書一般需要向認證機構購買;

Https的加密機制是一種共享密鑰加密和公開密鑰加密并用的混合加密機制。


2)對稱加密與非對稱加密

答:

對稱密鑰加密是指加密和解密使用同一個密鑰的方式,這種方式存在的最大問題就是密鑰發送問題,即如何安全地將密鑰發給對方;而非對稱加密是指使用一對非對稱密鑰,即公鑰和私鑰,公鑰可以隨意發布,但私鑰只有自己知道。發送密文的一方使用對方的公鑰進行加密處理,對方接收到加密信息后,使用自己的私鑰進行解密。

由于非對稱加密的方式不需要發送用來解密的私鑰,所以可以保證安全性;但是和對稱加密比起來,它非常的慢,所以我們還是要用對稱加密來傳送消息,但對稱加密所使用的密鑰我們可以通過非對稱加密的方式發送出去。


3)三次握手與四次揮手

答:

(1). 三次握手(我要和你建立鏈接,你真的要和我建立鏈接么,我真的要和你建立鏈接,成功)

  • 第一次握手:Client將標志位SYN置為1,隨機產生一個值seq=J,并將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。

  • 第二次握手:Server收到數據包后由標志位SYN=1知道Client請求建立連接,Server將標志位SYN和ACK都置為1,ack=J+1,隨機產生一個值seq=K,并將該數據包發送給Client以確認連接請求,Server進入SYN_RCVD狀態。

  • 第三次握手:Client收到確認后,檢查ack是否為J+1,ACK是否為1,如果正確則將標志位ACK置為1,ack=K+1,并將該數據包發送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨后Client與Server之間可以開始傳輸數據了。

(2). 四次揮手(我要和你斷開鏈接;好的,斷吧。我也要和你斷開鏈接;好的,斷吧):

  • 第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。

  • 第二次揮手:Server收到FIN后,發送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個FIN占用一個序號),Server進入CLOSE_WAIT狀態。此時TCP鏈接處于半關閉狀態,即客戶端已經沒有要發送的數據了,但服務端若發送數據,則客戶端仍要接收。

  • 第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。

  • 第四次揮手:Client收到FIN后,Client進入TIME_WAIT狀態,接著發送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。

(3). 通俗一點的理解就是:


4)為什么 TCP 鏈接需要三次握手,兩次不可以么?

答:“三次握手” 的目的是為了防止已失效的鏈接請求報文突然又傳送到了服務端,因而產生錯誤。

  • 正常的情況:A 發出連接請求,但因連接請求報文丟失而未收到確認,于是 A 再重傳一次連接請求。后來收到了確認,建立了連接。數據傳輸完畢后,就釋放了連接。A 共發送了兩個連接請求報文段,其中第一個丟失,第二個到達了 B。沒有 “已失效的連接請求報文段”。

  • 現假定出現了一種異常情況:即 A 發出的第一個連接請求報文段并沒有丟失,而是在某個網絡結點長時間的滯留了,以致延誤到連接釋放以后的某個時間才到達 B。本來這是一個早已失效的報文段。但 B 收到此失效的連接請求報文段后,就誤認為是 A 再次發出的一個新的連接請求。于是就向 A 發出確認報文段,同意建立連接。

假設不采用“三次握手”,那么只要 B 發出確認,新的連接就建立了。由于現在 A 并沒有發出建立連接的請求,因此不會理睬 B 的確認,也不會向 B 發送數據。但 B 卻以為新的運輸連接已經建立,并一直等待 A 發來數據。這樣,B 的很多資源就白白浪費掉了。采用“三次握手”的辦法可以防止上述現象發生。


5)為什么要四次揮手?

答:TCP 協議是一種面向連接的、可靠的、基于字節流的運輸層通信協議。TCP 是全雙工模式,這就意味著,當 A 向 B 發出 FIN 報文段時,只是表示 A 已經沒有數據要發送了,而此時 A 還是能夠接受到來自 B 發出的數據;B 向 A 發出 ACK 報文段也只是告訴 A ,它自己知道 A 沒有數據要發了,但 B 還是能夠向 A 發送數據。

所以想要愉快的結束這次對話就需要四次揮手。


6)TCP 協議如何來保證傳輸的可靠性

答:TCP 提供一種面向連接的、可靠的字節流服務。其中,面向連接意味著兩個使用 TCP 的應用(通常是一個客戶和一個服務器)在彼此交換數據之前必須先建立一個 TCP 連接。在一個 TCP 連接中,僅有兩方進行彼此通信;而字節流服務意味著兩個應用程序通過 TCP 鏈接交換 8 bit 字節構成的字節流,TCP 不在字節流中插入記錄標識符。

對于可靠性,TCP通過以下方式進行保證:

  • 數據包校驗:目的是檢測數據在傳輸過程中的任何變化,若校驗出包有錯,則丟棄報文段并且不給出響應,這時TCP發送數據端超時后會重發數據;

  • 對失序數據包重排序:既然TCP報文段作為IP數據報來傳輸,而IP數據報的到達可能會失序,因此TCP報文段的到達也可能會失序。TCP將對失序數據進行重新排序,然后才交給應用層;

  • 丟棄重復數據:對于重復數據,能夠丟棄重復數據;

  • 應答機制:當TCP收到發自TCP連接另一端的數據,它將發送一個確認。這個確認不是立即發送,通常將推遲幾分之一秒;

  • 超時重發:當TCP發出一個段后,它啟動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段;

  • 流量控制:TCP連接的每一方都有固定大小的緩沖空間。TCP的接收端只允許另一端發送接收端緩沖區所能接納的數據,這可以防止較快主機致使較慢主機的緩沖區溢出,這就是流量控制。TCP使用的流量控制協議是可變大小的滑動窗口協議。


7)客戶端不斷進行請求鏈接會怎樣?DDos(Distributed Denial of Service)攻擊?

答:服務器端會為每個請求創建一個鏈接,并向其發送確認報文,然后等待客戶端進行確認

(1). DDos 攻擊:

  • 客戶端向服務端發送請求鏈接數據包
  • 服務端向客戶端發送確認數據包
  • 客戶端不向服務端發送確認數據包,服務器一直等待來自客戶端的確認

(2). DDos 預防:(沒有徹底根治的辦法,除非不使用TCP)

  • 限制同時打開SYN半鏈接的數目
  • 縮短SYN半鏈接的Time out 時間
  • 關閉不必要的服務

8)GET 與 POST 的區別?

答:GET與POST是我們常用的兩種HTTP Method,二者之間的區別主要包括如下五個方面:

(1). 從功能上講,GET一般用來從服務器上獲取資源,POST一般用來更新服務器上的資源;

(2). 從REST服務角度上說,GET是冪等的,即讀取同一個資源,總是得到相同的數據,而POST不是冪等的,因為每次請求對資源的改變并不是相同的;進一步地,GET不會改變服務器上的資源,而POST會對服務器資源進行改變;

(3). 從請求參數形式上看,GET請求的數據會附在URL之后,即將請求數據放置在HTTP報文的 請求頭 中,以?分割URL和傳輸數據,參數之間以&相連。特別地,如果數據是英文字母/數字,原樣發送;否則,會將其編碼為 application/x-www-form-urlencoded MIME 字符串(如果是空格,轉換為+,如果是中文/其他字符,則直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號以16進制表示的ASCII);而POST請求會把提交的數據則放置在是HTTP請求報文的 請求體 中。

(4). 就安全性而言,POST的安全性要比GET的安全性高,因為GET請求提交的數據將明文出現在URL上,而且POST請求參數則被包裝到請求體中,相對更安全。

(5). 從請求的大小看,GET請求的長度受限于瀏覽器或服務器對URL長度的限制,允許發送的數據量比較小,而POST請求則是沒有大小限制的。

為什么在GET請求中會對URL進行編碼?

我們知道,在GET請求中會對URL中非西文字符進行編碼,這樣做的目的就是為了 避免歧義。看下面的例子,

針對 “name1=value1&name2=value2” 的例子,我們來談一下數據從客戶端到服務端的解析過程。首先,上述字符串在計算機中用ASCII嗎表示為:

   6E616D6531 3D 76616C756531 26 6E616D6532 3D 76616C756532
   6E616D6531:name1 
   3D:= 
   76616C756531:value1 
   26:&
   6E616D6532:name2 
   3D:= 
   76616C756532:value2 

服務端在接收到該數據后就可以遍歷該字節流,一個字節一個字節的吃,當吃到3D這字節后,服務端就知道前面吃得字節表示一個key,再往后吃,如果遇到26,說明從剛才吃的3D到26子節之間的是上一個key的value,以此類推就可以解析出客戶端傳過來的參數。

現在考慮這樣一個問題,如果我們的參數值中就包含=或&這種特殊字符的時候該怎么辦?比如,“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么實際在傳輸過程中就會變成這樣“name1=va&lu=e1”。這樣,我們的本意是只有一個鍵值對,但是服務端卻會解析成兩個鍵值對,這樣就產生了歧義。

那么,如何解決上述問題帶來的歧義呢?解決的辦法就是對參數進行URL編碼:例如,我們對上述會產生歧義的字符進行URL編碼后結果:“name1=va%26lu%3D”,這樣服務端會把緊跟在“%”后的字節當成普通的字節,就是不會把它當成各個參數或鍵值對的分隔符。


9)TCP與UDP的區別

答:TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)協議屬于傳輸層協議,它們之間的區別包括:

  • TCP是面向連接的,UDP是無連接的;

  • TCP是可靠的,UDP是不可靠的;

  • TCP只支持點對點通信,UDP支持一對一、一對多、多對一、多對多的通信模式;

  • TCP是面向字節流的,UDP是面向報文的;

  • TCP有擁塞控制機制;UDP沒有擁塞控制,適合媒體通信;

  • TCP首部開銷(20個字節)比UDP的首部開銷(8個字節)要大;


10)TCP和UDP分別對應的常見應用層協議

答:

(1). TCP 對應的應用層協議:

  • FTP:定義了文件傳輸協議,使用21端口。常說某某計算機開了FTP服務便是啟動了文件傳輸服務。下載文件,上傳主頁,都要用到FTP服務。

  • Telnet:它是一種用于遠程登陸的端口,用戶可以以自己的身份遠程連接到計算機上,通過這種端口可以提供一種基于DOS模式下的通信服務。如以前的BBS是-純字符界面的,支持BBS的服務器將23端口打開,對外提供服務。

  • SMTP:定義了簡單郵件傳送協議,現在很多郵件服務器都用的是這個協議,用于發送郵件。如常見的免費郵件服務中用的就是這個郵件服務端口,所以在電子郵件設置-中常看到有這么SMTP端口設置這個欄,服務器開放的是25號端口。

  • POP3:它是和SMTP對應,POP3用于接收郵件。通常情況下,POP3協議所用的是110端口。也是說,只要你有相應的使用POP3協議的程序(例如Fo-xmail或Outlook),就可以不以Web方式登陸進郵箱界面,直接用郵件程序就可以收到郵件(如是163郵箱就沒有必要先進入網易網站,再進入自己的郵-箱來收信)。

  • HTTP:從Web服務器傳輸超文本到本地瀏覽器的傳送協議。

(2). UDP 對應的應用層協議:

  • DNS:用于域名解析服務,將域名地址轉換為IP地址。DNS用的是53號端口。

  • SNMP:簡單網絡管理協議,使用161號端口,是用來管理網絡設備的。由于網絡設備很多,無連接的服務就體現出其優勢。

  • TFTP(Trival File Transfer Protocal):簡單文件傳輸協議,該協議在熟知端口69上使用UDP服務

(3). 圖示:


11)TCP 的擁塞避免機制

答:

擁塞:對資源的需求超過了可用的資源。若網絡中許多資源同時供應不足,網絡的性能就要明顯變壞,整個網絡的吞吐量隨之負荷的增大而下降。

擁塞控制:防止過多的數據注入到網絡中,使得網絡中的路由器或鏈路不致過載。

擁塞控制的方法:

(1). 慢啟動 + 擁塞避免:

慢啟動:不要一開始就發送大量的數據,先探測一下網絡的擁塞程度,也就是說由小到大逐漸增加擁塞窗口的大小;

擁塞避免:擁塞避免算法讓擁塞窗口緩慢增長,即每經過一個往返時間RTT就把發送方的擁塞窗口cwnd加1,而不是加倍,這樣擁塞窗口按線性規律緩慢增長。

(2). 快重傳 + 快恢復:

快重傳:快重傳要求接收方在收到一個 失序的報文段 后就立即發出 重復確認(為的是使發送方及早知道有報文段沒有到達對方)而不要等到自己發送數據時捎帶確認。快重傳算法規定,發送方只要一連收到三個重復確認就應當立即重傳對方尚未收到的報文段,而不必繼續等待設置的重傳計時器時間到期。

快恢復:快重傳配合使用的還有快恢復算法,當發送方連續收到三個重復確認時,就執行“乘法減小”算法,把ssthresh門限減半,但是接下去并不執行慢開始算法:因為如果網絡出現擁塞的話就不會收到好幾個重復的確認,所以發送方現在認為網絡可能沒有出現擁塞。所以此時不執行慢開始算法,而是將cwnd設置為ssthresh的大小,然后執行擁塞避免算法。


12)瀏覽器中輸入:“www.xxx.com” 之后都發生了什么?請詳細闡述。

解析:經典的網絡協議問題。

答:

  1. 由域名→IP地址 尋找IP地址的過程依次經過了瀏覽器緩存、系統緩存、hosts文件、路由器緩存、 遞歸搜索根域名服務器。
  2. 建立TCP/IP連接(三次握手具體過程)
  3. 由瀏覽器發送一個HTTP請求
  4. 經過路由器的轉發,通過服務器的防火墻,該HTTP請求到達了服務器
  5. 服務器處理該HTTP請求,返回一個HTML文件
  6. 瀏覽器解析該HTML文件,并且顯示在瀏覽器端
  7. 這里需要注意:
    • HTTP協議是一種基于TCP/IP的應用層協議,進行HTTP數據請求必須先建立TCP/IP連接
    • 可以這樣理解:HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網絡通信的能力。
    • 兩個計算機之間的交流無非是兩個端口之間的數據通信,具體的數據會以什么樣的形式展現是以不同的應用層協議來定義的。

13)什么是 HTTP 協議無狀態協議?怎么解決Http協議無狀態協議?

答:HTTP 是一個無狀態的協議,也就是沒有記憶力,這意味著每一次的請求都是獨立的,缺少狀態意味著如果后續處理需要前面的信息,則它必須要重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就很快。

HTTP 的這種特性有優點也有缺點:

  • 優點:解放了服務器,每一次的請求“點到為止”,不會造成不必要的連接占用
  • 缺點:每次請求會傳輸大量重復的內容信息,并且,在請求之間無法實現數據的共享

解決方案:

  1. 使用參數傳遞機制:
    將參數拼接在請求的 URL 后面,實現數據的傳遞(GET方式),例如:/param/list?username=wmyskxz
    問題:可以解決數據共享的問題,但是這種方式一不安全,二數據允許傳輸量只有1kb
  2. 使用 Cookie 技術
  3. 使用 Session 技術

14)Session、Cookie 與 Application

答:Cookie和Session都是客戶端與服務器之間保持狀態的解決方案,具體來說,cookie機制采用的是在客戶端保持狀態的方案,而session機制采用的是在服務器端保持狀態的方案。

(1). Cookie 及其相關 API :

Cookie實際上是一小段的文本信息。客戶端請求服務器,如果服務器需要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie,而客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器,服務器檢查該Cookie,以此來辨認用戶狀態。服務器還可以根據需要修改Cookie的內容。

(2). Session 及其相關 API:

同樣地,會話狀態也可以保存在服務器端。客戶端請求服務器,如果服務器記錄該用戶狀態,就獲取Session來保存狀態,這時,如果服務器已經為此客戶端創建過session,服務器就按照sessionid把這個session檢索出來使用;如果客戶端請求不包含sessionid,則為此客戶端創建一個session并且生成一個與此session相關聯的sessionid,并將這個sessionid在本次響應中返回給客戶端保存。保存這個sessionid的方式可以采用 cookie機制 ,這樣在交互過程中瀏覽器可以自動的按照規則把這個標識發揮給服務器;若瀏覽器禁用Cookie的話,可以通過 URL重寫機制 將sessionid傳回服務器。

(3). Session 與 Cookie 的對比:

  • 實現機制:Session的實現常常依賴于Cookie機制,通過Cookie機制回傳SessionID;

  • 大小限制:Cookie有大小限制并且瀏覽器對每個站點也有cookie的個數限制,Session沒有大小限制,理論上只與服務器的內存大小有關;

  • 安全性:Cookie存在安全隱患,通過攔截或本地文件找得到cookie后可以進行攻擊,而Session由于保存在服務器端,相對更加安全;

  • 服務器資源消耗:Session是保存在服務器端上會存在一段時間才會消失,如果session過多會增加服務器的壓力。

(4). Application:

Application(ServletContext):與一個Web應用程序相對應,為應用程序提供了一個全局的狀態,所有客戶都可以使用該狀態。


15)滑動窗口機制

答:由發送方和接收方在三次握手階段,互相將自己的最大可接收的數據量告訴對方。也就是自己的數據接收緩沖池的大小。這樣對方可以根據已發送的數據量來計算是否可以接著發送。在處理過程中,當接收緩沖池的大小發生變化時,要給對方發送更新窗口大小的通知。這就實現了流量的控制。


16)常用的HTTP方法有哪些?

答:

  • GET: 用于請求訪問已經被URI(統一資源標識符)識別的資源,可以通過URL傳參給服務器
  • POST:用于傳輸信息給服務器,主要功能與GET方法類似,但一般推薦使用POST方式。
  • PUT: 傳輸文件,報文主體中包含文件內容,保存到對應URI位置。
  • HEAD: 獲得報文首部,與GET方法類似,只是不返回報文主體,一般用于驗證URI是否有效。
  • DELETE:刪除文件,與PUT方法相反,刪除對應URI位置的文件。
  • OPTIONS:查詢相應URI支持的HTTP方法。

17)常見HTTP狀態碼

答:

  1. 1xx(臨時響應)

  2. 2xx(成功)

  3. 3xx(重定向):表示要完成請求需要進一步操作

  4. 4xx(錯誤):表示請求可能出錯,妨礙了服務器的處理

  5. 5xx(服務器錯誤):表示服務器在嘗試處理請求時發生內部錯誤

  6. 常見狀態碼:

    • 200(成功)
    • 304(未修改):自從上次請求后,請求的網頁未修改過。服務器返回此響應時,不會返回網頁內容
    • 401(未授權):請求要求身份驗證
    • 403(禁止):服務器拒絕請求
    • 404(未找到):服務器找不到請求的網頁

18)SQL 注入

答:SQL注入就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。

(1).SQL注入攻擊的總體思路:

  1. 尋找到SQL注入的位置
  2. 判斷服務器類型和后臺數據庫類型
  3. 針對不通的服務器和數據庫特點進行SQL注入攻擊

(2). SQL注入攻擊實例:

比如,在一個登錄界面,要求輸入用戶名和密碼,可以這樣輸入實現免帳號登錄:

用戶名: ‘or 1 = 1 --
密 碼:

用戶一旦點擊登錄,如若沒有做特殊處理,那么這個非法用戶就很得意的登陸進去了。這是為什么呢?下面我們分析一下:從理論上說,后臺認證程序中會有如下的SQL語句:

String sql = “select * from user_table where username=’ “+userName+” ’ and password=’ “+password+” ‘”;

因此,當輸入了上面的用戶名和密碼,上面的SQL語句變成:

SELECT * FROM user_table WHERE username=’’or 1 = 1 – and password=’’

分析上述SQL語句我們知道,username=‘ or 1=1 這個語句一定會成功;然后后面加兩個-,這意味著注釋,它將后面的語句注釋,讓他們不起作用。這樣,上述語句永遠都能正確執行,用戶輕易騙過系統,獲取合法身份。

(3). 應對方法:

1.參數綁定:

使用預編譯手段,綁定參數是最好的防SQL注入的方法。目前許多的ORM框架及JDBC等都實現了SQL預編譯和參數綁定功能,攻擊者的惡意SQL會被當做SQL的參數而不是SQL命令被執行。在mybatis的mapper文件中,對于傳遞的參數我們一般是使用#和$來獲取參數值。當使用#時,變量是占位符,就是一般我們使用javajdbc的PrepareStatement時的占位符,所有可以防止sql注入;當使用$時,變量就是直接追加在sql中,一般會有sql注入問題。

2.使用正則表達式過濾傳入的參數


19)XSS 攻擊

答:XSS是一種經常出現在web應用中的計算機安全漏洞,與SQL注入一起成為web中最主流的攻擊方式。XSS是指惡意攻擊者利用網站沒有對用戶提交數據進行轉義處理或者過濾不足的缺點,進而添加一些腳本代碼嵌入到web頁面中去,使別的用戶訪問都會執行相應的嵌入代碼,從而盜取用戶資料、利用用戶身份進行某種動作或者對訪問者進行病毒侵害的一種攻擊方式。

(1). XSS攻擊的危害:

  • 盜取各類用戶帳號,如機器登錄帳號、用戶網銀帳號、各類管理員帳號

  • 控制企業數據,包括讀取、篡改、添加、刪除企業敏感數據的能力

  • 盜竊企業重要的具有商業價值的資料

  • 非法轉賬

  • 強制發送電子郵件

  • 網站掛馬

  • 控制受害者機器向其它網站發起攻擊

(2). 原因解析:

  • 主要原因:過于信任客戶端提交的數據!
  • 解決辦法:不信任任何客戶端提交的數據,只要是客戶端提交的數據就應該先進行相應的過濾處理然后方可進行下一步的操作。
  • 進一步分析細節:客戶端提交的數據本來就是應用所需要的,但是惡意攻擊者利用網站對客戶端提交數據的信任,在數據中插入一些符號以及javascript代碼,那么這些數據將會成為應用代碼中的一部分了,那么攻擊者就可以肆無忌憚地展開攻擊啦,因此我們絕不可以信任任何客戶端提交的數據!!!

(3). XSS 攻擊分類:

    1. 反射性 XSS 攻擊(非持久性 XSS 攻擊):

漏洞產生的原因是攻擊者注入的數據反映在響應中。一個典型的非持久性XSS攻擊包含一個帶XSS攻擊向量的鏈接(即每次攻擊需要用戶的點擊),例如,正常發送消息:

http://www.test.com/message.php?send=Hello,World!

接收者將會接收信息并顯示Hello,World;但是,非正常發送消息:

http://www.test.com/message.php?send=<script>alert(‘foolish!’)</script>!

接收者接收消息顯示的時候將會彈出警告窗口!

    1. 持久性XSS攻擊 (留言板場景):

XSS攻擊向量(一般指XSS攻擊代碼)存儲在網站數據庫,當一個頁面被用戶打開的時候執行。也就是說,每當用戶使用瀏覽器打開指定頁面時,腳本便執行。與非持久性XSS攻擊相比,持久性XSS攻擊危害性更大。從名字就可以了解到,持久性XSS攻擊就是將攻擊代碼存入數據庫中,然后客戶端打開時就執行這些攻擊代碼。

例如,留言板表單中的表單域:

<input type=“text” name=“content” value=“這里是用戶填寫的數據”>

正常操作流程是:用戶是提交相應留言信息 —— 將數據存儲到數據庫 —— 其他用戶訪問留言板,應用去數據并顯示;而非正常操作流程是攻擊者在value填寫:

<script>alert(‘foolish!’);</script> <!--或者html其他標簽(破壞樣式)、一段攻擊型代碼-->

并將數據提交、存儲到數據庫中;當其他用戶取出數據顯示的時候,將會執行這些攻擊性代碼。

(4). 修復漏洞方針:

漏洞產生的根本原因是 太相信用戶提交的數據,對用戶所提交的數據過濾不足所導致的,因此解決方案也應該從這個方面入手,具體方案包括:

  • 將重要的cookie標記為http only, 這樣的話Javascript 中的document.cookie語句就不能獲取到cookie了(如果在cookie中設置了HttpOnly屬性,那么通過js腳本將無法讀取到cookie信息,這樣能有效的防止XSS攻擊);

  • 表單數據規定值的類型,例如:年齡應為只能為int、name只能為字母數字組合。。。。

  • 對數據進行Html Encode 處理

  • 過濾或移除特殊的Html標簽,例如: <script>, <iframe> , < for <, > for>, &quot for

  • 過濾JavaScript 事件的標簽,例如 “onclick=”, “onfocus” 等等。

需要注意的是,在有些應用中是允許html標簽出現的,甚至是javascript代碼出現。因此,我們在過濾數據的時候需要仔細分析哪些數據是有特殊要求(例如輸出需要html代碼、javascript代碼拼接、或者此表單直接允許使用等等),然后區別處理!


20)OSI 網絡體系結構與 TCP/IP 協議模型

答:OSI 是一個理論上的網絡通信模型,而 TCP/IP 則是實際上的網絡通信標準。但是,它們的初衷是一樣的,都是為了使得兩臺計算機能夠像兩個知心朋友那樣能夠互相準確理解對方的意思并做出優雅的回應。現在,我們對 OSI 七層模型的各層進行簡要的介紹:


1). 物理層

參考模型的最低層,也是OSI模型的第一層,實現了相鄰計算機節點之間比特流的透明傳送,并盡可能地屏蔽掉具體傳輸介質和物理設備的差異,使其上層(數據鏈路層)不必關心網絡的具體傳輸介質。


2). 數據鏈路層(data link layer)

接收來自物理層的位流形式的數據,并封裝成幀,傳送到上一層;同樣,也將來自上層的數據幀,拆裝為位流形式的數據轉發到物理層。這一層在物理層提供的比特流的基礎上,通過差錯控制、流量控制方法,使有差錯的物理線路變為無差錯的數據鏈路,即提供可靠的通過物理介質傳輸數據的方法。


3). 網絡層

將網絡地址翻譯成對應的物理地址,并通過路由選擇算法為分組通過通信子網選擇最適當的路徑。


4). 傳輸層(transport layer)

在源端與目的端之間提供可靠的透明數據傳輸,使上層服務用戶不必關系通信子網的實現細節。在協議棧中,傳輸層位于網絡層之上,傳輸層協議為不同主機上運行的進程提供邏輯通信,而網絡層協議為不同主機提供邏輯通信,如下圖所示。

實際上,網絡層可以看作是傳輸層的一部分,其為傳輸層提供服務。但對于終端系統而言,網絡層對它們而言是透明的,它們知道傳輸層的存在,也就是說,在邏輯上它們認為是傳輸層為它們提供了端對端的通信,這也是分層思想的妙處。


5). 會話層(Session Layer)

會話層是OSI模型的第五層,是用戶應用程序和網絡之間的接口,負責在網絡中的兩節點之間建立、維持和終止通信。


6). 表示層(Presentation Layer):數據的編碼,壓縮和解壓縮,數據的加密和解密

表示層是OSI模型的第六層,它對來自應用層的命令和數據進行解釋,以確保一個系統的應用層所發送的信息可以被另一個系統的應用層讀取。


7). 應用層(Application layer):為用戶的應用進程提供網絡通信服務


21)網絡層的 ARP 協議工作原理?

答:地址解析協議(ARP) 是通過解析網路層地址來找尋數據鏈路層地址的一個在網絡協議包中極其重要的網絡傳輸協議。

網絡層的ARP協議完成了IP地址與物理地址的映射。首先,每臺主機都會在自己的ARP緩沖區中建立一個ARP列表,以表示IP地址和MAC地址的對應關系。當源主機需要將一個數據包要發送到目的主機時,會首先檢查自己ARP列表中是否存在該IP地址對應的MAC地址:如果有,就直接將數據包發送到這個MAC地址;如果沒有,就向本地網段發起一個ARP請求的廣播包,查詢此目的主機對應的MAC地址。此ARP請求數據包里包括源主機的IP地址、硬件地址、以及目的主機的IP地址。網絡中所有的主機收到這個ARP請求后,會檢查數據包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此數據包;如果相同,該主機首先將發送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已經存在該IP的信息,則將其覆蓋,然后給源主機發送一個ARP響應數據包,告訴對方自己是它需要查找的MAC地址;源主機收到這個ARP響應數據包后,將得到的目的主機的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息開始數據的傳輸。如果源主機一直沒有收到ARP響應數據包,表示ARP查詢失敗。


22)IP地址的分類

答:整個的因特網就是一個單一的、抽象的網絡。IP 地址就是給因特網上的每一個主機(或路由器)的每一個接口分配一個在全世界范圍是唯一的 32 位標識符,它是一個邏輯地址,用以屏蔽掉物理地址的差異。IP地址編址方案將IP地址空間劃分為A、B、C、D、E五類,其中A、B、C是基本類,D、E類作為多播和保留使用,為特殊地址。

每個IP地址包括兩個標識碼(ID),即網絡ID和主機ID。同一個物理網絡上的所有主機都使用同一個網絡ID,網絡上的一個主機(包括網絡上工作站,服務器和路由器等)有一個主機ID與其對應。A~E類地址的特點如下:

  • A類地址:以0開頭,第一個字節范圍:0~127;
  • B類地址:以10開頭,第一個字節范圍:128~191;
  • C類地址:以110開頭,第一個字節范圍:192~223;
  • D類地址:以1110開頭,第一個字節范圍為224~239;
  • E類地址:以1111開頭,保留地址

1). A類地址:1字節的網絡地址 + 3字節主機地址,網絡地址的最高位必須是“0”

一個A類IP地址是指, 在IP地址的四段號碼中,第一段號碼為網絡號碼,剩下的三段號碼為本地計算機的號碼。如果用二進制表示IP地址的話,A類IP地址就由1字節的網絡地址和3字節主機地址組成,網絡地址的最高位必須是“0”。A類IP地址中網絡的標識長度為8位,主機標識的長度為24位,A類網絡地址數量較少,有126個網絡,每個網絡可以容納主機數達1600多萬臺。

A類IP地址的地址范圍1.0.0.0到127.255.255.255(二進制表示為:00000001 00000000 00000000 00000000 - 01111110 11111111 11111111 11111111),最后一個是廣播地址。A類IP地址的子網掩碼為255.0.0.0,每個網絡支持的最大主機數為256的3次方-2=16777214臺。


2). B類地址: 2字節的網絡地址 + 2字節主機地址,網絡地址的最高位必須是“10”

一個B類IP地址是指,在IP地址的四段號碼中,前兩段號碼為網絡號碼。如果用二進制表示IP地址的話,B類IP地址就由2字節的網絡地址和2字節主機地址組成,網絡地址的最高位必須是“10”。B類IP地址中網絡的標識長度為16位,主機標識的長度為16位,B類網絡地址適用于中等規模的網絡,有16384個網絡,每個網絡所能容納的計算機數為6萬多臺。

B類IP地址地址范圍128.0.0.0-191.255.255.255(二進制表示為:10000000 00000000 00000000 00000000—-10111111 11111111 11111111 11111111),最后一個是廣播地址。B類IP地址的子網掩碼為255.255.0.0,每個網絡支持的最大主機數為256的2次方-2=65534臺。


3). C類地址: 3字節的網絡地址 + 1字節主機地址,網絡地址的最高位必須是“110”

一個C類IP地址是指,在IP地址的四段號碼中,前三段號碼為網絡號碼,剩下的一段號碼為本地計算機的號碼。如果用二進制表示IP地址的話,C類IP地址就由3字節的網絡地址和1字節主機地址組成,網絡地址的最高位必須是“110”。C類IP地址中網絡的標識長度為24位,主機標識的長度為8位,C類網絡地址數量較多,有209萬余個網絡。適用于小規模的局域網絡,每個網絡最多只能包含254臺計算機。

C類IP地址范圍192.0.0.0-223.255.255.255(二進制表示為: 11000000 00000000 00000000 00000000 - 11011111 11111111 11111111 11111111)。C類IP地址的子網掩碼為255.255.255.0,每個網絡支持的最大主機數為256-2=254臺。


4). D類地址:多播地址,用于1對多通信,最高位必須是“1110”

D類IP地址在歷史上被叫做多播地址(multicast address),即組播地址。在以太網中,多播地址命名了一組應該在這個網絡中應用接收到一個分組的站點。多播地址的最高位必須是“1110”,范圍從224.0.0.0到239.255.255.255。


5). E類地址:為保留地址,最高位必須是“1111”


23)IP地址與物理地址

答:物理地址是數據鏈路層和物理層使用的地址,IP地址是網絡層和以上各層使用的地址,是一種邏輯地址,其中ARP協議用于IP地址與物理地址的對應。


24)影響網絡傳輸的因素有哪些?

答:將一份數據從一個地方正確地傳輸到另一個地方所需要的時間我們稱之為響應時間。影響這個響應時間的因素有很多。

  • 網絡帶寬:所謂帶寬就是一條物理鏈路在 1s 內能夠傳輸的最大比特數,注意這里是比特(bit)而不是字節數,也就是 b/s 。網絡帶寬肯定是影響數據傳輸的一個關鍵環節,因為在當前的網絡環境中,平均網絡帶寬只有 1.7 MB/s 左右。

  • 傳輸距離:也就是數據在光纖中要走的距離,雖然光的傳播速度很快,但也是有時間的,由于數據在光纖中的移動并不是走直線的,會有一個折射率,所以大概是光的 2/3,這個時間也就是我們通常所說的傳輸延時。傳輸延時是一個無法避免的問題,例如,你要給在杭州和青島的兩個機房的一個數據庫進行同步數據操作,那么必定會存在約 30ms 的一個延時。

  • TCP 擁塞控制:我們知道 TCP 傳輸是一個 “停-等-停-等” 的協議,傳輸方和接受方的步調要一致,要達到步調一致就要通過擁塞控制來調節。TCP 在傳輸時會設定一個 “窗口”,這個窗口的大小是由帶寬和 RTT(Round-Trip Time,數據在兩端的來回時間,也就是響應時間)決定的。計算的公式是帶寬(b/s)xRTT(s)。通過這個值就可以得出理論上最優的 TCP 緩沖區的大小。Linux 2.4 已經可以自動地調整發送端的緩沖區的大小,而到 Linux 2.6.7 時接收端也可以自動調整了。


歡迎轉載,轉載請注明出處!
簡書ID:@我沒有三顆心臟
github:wmyskxz
歡迎關注公眾微信號:wmyskxz_javaweb
分享自己的Java Web學習之路以及各種Java學習資料

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,953評論 2 373

推薦閱讀更多精彩內容

  • 計算機網絡概述 網絡編程的實質就是兩個(或多個)設備(例如計算機)之間的數據傳輸。 按照計算機網絡的定義,通過一定...
    蛋炒飯_By閱讀 1,235評論 0 10
  • 網絡編程 網絡編程對于很多的初學者來說,都是很向往的一種編程技能,但是很多的初學者卻因為很長一段時間無法進入網絡編...
    程序員歐陽閱讀 2,034評論 1 37
  • Socket編程 1基礎知識 協議 端口號(辨別不同應用) TCP/IP協議 是目前世界上應用最廣泛的協議是以TC...
    __豆約翰__閱讀 1,100評論 0 3
  • 1. 基礎知識 1.1 3種常見的計算機體系結構劃分 OSI分層(7層):物理層、數據鏈路層、網絡層、傳輸層、會話...
    Mr希靈閱讀 19,927評論 6 120
  • 石板路上落新泥, 一直紅梅空凋零, 遠來鞋履是否有書信; 杳杳,缺了筆墨間的調皮氣息; 夜色涼 寒風起; 離路人,...
    繁華落盡之墨香閱讀 487評論 1 1