計算機網路常見面試題二
參考
網路程式設計釋疑之:TCP連線拔掉網線後會發生什麼 Tcp程式設計常見問題及解決方法總結(粘包,拆包) netty4粘包/拆包/斷包 解決方案 TCP粘包問題分析和解決(全) https://www.nowcoder.com/discuss/393011?type=all&order=time&pos=&page=2&channel= 抓包工具tcpdump用法說明1、OSI七層模型:
物理層、資料鏈路層、網路層、傳輸層、會話層、表示層和應用層。2、TCP/IP五層網路模型
物理層,資料鏈路層,網路層,傳輸層,應用層3、TCP/IP四層網路模型
物理介面層,網路層,運輸層,應用層4、問了tcp拔掉網線之後還需要重連嗎
如果網線斷開的時間很長,超出了SO_KEEPALIVE設定的探測時間間隔,或者兩端期間在此有了任何針對此長連線的網路操作。當連上網線時就會出現ETIMEDOUT或者ECONNRESET的錯誤。你必須重新建立一個新的長連線進行網路操作。 所以關鍵是速度要快,只要重連的速度夠快,伺服器就發現不了你斷開了連線 參考:網路程式設計釋疑之:TCP連線拔掉網線後會發生什麼
5、TCP的粘包問題怎麼解決的,使用的字串存下來的,怎麼區分兩個包
(1)TCP為了保證可靠傳輸,儘量減少額外開銷(每次發包都要驗證),因此採用了流式傳輸,面向流的傳輸,相對於面向訊息的傳輸,可以減少傳送包的數量,從而減少了額外開銷。但是,對於資料傳輸頻繁的程式來講,使用TCP可能會容易粘包。當然,對接收端的程式來講,如果機器負荷很重,也會在接收緩衝裡粘包。這樣,就需要接收端額外拆包,增加了工作量。因此,這個特別適合的是資料要求可靠傳輸,但是不需要太頻繁傳輸的場合(兩次操作間隔100ms,具體是由TCP等待發送間隔決定的,取決於核心中的socket的寫法)
(2)UDP,由於面向的是訊息傳輸,它把所有接收到的訊息都掛接到緩衝區的接受佇列中,因此,它對於資料的提取分離就更加方便,但是,它沒有粘包機制,因此,當傳送資料量較小的時候,就會發生資料包有效載荷較小的情況,也會增加多次傳送的系統傳送開銷(系統呼叫,寫硬體等)和接收開銷。因此,應該
粘包出現原因
簡單得說,在流傳輸中出現,UDP不會出現粘包,因為它有訊息邊界(參考Windows網路程式設計)
1.TCP為提高傳輸效率,傳送端需要等緩衝區滿才傳送出去,造成粘包
2.接收方不及時接收緩衝區的包,造成多個包接收
粘包情況有兩種,一種是粘在一起的包都是完整的資料包,另一種情況是粘在一起的包有不完整的包。
不是所有的粘包現象都需要處理,若傳輸的資料為不帶結構的連續流資料(如檔案傳輸),則不必把粘連的包分開(簡稱分包)。但在實際工程應用中,傳輸的資料一般為帶結構的資料,這時就需要做分包處理。
封包
封包就是給一段資料加上包頭,這樣一來資料包就分為包頭和包體兩部分內容了(以後講過濾非法包時封包會加入"包尾"內容)。包頭其實上是個大小固定的結構體,其中有個結構體成員變量表示包體的長度,這是個很重要的變數,其他的結構體成員可根據需要自己定義。根據包頭長度固定以及包頭中含有包體長度的變數就能正確的拆分出一個完整的資料包。
拆包
利用底層的緩衝區來進行拆包
由於TCP也維護了一個緩衝區,所以我們完全可以利用TCP的緩衝區來快取我們的資料,這樣一來就不需要為每一個連線分配一個緩衝區了。另一方面我們知道recv或者wsarecv都有一個引數,用來表示我們要接收多長長度的資料。利用這兩個條件我們就可以對第一種方法進行優化。
對於阻塞SOCKET來說,我們可以利用一個迴圈來接收包頭長度的資料,然後解析出代表包體長度的那個變數,再用一個迴圈來接收包體長度的資料。
粘包問題的解決策略
由於底層的TCP無法理解上層的業務資料,所以在底層是無法保證資料包不被拆分和重組的,這個問題只能通過上層的應用協議棧設計來解決。業界的主流協議的解決方案,可以歸納如下:
1. TCP提供了強制資料立即傳送的操作指令push,TCP軟體收到該操作指令後,就立即將本段資料傳送出去,而不必等待發送緩衝區滿;
2. 傳送固定長度的訊息,報文大小固定長度,例如每個報文的長度固定為200位元組,如果不夠空位補空格;
3. 把訊息的大小與訊息一塊傳送,接收對等方先接收包體長度,依據包體長度來接收包體
4. 雙方約定每次傳送的大小
5. 雙方約定使用特殊標記來區分訊息間隔,例如每條報文結束都添加回車換行符(例如FTP協議)或者指定特殊字元作為報文分隔符,接收方通過特殊分隔符切分報文區分;
6. 標準協議按協議規則處理,如Sip協議
參考:
Tcp程式設計常見問題及解決方法總結(粘包,拆包) netty4粘包/拆包/斷包 解決方案 TCP粘包問題分析和解決(全)6、如果cookie被禁用了,怎麼使用session
1. 經常被使用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的後面。2. 還有一種技術叫做表單隱藏欄位。就是伺服器會自動修改form表單,新增一個隱藏欄位,以便在表單提交時能夠把session id傳遞迴伺服器。比如:
<form name=”"testform”" action=”"/xxx”"> <input type=”"hidden”" name=”"jsessionid”" value=”"ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764″”/> <input type=”"text”"> </form>參考:cookie被禁止後怎樣使用session的解決方案
7、怎麼把專案部署到雲伺服器上,說一下流程
安裝JDK,TomCat, MySQL, Niginx, 然後匯出sql資料,用MySQL執行,將專案打包成war包放到tomcat的webapp目錄下,配置Nginx,開啟瀏覽器即可訪問8、是使用IP加埠號直接訪問的嗎,如果埠號被禁用了怎麼辦
修改tomcat的配置檔案,把8080修改為80,因為80是Http的埠,一定不會被禁用,修改後可以直接通過ip將專案名即可訪問,因為瀏覽器的預設埠號是809、HTTP劫持
在正常的資料流中插入特定的網路資料報文,讓客戶端解釋錯誤的資料,並以彈出新視窗的形式向使用者展示小廣告或網頁內容
步驟:
在TCP連線中標識HTTP協議連結;
改HTTP響應體;
將篡改後的資料包搶先回發到使用者,這樣後面的資料包在到達後會被直接丟棄。而客戶端顯示改後的網頁
防範:
事前加密:HTTPS,防止明文傳輸被挾持,(但防不了DNS挾持)
事中加密:拆分HTTP請求資料包,運營商的旁路裝置沒有完整的TCP/IP協議棧,不能標記,web伺服器有完整的TCP/IP協議棧,能把接收到的資料包拼成完整的HTTP請求,不影響服務
事後遮蔽:前端顯示HTTP時對內容進行檢測,在DOM結構發生變化時觸發回撥
DNS劫持:通過劫持DNS伺服器,獲得某域名的解析記錄控制權,修改此域名的解析結果。把原來對A域名的訪問轉入B域名,返回錯誤的查詢結果。可能是一些產品的持續的推廣
區別:DNS劫持傾向於持續性,訪問一個介面時強行推送廣告,HTTP劫持頻率多變,劫持過程也非常快,一般多出現於網站小尾巴
HTTPS挾持:偽造證書來進行挾持….
10、跨域
跨域,指的是瀏覽器不能執行其他網站的指令碼。它是由瀏覽器的同源策略造成的,是瀏覽器施加的安全限制。
同源:域名,協議,埠均相同
即瀏覽器只能執行相同協議、相同域名、相同埠下的網站指令碼,執行的時候如果網站的指令碼不屬於現在這個介面,就不會執行
連結:https://www.nowcoder.com/discuss/393011?type=all&order=time&pos=&page=2&channel=
11、HTTP請求響應中斷原因
網斷了,網路阻塞,請求超時,瀏覽器出問題,伺服器出問
12、ipv4和ipv6的轉換。ipv4到ipv6的過渡手段
ipv4和ipv6的過渡是一個循序漸進的過程,在使用者體驗IPv6帶來的好處的同時仍能與網路中其餘的IPv4使用者通訊。
主流技術:1.雙棧策略:(最直接方式)在IPv6結點中加入IPv4協議棧。這種具有雙協議棧的結點稱作“IPv6/v4結點”,這些結點可以使用IPv4與IPv4結點互通,也可以直接使用IPv6與IPv6結點互通。
2.隧道技術:(為解決區域性純IPv6網路與IPv4骨幹隔離形成的孤島問題,用隧道技術的方式解決)利用穿越現存IPv4網際網路的隧道技術將孤島連線起來,逐步擴大IPv6的實現範圍。在隧道的入口處,路由器將IPv6的陣列分組封裝進入IPv4中,IPV4分組的源地址和目的地址分別是隧道入口和出口的IPV4地址。在隧道的出口處再將IPV6分組取出轉發給目的節點。
隧道技術在實踐中有四種具體形式:構造隧道、自動配置隧道、組播隧道以及6to4。
3.隧道代理TB,Tunnel Broker。(目的是簡化隧道的配置,提供自動的配置手段),TB可以看作是一個虛擬的IPv6 ISP,它為已經連線到IPv4網路上的使用者提供連線到IPv6網路的手段,而連線到IPv4網路上的使用者就是TB的客戶。
4.協議轉換技術。其主要思想是在V6節點與V4節點的通訊時需藉助於中間的協議轉換伺服器,此協議轉換伺服器的主要功能是把網路層協議頭進行V6/V4間的轉換,以適應對端的協議型別。
5. SOCKS64。
在客戶端裡引入SOCKS庫,它處於應用層和socket之間,對應用層的socket API和DNS域名解析API進行替換。
另一種是SOCKS閘道器。
6.傳輸層中繼
與SOCKS64的工作機理相似,只不過是在傳輸層中繼器進行傳輸層的“協議翻譯”
7.應用層代理閘道器(ALG)
類似。在應用層進行協議翻譯。
13、網頁卡頓原因
網速慢、頻寬不足、硬體配置低、記憶體被佔滿。
JS指令碼過大,阻塞了頁面的載入。
網頁資源過多、接受資料時間長、載入某個資源慢。
DNS解析速度。
一般怎麼檢查
硬體問題:檢查網線或者無限網絡卡有沒有插好,有沒有連上路由器,就是底層是不是聯通狀態;
軟體問題:檢視是否有對應的驅動,伺服器好不好,DNS對不對,或者可能是代理沒關
當網頁載入很慢的時候,應如何分析其原因並解決問題?
http請求次數太多
資源過大,資源過多
JS指令碼過大
網速慢
14、抓包工具tcpdump用法說明
tcpdump採用命令列方式對介面的資料包進行篩選抓取,其豐富特性表現在靈活的表示式上。不帶任何選項的tcpdump,預設會抓取第一個網路介面,且只有將tcpdump程序終止才會停止抓包。所以常用的選項也就這幾個:
- tcpdump -D
- tcpdump -c num -i int -nn -XX -vvv
-D:列出可用於抓包的介面。將會列出介面的數值編號和介面名,它們都可以用於"-i"後。
-c:指定要抓取的包數量。
-i interface:指定tcpdump需要監聽的介面。
-n:對地址以數字方式顯式,否則顯式為主機名,也就是說-n選項不做主機名解析。 -nn:除了-n的作用外,還把埠顯示為數值,否則顯示埠服務名。
-X:輸出包的頭部資料,會以16進位制和ASCII兩種方式同時輸出。
-XX:輸出包的頭部資料,會以16進位制和ASCII兩種方式同時輸出,更詳細。
-v:當分析和列印的時候,產生詳細的輸出。 -vv:產生比-v更詳細的輸出。 -vvv:產生比-vv更詳細的輸出。
參考:抓包工具tcpdump用法說明