Java面试中常问的计算机网络方面问题
GET 和 POST 區(qū)別
(GET)請注意,查詢字符串(名稱/值對)是在 GET 請求的 URL 中發(fā)送的:/test/demo_form.asp?name1=value1&name2=value2
GET 請求可被緩存
GET 請求保留在瀏覽器歷史記錄中
GET 請求可被收藏為書簽
GET 請求不應(yīng)在處理敏感數(shù)據(jù)時(shí)使用
GET 請求有長度限制
GET 請求只應(yīng)當(dāng)用于取回?cái)?shù)據(jù)
POST 方法(POST)
請注意,查詢字符串(名稱/值對)是在 POST 請求的 HTTP 消息主體中發(fā)送的:POST /test/demo_form.asp HTTP/1.1 Host: w3schools.com? name1=value1&name2=value2
POST 請求不會被緩存
POST 請求不會保留在瀏覽器歷史記錄中
POST 不能被收藏為書簽
POST 請求對數(shù)據(jù)長度沒有要求
dns使用的協(xié)議
既使用TCP又使用UDP
- 首先了解一下TCP與UDP傳送字節(jié)的長度限制:
- 區(qū)域傳送時(shí)使用TCP,主要有一下兩點(diǎn)考慮:
- 域名解析時(shí)使用UDP協(xié)議:
冪等
一個(gè)冪等操作的特點(diǎn)是其任意多次執(zhí)行所產(chǎn)生的影響均與一次執(zhí)行的影響相同。冪等函數(shù),或冪等方法,是指可以使用相同參數(shù)重復(fù)執(zhí)行,并能獲得相同結(jié)果的函數(shù)。這些函數(shù)不會影響系統(tǒng)狀態(tài),也不用擔(dān)心重復(fù)執(zhí)行會對系統(tǒng)造成改變。例如,“getUsername()和setTrue()”函數(shù)就是一個(gè)冪等函數(shù).
Cookies和session區(qū)別
Cookies是一種能夠讓網(wǎng)站服務(wù)器把少量數(shù)據(jù)儲存到客戶端的硬盤或內(nèi)存,或是從客戶端的硬盤讀取數(shù)據(jù)的一種技術(shù)。Cookies是當(dāng)你瀏覽某網(wǎng)站時(shí),由Web服務(wù)器置于你硬盤上的一個(gè)非常小的文本文件,它可以記錄你的用戶ID、密碼、瀏覽過的網(wǎng)頁、停留的時(shí)間等信息。session: 當(dāng)用戶請求來自應(yīng)用程序的 Web 頁時(shí),如果該用戶還沒有會話,則 Web 服務(wù)器將自動創(chuàng)建一個(gè) Session 對象。當(dāng)會話過期或被放棄后,服務(wù)器將終止該會話。cookie機(jī)制:采用的是在客戶端保持狀態(tài)的方案,而session機(jī)制采用的是在服務(wù)端保持狀態(tài)的方案。同時(shí)我們看到由于服務(wù)器端保持狀態(tài)的方案在客戶端也需要保存一個(gè)標(biāo)識,所以session機(jī)制可能需要借助cookie機(jī)制來達(dá)到保存標(biāo)識的目的。
Session是服務(wù)器用來跟蹤用戶的一種手段,每個(gè)Session都有一個(gè)唯一標(biāo)識:session ID。當(dāng)服務(wù)器創(chuàng)建了Session時(shí),給客戶端發(fā)送的響應(yīng)報(bào)文包含了Set-cookie字段,其中有一個(gè)名為sid的鍵值對,這個(gè)鍵值Session ID。客戶端收到后就把Cookie保存瀏覽器,并且之后發(fā)送的請求報(bào)表都包含SessionID。HTTP就是通過Session和Cookie這兩個(gè)發(fā)送一起合作來實(shí)現(xiàn)跟蹤用戶狀態(tài),Session用于服務(wù)端,Cookie用于客戶端
TCP粘包和拆包產(chǎn)生的原因
TCP粘包和拆包的解決策略
三次握手
第一次握手:建立連接時(shí),客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);
第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手。
完成三次握手,客戶端與服務(wù)器開始傳送數(shù)據(jù)
四次揮手
TIME_WAIT的狀態(tài)就是主動斷開的一方(這里是客戶端),發(fā)送完最后一次ACK之后進(jìn)入的狀態(tài)。并且持續(xù)時(shí)間還挺長的。客戶端TIME_WAIT持續(xù)2倍MSL時(shí)長,在linux體系中大概是60s,轉(zhuǎn)換成CLOSE狀態(tài)
TIME_WAIT
TIME_WAIT 是主動關(guān)閉鏈接時(shí)形成的,等待2MSL時(shí)間,約4分鐘。主要是防止最后一個(gè)ACK丟失。 由于TIME_WAIT 的時(shí)間會非常長,因此server端應(yīng)盡量減少主動關(guān)閉連接
CLOSE_WAIT
CLOSE_WAIT是被動關(guān)閉連接是形成的。根據(jù)TCP狀態(tài)機(jī),服務(wù)器端收到客戶端發(fā)送的FIN,則按照TCP實(shí)現(xiàn)發(fā)送ACK,因此進(jìn)入CLOSE_WAIT狀態(tài)。但如果服務(wù)器端不執(zhí)行close(),就不能由CLOSE_WAIT遷移到LAST_ACK,則系統(tǒng)中會存在很多CLOSE_WAIT狀態(tài)的連接。此時(shí),可能是系統(tǒng)忙于處理讀、寫操作,而未將已收到FIN的連接,進(jìn)行close。此時(shí),recv/read已收到FIN的連接socket,會返回0。
為什么需要 TIME_WAIT 狀態(tài)?
假設(shè)最終的ACK丟失,server將重發(fā)FIN,client必須維護(hù)TCP狀態(tài)信息以便可以重發(fā)最終的ACK,否則會發(fā)送RST,結(jié)果server認(rèn)為發(fā)生錯(cuò)誤。TCP實(shí)現(xiàn)必須可靠地終止連接的兩個(gè)方向(全雙工關(guān)閉),client必須進(jìn)入 TIME_WAIT 狀態(tài),因?yàn)閏lient可能面 臨重發(fā)最終ACK的情形。
為什么 TIME_WAIT 狀態(tài)需要保持 2MSL 這么長的時(shí)間?
如果 TIME_WAIT 狀態(tài)保持時(shí)間不足夠長(比如小于2MSL),第一個(gè)連接就正常終止了。第二個(gè)擁有相同相關(guān)五元組的連接出現(xiàn),而第一個(gè)連接的重復(fù)報(bào)文到達(dá),干擾了第二個(gè)連接。TCP實(shí)現(xiàn)必須防止某個(gè)連接的重復(fù)報(bào)文在連接終止后出現(xiàn),所以讓TIME_WAIT狀態(tài)保持時(shí)間足夠長(2MSL),連接相應(yīng)方向上的TCP報(bào)文要么完全響應(yīng)完畢,要么被 丟棄。建立第二個(gè)連接的時(shí)候,不會混淆。
TIME_WAIT 和CLOSE_WAIT狀態(tài)socket過多
如果服務(wù)器出了異常,百分之八九十都是下面兩種情況:
1.服務(wù)器保持了大量TIME_WAIT狀態(tài)
2.服務(wù)器保持了大量CLOSE_WAIT狀態(tài),簡單來說CLOSE_WAIT數(shù)目過大是由于被動關(guān)閉連接處理不當(dāng)導(dǎo)致的。
一次完整的HTTP請求過程
域名解析 --> 發(fā)起TCP的3次握手 --> 建立TCP連接后發(fā)起http請求 --> 服務(wù)器響應(yīng)http請求,瀏覽器得到html代碼 --> 瀏覽器解析html代碼,并請求html代碼中的資源(如js、css、圖片等) --> 瀏覽器對頁面進(jìn)行渲染呈現(xiàn)給用戶
講一下長連接
- 一、基于http協(xié)議的長連接
- http1.0請求與服務(wù)端的交互過程:
- 二、發(fā)心跳包。每隔幾秒就發(fā)一個(gè)數(shù)據(jù)包過去
TCP如何保證可靠傳輸?
詳細(xì)介紹http
HTTP協(xié)議是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫,是用于從萬維網(wǎng)(WWW:World Wide Web )服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議。
特點(diǎn)
簡單快速:客戶向服務(wù)器請求服務(wù)時(shí),只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同。由于HTTP協(xié)議簡單,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快。
靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對象。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。
無連接:無連接的含義是限制每次連接只處理一個(gè)請求。服務(wù)器處理完客戶的請求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時(shí)間。
無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。
支持B/S及C/S模式。
請求消息Request
響應(yīng)消息Response
狀態(tài)碼
- 200 OK //客戶端請求成功
- 301 Moved Permanently //永久重定向,使用域名跳轉(zhuǎn)
- 302 Found // 臨時(shí)重定向,未登陸的用戶訪問用戶中心重定向到登錄頁面
- 400 Bad Request //客戶端請求有語法錯(cuò)誤,不能被服務(wù)器所理解
- 401 Unauthorized //請求未經(jīng)授權(quán),這個(gè)狀態(tài)代碼必須和WWW-Authenticate報(bào)頭域一起使用
- 403 Forbidden //服務(wù)器收到請求,但是拒絕提供服務(wù)
- 404 Not Found //請求資源不存在,eg:輸入了錯(cuò)誤的URL
- 500 Internal Server Error //服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤
- 503 Server Unavailable //服務(wù)器當(dāng)前不能處理客戶端的請求,一段時(shí)間后可能恢復(fù)正常
http的方法
URI和URL的區(qū)別
URI,是uniform resource identifier,統(tǒng)一資源標(biāo)識符,用來唯一的標(biāo)識一個(gè)資源。Web上可用的每種資源如HTML文檔、圖像、視頻片段、程序等都是一個(gè)來URI來定位的
URI一般由三部組成:
URL是uniform resource locator,統(tǒng)一資源定位器,它是一種具體的URI,即URL可以用來標(biāo)識一個(gè)資源,而且還指明了如何locate這個(gè)資源。URL是Internet上用來描述信息資源的字符串,主要用在各種WWW客戶程序和服務(wù)器程序上,特別是著名的Mosaic。采用URL可以用一種統(tǒng)一的格式來描述各種信息資源,包括文件、服務(wù)器的地址和目錄等。
URL一般由三部組成:
HTTPS和HTTP的區(qū)別
https是如何保證數(shù)據(jù)傳輸?shù)陌踩?/h2>
https實(shí)際就是在TCP層與http層之間加入了SSL/TLS來為上層的安全保駕護(hù)航,主要用到對稱加密、非對稱加密、證書,等技術(shù)進(jìn)行客戶端與服務(wù)器的數(shù)據(jù)加密傳輸,最終達(dá)到保證整個(gè)通信的安全性。
- SSL/TLS協(xié)議作用:
總結(jié)
以上是生活随笔為你收集整理的Java面试中常问的计算机网络方面问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot 2.x 启动全过
- 下一篇: 史上最全Java多线程面试题及答案